私が開発を支援しているプログラムは、動的に生成されたいくつかの質問を出力して、ユーザーが回答できるようにすることになっています。質問にはさまざまな種類がありConstraint
、ユーザーが指定した情報を入力する対応するクラスがあります。私の質問は、さまざまな制約に対して均一な動作を作成する方法です。
---->Constraint<--------------------
| | |
FConstraint PConstraint TConstraint
| |
UConstraint AConstraint
TConstraint と同様に、基本クラスConstraint
は空です。
UConstraint
、PConstraint
およびAConstraint
3 つの変数を共有します。ただし、UConstraint
持っていないAConstraint
追加の変数が 1 つあります。PConstraint
レンガの壁をハサミで叩こうとしているような気がします。私の考えの 1 つは、署名を使用して Constraint に抽象メソッドを提供することです。
// All answers are of type string.
abstract void setValue(string variable, string answer);
これはすべてのConstraint
サブクラスによって実装されます。ただし、設定する変数を決定するために文字列を渡すと、エラーが発生しやすく、同様に悪いコードの匂いがします。
2 番目のオプションは、3 つの同様の変数を Constraint に移動することでしたが、UConstraint, AConstraint
設定が必要な追加の情報が残ります。それらのいずれも必要としないことは役に立ちTConstraint
ません。
私の現在の強引な「このデザインをねじ込む」。解決策はinstanceof
、欠落している制約固有の情報を確認して入力するスープです。
Object constraint = item.getConstraint();
if (constraint instanceof AConstraint) {
AConstraint constraint = (AConstraint) constraint;
if (constraint.getValue() == null) {
constraint.setValue(string);
} else if (constraint.getKey() == null) {
constraint.setKey(string);
} // More of the same.
} else if (constraint instanceof PConstraint) {
// As the above if() group.
} // etc.
この設計には、抽象関数よりも優れたソリューションはありますか?