soy un seguidor obsesivo de los DRY y KISS principios pero la semana pasada tuve un caso en el que ambos parecen contradecirse entre sí:Cuando KISS y SECO chocan
Para una aplicación que estaba haciendo, tenía que poner en práctica un bucle de veces que hace lo siguiente:
- iterar sobre los elementos de una lista de tipo a
- convertir el elemento de tipo a a B e insertarlos en una lista de tipo B
He aquí un ejemplo:
for (A a : listOfA) {
listOfB.add(BFactory.convertFromAToB(a));
}
Dentro del código, que tengo que hacer esto unas 4 veces, convertir un tipo (por ejemplo, D, E etc.) en otro. Es posible que no pueda cambiar los tipos que voy a convertir, ya que son tipos de terceros que debemos usar en nuestra aplicación.
Así tenemos:
for (A a : listOfA) {
listOfB.add(BFactory.convertFromAToB(a));
}
for (C a : listOfC) {
listOfB.add(DFactory.convertFromCToD(c));
}
...
Por lo tanto, no violar seca, se me ocurrió una solución genérica:
private interface Function<S, T> {
T apply(S s);
}
public <S, T> void convertAndCopy(List<S> src, List<T> dst, Function<S, T> f) {
for (S s : src) {
dst.add(f.apply(s));
}
}
Una llamada se ve algo como esto:
convertAndCopy(listOfA, listOfB, new Function<A, B>() {
A apply(B b) {
return CFactory.convertFromBToC(b);
}
});
Ahora, aunque esto es mejor en términos de DRY, creo que infringe KISS, ya que esta solución es mucho más difícil de comprender y que los bucles duplicados.
Entonces, ¿esto es DRY vs. KISS? ¿Cuál a favor en este contexto?
EDITAR
Para que quede claro, la clase que estoy hablando es de un adaptador, que delega llamada a un sistema heredado de nuestra propia aplicación, convertir el legado en nuestros propios tipos a lo largo del camino. No tengo medios para cambiar los tipos heredados, ni puedo cambiar nuestros tipos (que son generados por XML-Schema).
palabras clave: java beso seco - me encanta! – hawkeye
¿Qué significa "seco"? Ah, la respuesta lo dice, no te repitas, supongo. –
@Angel, sry Agregaré referencias más adelante :-). – helpermethod