Modelo de Desenvolvimento

Observei em muitos projetos um modelo de desenvolvimento como o código a seguir.

public class Cliente{
    public void mandarPintar(){
        Empreiteira empreiteira = new Empreiteira();
        empreiteira.pintar(2);
    }
}

public class Empreiteira{
   public void pintar(int codeType)
      if(codeType==1){
         System.out.println("Pintando com pintor frances");
      }else if(codeType == 2){
         System.out.println("Pintando com pintor ingles");
      }else if(codeType == 3){
         System.out.println("Pintando com pinter alemao");
      }else if(codeType == 4){
         System.out.println("Pintando com portugues");
      }else{
         System.out.println("Pintor desconhecido, a pintura nao será executada");
      }
      System.out.println("Fim do processo de ordem de pintura");
   }
}

No código acima, percebemos que a classe Cliente deve conhecer o significado do código que está passando como parâmetro, a classe Empreiteira por sua vez é obrigada a implementar todos os códidos possíveis do negócio, esse tipo de implementação é a forma mais simples mas com o tempo pode levar a grandes dores de cabeça. A classe Cliente e a classe Empreiteira são dependentes uma da outra, se no projeto for necessário um novo código, devemos modificar as duas classes ao mesmo tempo. Neste modelo é importante o tratamento de erros caso um código não esteja na cadeia de if.
A cadeia de if algumas vezes torna se um arquivo enorme difícil de se manter e de computar pelo processador da máquina.
Uma solução para os últimos problemas citados é a criação de uma enumeracao.
Este tipo de dado limita os parametros enviados para a classe empreiteira, o tratamento de erros torna se infimo e pode em muitas vezes tornar-se inexistente.
O processamento é limitado pois náo há os “ifs” de verificacao de valor, a classe Empreiteira executa somente o que já foi escolhido para executar.

public class Cliente{
   public void mandarPintar(){
      Empreiteira empreiteira = new Empreiteira();
      empreiteira.pintar(Pintor.FRANCES);
   }
}
public class Empreiteira{
   public void pintar(Pintor pintor){
      pintor.pintar();
      System.out.println("Fim da pintura");
   }
}
public enum Pintor{
   FRANCES{
      public void pintar(){
         System.out.println("Pintando com pintor frances");
      }
   },
   INGLES{
      public void pintar(){
         System.out.println("Pintando com pintor ingles");
      }
   },
   ALEMAO{
      public void pintar(){
         System.out.println("Pintando com pintor alemao");
      }
   },
   PORTUGUES{
      public void pintar(){
         System.out.println("Pintando com pintor portugues");
      }
   };
   public abstract void pintar();
}

Um problema que pode aparecer nesta abordagem é quando o processo dentro de cada enumeração começa a se tornar complexo demais para contenção em um único arquivo.
Para resolver este problema, ainterface pode ser uma solução perfeita, com ela podemos pedir para Empreiteira pintar de diferentes formas, e de formas que nem foram inventadas ainda.
Uma implementacao da interface pode ser um metodo de umas poucas linhas ou um subsistema inteiro.
Com os recursos de herança, polimorfismo, empacotamento e outros, o céu é o limite.
No exemplo a seguir, é passado uma classe privada de Cliente, outras classes não precisam desta implementação porque é solução especifica.
Nada impede que o leitor crie uma pasta, (ou pacote) com várias implementacoes da inteface Pintor, (um pacote de pintores públicos).
O modelo apresentado desacopla a Empreiteira do Cliente e das implementações específicas de cada Pintor. Define total responsabilidade ao Cliente do que vai ser executado pela Empreiteira, afinal, é ela que “escolhe”.

public class Cliente{
   public void mandarPintar(){
      Empreiteira empreiteira = new Empreiteira();
      PintorConfiguravel pintor = new PintorConfiguravel();
      pintor.setMensagem("Pintando com pintor configurável");
      empreiteira.pintar(pintor);
   }
   private class PintorConfiguravel implements Pintor{

      private String mensagem;
      public void setMensagem(String mensagem){
          this.mensagem = mensagem
      }
      public void pintar(){
         System.out.println(mensagem);
      }
   }

}
public interface Pintor{
   void pintar();
}
public class Empreiteira{
   public void pintar(Pintor pintor){
      try{
         pintor.pintar();
         System.out.println("Fim da pintura");
      }catch(Exception p){
         System.out.println("Pintor nao reconhecido, a pintura não foi executada");
      }
   }
}
Bookmark the permalink.

Comments are closed.