私と私の同僚の1は、次のような問題を解決しようとしていた。これはアンチパターンの例ですか?
は、私の同僚の 一つは、特定の一つから一つの特性をフェッチA. から一つの特定のプロパティを抽出する問題に直面していたクラスの例を取ることができますクラス(この場合はA)は簡単です。 には複数のクラス(A1、A2 ...)があると仮定し、これらのクラスのコレクションから特定のプロパティーを1つずつ取り出して、コードの再利用性を高めたいとします。
List<String> tempList = new ArrayList<>();
for(A a : listOfAInstances) {
tempList.add(a.getName());
}
return tempList;
を今、私は各クラスと異なる性質のためにこれをしなければならない複数のクラスが存在する場合:
例えば
public class A {
private String name;
.
.
.
}
List<String> listOfNames = createNameList(listOfAInstances);
createNameList()メソッドは、次のようになります。
- リフレクションベースのアプローチ: は、私は2つのアプローチを提案しました。
- "PropertyExtractable"というインターフェイスを作成し、そこにメソッド "extractProperty"を配置します。
以下に示すよう:このため
interface PropertyExtractable {
Object extractProperty();
}
public class A implements PropertyExtractable {
private String name;
.
.
.
public Object extractProperty() {
return this.name;
}
}
を私はその後、すなわちどこでも使用することができ、いくつかのユーティリティメソッドを書くことができます
public Object getPropertiesOfPropertyExtractable(PropertyExtractable prExtractable) {
return prExtractable.extractProperty();
}
これが背景だった、私の一つの他の同僚が持っていました2番目のアプローチについての別の意見は、彼はそれがアンチパターンのようだと私に言った。彼は私に説明しようとしましたが、私はそれを完全には得られなかったので、私はここで尋ねています。
この例をJavaのComparatorインターフェイスと比較しようとしています。 javaのように私たちはカスタムオブジェクトクラスのいずれかでComparatorを使用することができ、比較のロジックを定義することができます。なぜ抽出ロジックを定義できないのですか?
さらに多くのインターフェイスをこの方法で使用できます。私たちはそれを使用しないでください
私はこのアプローチがアンチパターンであることを知りたいですか?どうして?
私の最初の考えは、タイプセーフではないということでした。次に、異なるクラスのリストを持つことができれば、すでにそれらの共通インターフェースを持つ必要があります。そこに 'String getName()'を含めてみませんか? – Fildor
サンプルコードと "例えば"テキストがクラス名と一致すると、多くの手助けをします。 –
オーバーライドされたメソッドでより具体的な戻り値の型を使用できることを忘れないでください: 'A'の' public String extractProperty() '。それで 'A'への参照があれば、' String name = myA.extractProperty(); 'と書くことができます。これはキャストする必要はありません。 –