Uso una libreria di terze parti. Mi hanno passato un POJO che, a nostro avviso, è probabilmente implementato in questo modo:
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.
}
Per molti motivi, incluso ma non limitato a incapsulare la loro API e facilitare i test delle unità, voglio avvolgere i loro dati. Ma non voglio che le mie classi principali siano dipendenti dai loro dati (di nuovo, per ragioni di test)! Quindi adesso ho qualcosa di simile a questo:
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;
}
}
E poi questo:
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();
);
}
}
Questa classe dell'adattatore è accoppiata con le altre poche classi che DEVONO conoscere l'API di terze parti, limitando la sua pervasività attraverso il resto del mio sistema. Tuttavia ... questa soluzione è GROSS! In Codice pulito, pagina 40:
More than three arguments (polyadic) requires very special justification--and then shouldn't be used anyway.
Cose che ho considerato:
- Creazione di un oggetto factory anziché di un metodo helper statico
- Non risolve il problema di avere argomenti bajillion
- Creazione di una sottoclasse di DataTypeOne e DataTypeTwo con un costruttore dipendente
- Ha ancora un costruttore protetto poliadico
- Crea implementazioni completamente separate conformi alla stessa interfaccia
- Molteplici delle idee precedenti contemporaneamente
Come dovrebbe essere gestita questa situazione?
Nota questo non è un strato anti-corruzione situazione. Non c'è niente di sbagliato nella loro API. I problemi sono:
- Non voglio che le mie strutture dati abbiano
import com.third.party.library.SomeDataStructure;
- Non riesco a costruire le loro strutture dati nei miei casi di test
- La mia soluzione attuale si traduce in un numero di argomenti molto elevato. Voglio mantenere basso il conteggio degli argomenti, SENZA passare nelle loro strutture dati.
- La domanda è " che cos'è un livello anti corruzione?". La mia domanda è " come posso utilizzare un pattern, qualsiasi pattern, per risolvere questo scenario?"
Non sto nemmeno chiedendo il codice (altrimenti questa domanda sarebbe su SO), solo chiedendo abbastanza di una risposta per permettermi di scrivere il codice in modo efficace (che quella domanda non fornisce).