A menudo me encuentro con este problema, especialmente en Java, incluso si creo que es un problema general de OOP. Es decir: plantear una excepción revela un problema de diseño.
Supongamos que tengo una clase que tiene un String name
campo y un String surname
campo.
Luego usa esos campos para componer el nombre completo de una persona para mostrarlo en algún tipo de documento, digamos una factura.
public void String name;
public void String surname;
public String getCompleteName() {return name + " " + surname;}
public void displayCompleteNameOnInvoice() {
String completeName = getCompleteName();
//do something with it....
}
Ahora quiero fortalecer el comportamiento de mi clase arrojando un error si displayCompleteNameOnInvoice
se llama antes de que se haya asignado el nombre. Parece una buena idea, ¿no?
Puedo agregar un código de excepción al getCompleteName
método. Pero de esta manera estoy violando un contrato 'implícito' con el usuario de la clase; en general, los getters no deben lanzar excepciones si no se establecen sus valores. Ok, este no es un captador estándar ya que no devuelve un solo campo, pero desde el punto de vista del usuario, la distinción puede ser demasiado sutil para pensarlo.
O puedo lanzar la excepción desde adentro del displayCompleteNameOnInvoice
. Pero para hacerlo debería probar directamente name
o surname
campos y al hacerlo violaría la abstracción representada por getCompleteName
. Es responsabilidad de este método verificar y crear el nombre completo. Incluso podría decidir, basando la decisión en otros datos, que en algunos casos es suficiente surname
.
Así que la única posibilidad parece cambiar la semántica del método getCompleteName
a composeCompleteName
, que sugiere un comportamiento más 'activa' y, con ella, la capacidad de lanzar una excepción.
¿Es esta la mejor solución de diseño? Siempre estoy buscando el mejor equilibrio entre simplicidad y corrección. ¿Hay una referencia de diseño para este problema?
displayCompleteNameOnInvoice
puede lanzar una excepción si getCompleteName
regresa null
, ¿no?