サードパーティのライブラリを使用しています。彼らは私たちの意図と目的のために、おそらく次のように実装されたPOJOを渡します:
public class OurData {
private String foo;
private String bar;
private String baz;
private String quux;
// A lot more than this
// IMPORTANT: NOTE THAT THIS IS A PACKAGE PRIVATE CONSTRUCTOR
OurData(/* I don't know what they do */) {
// some stuff
}
public String getFoo() {
return foo;
}
// etc.
}
APIのカプセル化や単体テストの促進など、さまざまな理由で、データをラップしたいと考えています。ただし、コアクラスがデータに依存することは望ましくありません(繰り返しますが、テストのため)。だから今、私はこのようなものを持っています:
public class DataTypeOne implements DataInterface {
private String foo;
private int bar;
private double baz;
public DataTypeOne(String foo, int bar, double baz) {
this.foo = foo;
this.bar = bar;
this.baz = baz;
}
}
public class DataTypeTwo implements DataInterface {
private String foo;
private int bar;
private double baz;
public DataTypeOne(String foo, int bar, double baz, String quux) {
this.foo = foo;
this.bar = bar;
this.baz = baz;
this.quux = quux;
}
}
そして、これ:
public class ThirdPartyAdapter {
public static makeMyData(OurData data) {
if(data.getQuux() == null) {
return new DataTypeOne(
data.getFoo(),
Integer.parseInt(data.getBar()),
Double.parseDouble(data.getBaz()),
);
} else {
return new DataTypeTwo(
data.getFoo(),
Integer.parseInt(data.getBar()),
Double.parseDouble(data.getBaz()),
data.getQuux();
);
}
}
このアダプタークラスは、サードパーティAPIについて知っている必要がある他のいくつかのクラスと結合されており、システムの残りの部分での普及を制限しています。しかし...このソリューションはグロスです!Clean Code、40ページで:
3つ以上の引数(polyadic)には非常に特別な正当化が必要です-とにかく使用すべきではありません。
私が検討したこと:
- 静的ヘルパーメソッドではなくファクトリオブジェクトを作成する
- 数え切れないほどの引数を持つ問題を解決しません
- 依存コンストラクタを持つDataTypeOneおよびDataTypeTwoのサブクラスを作成する
- ポリアド保護されたコンストラクターがまだあります
- 同じインターフェースに準拠する完全に別個の実装を作成する
- 上記のアイデアの複数
この状況はどのように処理する必要がありますか?
これは腐敗防止層ではないことに注意してください状況で。APIに問題はありません。問題は次のとおりです。
- 私のデータ構造にしたくない
import com.third.party.library.SomeDataStructure;
- テストケースでデータ構造を構築できません
- 私の現在のソリューションでは、非常に多くの引数が発生します。データ構造を渡さずに、引数の数を少なくしたい。
- その質問は「どのような反腐敗層です?」。私の質問は、「このシナリオを解決するために、パターンをどのように使用できますか?」です。
私もコードを求めていません(そうでなければ、この質問はSOになります)、コードを効果的に書くことができるように十分な答えを求めます(この質問は提供しません)。
The ideal number of arguments for a function is zero (niladic). Next comes one (monadic), followed closely by two (dyadic). Three arguments (triadic) should be avoided where possible. More than three (polyadic) requires very special justification — and then shouldn’t be used anyway.