JavaWorld no OO: Getters / Setters vs Builder
Eu encontreiEste artig no JavaWorld, onde Allen Holub explica uma alternativa aos Getters / Setters que mantém o princípio de que a implementação de um objeto deve ser oculta (seu código de exemplo também pode ser encontrado abaixo
É explicado que as classesName
/EmployeeId
/Money
deve ter um construtor usando uma única string - o raciocínio é que, se você digitar comoint
e, posteriormente, é necessário alterá-lo paralong
, você terá que modificar todos os usos da classe e, com esse padrão, não precisar
Eu estava pensando: isso simplesmente não move o problema para a análise doString
parâmetros sendo lançados? Por exemplo, se todo o código usando oEmployeeId
(recebido doExporter
) analisa oString
em umint
e de repente você começa a exportarlong
, você precisa modificar exatamente quantos usos ... e se você começar a analisá-lo comolong
pode ter que mudar paradouble
(mesmo que isso não faça sentido para os IDs) ... e se você não tiver certeza do que analisar oString
Na sua não pode implementar nada.
Além desta pergunta, eu tenho outra: eu sei que o artigo tem mais de sete anos, então alguém poderia me indicar algumas visões gerais recentes sobre o design de OO e, especificamente, idéias sobre o debate oculto de getter / setter e implementação?
Listagem 1. Empregado: o contexto do construtor 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() );
}
//...
}