JavaWorld en OO: Getters / Setters vs Builder
EncontréEste artícul en JavaWorld, donde Allen Holub explica una alternativa a Getters / Setters que mantiene el principio de que la implementación de un objeto debe estar oculta (su código de ejemplo también se puede encontrar a continuación).
Se explica que las clasesName
/EmployeeId
/Money
debería tener un constructor que tome una sola cadena; el razonamiento es que si lo escribe comoint
, y luego necesita cambiarlo along
, tendrá que modificar todos los usos de la clase, y con este patrón no tendrá que hacerlo.
e preguntaba: ¿esto simplemente no mueve el problema al análisis de laString
parámetros lanzados sobre? Por ejemplo, si todo el código usa laEmployeeId
(recibido de laExporter
) analiza elString
en unaint
, y de repente comienzas a exportarlong
valores, debe modificar exactamente tantos usos ... y si comienza a analizarlo comolong
bien podría tener que cambiar adouble
(aunque eso no tiene sentido para las identificaciones) ... y si no puede estar seguro de qué analizar elString
dentro de ti no puede implementar nada.
Además de esta pregunta, tengo otra: me doy cuenta de que el artículo tiene más de siete años, así que ¿alguien podría señalarme algunas descripciones recientes sobre el diseño OO, y específicamente ideas sobre el debate de ocultación de getter / setter e implementación?
Listing 1. Empleado: el contexto del constructor public class Employee
{ private Name name;
private EmployeeId id;
private Money salary;
public interface Exporter
{ void addName ( String name );
void addID ( String id );
void addSalary ( String salary );
}
public interface Importer
{ String provideName();
String provideID();
String provideSalary();
void open();
void close();
}
public Employee( Importer builder )
{ builder.open();
this.name = new Name ( builder.provideName() );
this.id = new EmployeeId( builder.provideID() );
this.salary = new Money ( builder.provideSalary(),
new Locale("en", "US") );
builder.close();
}
public void export( Exporter builder )
{ builder.addName ( name.toString() );
builder.addID ( id.toString() );
builder.addSalary( salary.toString() );
}
//...
}