Muito interessante isso!
Mas com relação a este código:
private void makeNormal(Customer customer) {
Order o1 = new Order();
customer.addOrder(o1);
OrderLine line1 = new OrderLine(6, Product.find("TAL"));
o1.addLine(line1);
OrderLine line2 = new OrderLine(5, Product.find("HPK"));
o1.addLine(line2);
OrderLine line3 = new OrderLine(3, Product.find("LGV"));
o1.addLine(line3);
line2.setSkippable(true);
o1.setRush(true);
}
Se você começa a repetir muito isso:
OrderLine line1 = new OrderLine(6, Product.find(“TAL”));
o1.addLine(line1);
Não seria um mau cheiro? Neste caso acho que este trecho deveria ser extraído para um novo método e depois mover o novo método para dentro de Order. No final ficaria assim:
private void makeNormal(Customer customer) {
Order o1 = new Order();
customer.addOrder(o1);
o1.addLine(6, "TAL");
o1.addLine(5, "HPK").setSkippable(true); //addLine passa a retornar o OrderLine adicionado
o1.addLine(3, "LGV");
o1.setRush(true);
}
Aplicando novas refatorações chegariamos bem próximo a uma interface fluente.
Outra dúvida:
private void makeFluent(Customer customer) {
customer.newOrder()
.with(6, "TAL")
.with(5, "HPK").skippable()
.with(3, "LGV")
.priorityRush();
}
Quando ele muda isso: .setSkippable(true) e .setRush(true) para .skippable() e .priorityRush(). Elenão estaria adicionando a necessidade de aplicar uma refatoração (que eu esqueci o nome :oops: ) para voltar para .setSkippable(true) e .setRush(true)
Ou consultar o livro do Larman 2 ED pg 346 obs: na edição em português ta como: Lei de Demétrio!
Para os extremistas ressalto isso: Fowler começa falando sobre como a prática de evitar getters a todo custo confunde o sentido real de encapsulamento. Tem horas que gets e sets te ajudam a manter o encapsulamento!