En uno de mis proyectos, tengo dos "objetos de transferencia de datos" RecordType1 y RecordType2 que hereda de una clase abstracta de RecordType.
Quiero tanto RecordType objetos para ser procesados por el mismo RecordProcessor clase dentro de un "proceso" método. Mi primer pensamiento fue para crear un proceso genérico método que los delegados a los dos métodos de proceso de la siguiente manera:
public RecordType process(RecordType record){
if (record instanceof RecordType1)
return process((RecordType1) record);
else if (record instanceof RecordType2)
return process((RecordType2) record);
throw new IllegalArgumentException(record);
}
public RecordType1 process(RecordType1 record){
// Specific processing for Record Type 1
}
public RecordType2 process(RecordType2 record){
// Specific processing for Record Type 2
}
He leído que Scott Meyers, escribe lo siguiente en Efectivo de C++ :
"En cualquier momento usted se encuentra en la escritura del código de la forma 'si el objeto es de tipo T1, a continuación, hacer algo, pero si es de tipo T2, y luego hacer algo más,' bofetada a ti mismo."
Si él está en lo correcto, es evidente que debe ser abofetear a mí mismo. Yo no veo cómo esto es un mal diseño (a menos, claro, que alguien subclases RecordType y agrega en un RecordType3 sin necesidad de añadir otra línea genérico "Proceso", método que se encarga, por lo tanto la creación de un NPE), y las alternativas no puedo pensar en involucrar a poner el peso de ese tratamiento específico dentro de la lógica de la RecordType clases de sí mismos, que realmente no tiene mucho sentido para mí, ya no puede ser, en teoría muchos tipos diferentes de procesamiento que me gustaría realizar en estos registros.
Puede alguien explicar por qué esto podría ser considerado un mal diseño y proporcionar algún tipo de alternativa que todavía le da la responsabilidad de la tramitación de estos expedientes a un "Tratamiento" de la clase?
ACTUALIZACIÓN:
- Cambió
return null
athrow new IllegalArgumentException(record);
- Solo para aclarar, hay tres razones por las que un simple RecordType.método process() no sería suficiente: en Primer lugar, el procesamiento de la realidad está muy lejos de RecordType para merecer su propio método en el RecordType subclases. También, hay un montón de diferentes tipos de tratamiento que, en teoría, podría ser realizado por los diferentes procesadores. Finalmente, RecordType está diseñado para ser una simple clase DTO con un estado mínimo-el cambio en los métodos definidos dentro.