Direto ao ponto, imagine uma classe método que utilizem muitos parâmetros, por exemplo:
public class AluguelService { public List findAluguel(Date dataInicialContrato, Date dataFinalContrato, Date dataInicialOcupacao, Date dataFinalOcupacao) { // pesquisa e regras de negócio aqui } public List findAluguelByStatus(Boolean status, Date dataInicialContrato, Date dataFinalContrato, Date dataInicialOcupacao, Date dataFinalOcupacao) { // pesquisa e regras de negócio aqui } public List findAluguelByCliente(Integer idCliente, Date dataInicialContrato, Date dataFinalContrato, Date dataInicialOcupacao, Date dataFinalOcupacao) { // pesquisa e regras de negócio aqui } }
Esta classe é elegível a refatoração substituir parâmetros por objeto parâmetro: http://www.refactoring.com/catalog/introduceParameterObject.html
Neste caso, há sempre uma intervalo de tempo do contrato e ocupacao. Em primeiro lugar, poderia-se tratar os intervalos:
public class Intervalo { private Date dataInicial; private Date dataFinal; //Get's and Set's }
E deixar a classe assim:
public class AluguelService { public List findAluguel(Intervalo contrato, Intervalo ocupacao) { // pesquisa e regras de negócio aqui } public List findAluguelByStatus(Boolean status, Intervalo contrato, Intervalo ocupacao) { // pesquisa e regras de negócio aqui } public List findAluguelByCliente(Integer idCliente, Intervalo contrato, Intervalo ocupacao) { // pesquisa e regras de negócio aqui } }
Acho que já deu "outra cara". Entretanto, se no domínio, o intervalo do contrato e ocupação andem sempre juntos, pode-se pensar em uni-los em um objeto parâmetro.
public class IntervaloAluguel { private Intervalo contrato; private Intervalo ocupacao; //Get's and Set's }
Então, a classe ficaria assim:
public class AluguelService { public List findAluguel(IntervaloAluguel intervalo) { // faz pesquisa aqui } public List findAluguelByStatus(Boolean status, IntervaloAluguel intervalo) { // faz pesquisa aqui } public List findAluguelByCliente(Integer idCliente, IntervaloAluguel intervalo) { // faz pesquisa aqui } }
Em uma prática mais Domain Driven Design poderia aplicar validações dos parâmetros nas classes parâmetro, por exemplo, tratar o IntervaloAluguel para que as datas sejam válidas, que a data de ocupacao esteja dentro do intervalo contrato, e assim por diante, deixando o a classe mais como um Value Object (não confundir com Transfer Object), se quiserem saber mais: http://www.infoq.com/presentations/Value-Objects-Dan-Bergh-Johnsson
Nenhum comentário:
Postar um comentário