Ich benutze eine Drittanbieter-Bibliothek. Sie übergeben mir ein POJO , das nach unseren Absichten und Zwecken wahrscheinlich so implementiert wird:
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.
}
Aus vielen Gründen, einschließlich, aber nicht beschränkt auf das Einkapseln ihrer API und das Ermöglichen von Komponententests, möchte ich ihre Daten verpacken. Aber ich möchte nicht, dass meine Kernklassen von ihren Daten abhängig sind (auch hier aus Testgründen)! Im Moment habe ich so etwas:
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;
}
}
Und dann das:
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();
);
}
}
Diese Adapterklasse ist mit den wenigen anderen Klassen gekoppelt, die über die Drittanbieter-API Bescheid wissen MÜSSEN, wodurch ihre Verbreitung im Rest meines Systems eingeschränkt wird. Aber ... diese Lösung ist GROSS! In Clean Code, Seite 40:
Mehr als drei Argumente (polyadisch) bedürfen einer besonderen Begründung - und sollten dann sowieso nicht verwendet werden.
Dinge, über die ich nachgedacht habe:
- Erstellen eines Factory-Objekts anstelle einer statischen Hilfsmethode
- Löst nicht das Problem der Bajillion Argumente
- Erstellen einer Unterklasse von DataTypeOne und DataTypeTwo mit einem abhängigen Konstruktor
- Hat noch einen polyadengeschützten Konstruktor
- Erstellen Sie vollständig separate Implementierungen, die derselben Schnittstelle entsprechen
- Mehrere der oben genannten Ideen gleichzeitig
Wie soll mit dieser Situation umgegangen werden?
Beachten Sie, dass dies keine Antikorruptionssituation ist . Es ist nichts falsch mit ihrer API. Die Probleme sind:
- Ich möchte nicht, dass MEINE Datenstrukturen vorhanden sind
import com.third.party.library.SomeDataStructure;
- Ich kann ihre Datenstrukturen in meinen Testfällen nicht aufbauen
- Meine derzeitige Lösung führt zu sehr sehr hohen Argumentationszahlen. Ich möchte die Anzahl der Argumente niedrig halten, OHNE ihre Datenstrukturen weiterzugeben.
- Diese Frage lautet " Was ist eine Antikorruptionsschicht?". Meine Frage lautet: " Wie kann ich ein Muster oder ein beliebiges Muster verwenden, um dieses Szenario zu lösen?"
Ich frage auch nicht nach Code (ansonsten wäre diese Frage SO), sondern nur nach einer ausreichenden Antwort, damit ich den Code effektiv schreiben kann (was diese Frage nicht bietet).
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.