Yo uso una biblioteca de terceros. Me pasan un POJO que, para nuestros propósitos y propósitos, probablemente se implementa de la siguiente manera:
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.
}
Por muchas razones, que incluyen, entre otras, encapsular su API y facilitar las pruebas unitarias, quiero ajustar sus datos. ¡Pero no quiero que mis clases principales dependan de sus datos (nuevamente, por razones de prueba)! Así que ahora tengo algo como esto:
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;
}
}
Y luego esto:
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();
);
}
}
Esta clase de adaptador se combina con las otras pocas clases que DEBEN conocer sobre la API de terceros, lo que limita su omnipresencia en el resto de mi sistema. Sin embargo ... ¡esta solución es BRUTA! En Clean Code, página 40:
Más de tres argumentos (poliádicos) requieren una justificación muy especial, y de todos modos no deberían usarse.
Cosas que he considerado:
- Crear un objeto de fábrica en lugar de un método auxiliar estático
- No resuelve el problema de tener miles de millones de argumentos
- Crear una subclase de DataTypeOne y DataTypeTwo que tenga un constructor dependiente
- Todavía tiene un constructor poliádico protegido
- Cree implementaciones completamente separadas que se ajusten a la misma interfaz
- Múltiple de las ideas anteriores simultáneamente
¿Cómo debe manejarse esta situación?
Tenga en cuenta que esta no es una situación de capa anticorrupción . No hay nada malo con su API. Los problemas son:
- No quiero que mis estructuras de datos tengan
import com.third.party.library.SomeDataStructure;
- No puedo construir sus estructuras de datos en mis casos de prueba
- Mi solución actual da como resultado recuentos de argumentos muy muy altos. Quiero mantener bajos los argumentos, SIN pasar sus estructuras de datos.
- Esa pregunta es " ¿qué es una capa anticorrupción?". Mi pregunta es " ¿cómo puedo usar un patrón, cualquier patrón, para resolver este escenario?"
Tampoco estoy pidiendo código (de lo contrario, esta pregunta estaría en SO), solo estoy pidiendo una respuesta suficiente para que pueda escribir el código de manera efectiva (que esa pregunta no proporciona).
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.