SlideShare une entreprise Scribd logo
1  sur  136
Télécharger pour lire hors ligne
http://www.flickr.com/photos/tambako/4112834255/sizes/l/in/set-72157600220682086/




  Padrões de
   Implementação
                               com Java
           de Kent Beck
  André Faria Gomes
quarta-feira, 6 de janeiro de 2010
Valores e Princípios




http://www.flickr.com/photos/tambako/3103490954/sizes/l/
quarta-feira, 6 de janeiro de 2010
Valores são conceitos
                                     que guiam nossas escolhas.




                                                 http://www.flickr.com/photos/rxmflickr/

quarta-feira, 6 de janeiro de 2010
http://www.flickr.com/photos/sgw/2857641872/sizes/l/




  Simplicidade
quarta-feira, 6 de janeiro de 2010
http://www.flickr.com/photos/khalid-almasoud/474399662/sizes/o/




   Flexibilidade
quarta-feira, 6 de janeiro de 2010
http://www.flickr.com/photos/rxmflickr/2687319911/sizes/l/




 Comunicação
quarta-feira, 6 de janeiro de 2010
Os princípios explicam
                                                a motivação
                                       por trás dos padrões




                                       http://www.flickr.com/photos/rxmflickr/3828493521/sizes/l/

quarta-feira, 6 de janeiro de 2010
Princípios
      Os princípios são baseados nos valores e
      são mais                       concretos
      Ajudam a agir conforme os valores e são
      mais fácil de serem traduzidos à
      práticas
                                                           São como   guias
          http://www.flickr.com/photos/werkunz/3680331543

quarta-feira, 6 de janeiro de 2010
Agile Manifesto - Values and Principles
   Individuals and                     Our highest priority is to satisfy the     a development team is face-to-face
                                     customer through early and continuous                  conversation.
     interactions
                                          delivery of valuable software.
   over processes                                                                  Working software is the primary
      and tools                      Welcome changing requirements, even                measure of progress.
                                      late in development. Agile processes
                                                                                 Agile processes promote sustainable
                                       harness change for the customer's
      Working                                                                   development. The sponsors, developers,
                                              competitive advantage.
    software over                                                               and users should be able to maintain a
                                      Deliver working software frequently,            constant pace indefinitely.
   comprehensive
                                     from a couple of weeks to a couple of
   documentation                                                                  Continuous attention to technical
                                        months, with a preference to the
                                                                                excellence and good design enhances
                                               shorter timescale.
                                                                                               agility.
       Customer
                                      Business people and developers must
     collaboration                                                               Simplicity--the art of maximizing the
                                       work together daily throughout the
     over contract                                                              amount of work not done--is essential.
                                                    project.
      negotiation                                                                The best architectures, requirements,
                                         Build projects around motivated
                                                                                    and designs emerge from self-
                                     individuals. Give them the environment
   Responding to                                                                          organizing teams.
                                     and support they need, and trust them
    change over                                to get the job done.              At regular intervals, the team reflects
     following a                                                                on how to become more effective, then
                                     The most efficient and effective method
         plan                                                                        tunes and adjusts its behavior
                                     of conveying information to and within
                                                                                              accordingly.

quarta-feira, 6 de janeiro de 2010
Vamos aos
                                     Princípios...
quarta-feira, 6 de janeiro de 2010
Consequências Locais
                                        Estruture o código de forma que as
                                      consequências sejam locais. Reduza os
                                     efeitos colaterais. Diminua o custo de
                                                 fazer alterações.




quarta-feira, 6 de janeiro de 2010
Reduza a Repetição
                                      Esse principio contribui para manter as
                           consequências locais. Quando mais cópias do
                                     mesmo código, mais cara se torna a
                                                mudança.

                            Quebre o sistema em pequenas partes, pequenos
                             pacotes, pequenos métodos, pequenos objetos.




quarta-feira, 6 de janeiro de 2010
Lógica e Dados
                                     devem andar Juntos
                    Na maioria da vezes quando se altera a estrutura
                      dos dados, também se altera a lógica. Se eles
                   estivem juntos a consequência de alterar será local.




quarta-feira, 6 de janeiro de 2010
Simetria
                     Um método add pede um remove, input, output
                      Um grupo de métodos recebem os mesmos
                                    parâmetros

                              Atributos com o mesmo ciclo de vida
                           Faz o código torna-se mais fácil de se ler
                          Se você entender uma parte, entende o todo
                        “A mesma idéia deve ser expressada da
                              mesma forma em todos os lugares”

quarta-feira, 6 de janeiro de 2010
Expressões Declarativas
                                     Expressar-se o máximo que puder




quarta-feira, 6 de janeiro de 2010
Taxa de Alterações
                                         (Rate of Change)
                  setAmont(int value, String currency) {
                    this.value = value;
                    this.currency = currency;
                  }

                  setAmont(int value, String currency) {
                    this.money = new Money(value, currency);
                  }

                  setAmont(Money money) {
                    this.money = money;
                  }


                                         Evita Duplicidade e Criar Consequências Locais

quarta-feira, 6 de janeiro de 2010
Os padrões expressão um ou mais
                                             valores de comunicação,
                                          simplicidade ou flexibilidade




                                                  http://www.flickr.com/photos/rxmflickr/4045972780/sizes/l/

quarta-feira, 6 de janeiro de 2010
Motivação




                                     http://www.flickr.com/photos/tambako/3567125378/sizes/l/
quarta-feira, 6 de janeiro de 2010
O Custo do Software
                                         Custo Total


                                             =
                                     Custo de Desenvolver


                                             +
                                       Custo de Manter



quarta-feira, 6 de janeiro de 2010
Custo de
                                                  Manter
                                                 é maior!


           Consome mais tempo
           É mais propenso a erros
           Tem que aprender o que o código faz

quarta-feira, 6 de janeiro de 2010
Os Padrões tem o objetivo
                  de gerar Código Claro para
                  o desenvolvimento futuro,
                     reduzindo o custo de
                  manutenção e melhorando
                       a comunicação de
                       programador com
                          programador
quarta-feira, 6 de janeiro de 2010
Você passa mais

                             tempo      lendo
                                 do que escrevendo
                                     código
quarta-feira, 6 de janeiro de 2010
Classes                         http://www.flickr.com/photos/tambako/4112153517/sizes/l/




quarta-feira, 6 de janeiro de 2010
Classes e
         Arquétipos
          de Platão




quarta-feira, 6 de janeiro de 2010
Classe
                “Estes               dados vão juntos e essa lógica também”

              Dados são alterados mais frequentemente do que
                                   lógica.

          Aprender como empacotar lógica em classes e como
       expressar suas variações é essencial para se programar
              de forma eficaz com orientação à objetos.



quarta-feira, 6 de janeiro de 2010
Super-Classe

                              Use herança   cautelosamente
              “Sou parecida com a minha superclasse, apenas um
                              pouco diferente”

               Reduzir a quantidade de classes em um sistema é
              uma melhora, na condição de as outras classes não
                               fiquem inchadas



quarta-feira, 6 de janeiro de 2010
Simple Superclass Name
        Encontrar                    o nome perfeito é dos momentos
        mais satisfatórios da vida de um programador


        O nome certo implica em                 simplicidade e
        expressividade

        Encontrar o nome certo pode levar horas, dias,
        meses ou até mesmo anos




quarta-feira, 6 de janeiro de 2010
Qualified Subclass Name
   O Nome de uma sub-classe deve comunicar duas coisas


   1. Com que classe ela se                parece
   2. No que ela é                   diferente
   Boleto
   BoletoSimples
   BoletoRegistrado




quarta-feira, 6 de janeiro de 2010
Abstract Interface
               “Aumentar o número de interfaces não diminuem o
                             custo do software.”

                         Uma nova interface é algo a mais para
                      compreender, documentar, debugar, organizar,
                                   navegar e nomear.

                    Pague esse preço quando realmente precisar da
                            flexibilidade de uma interface.




quarta-feira, 6 de janeiro de 2010
Mudança é Ruim?
                           “Esses dias li uma lista com todas as razões pelas
                           quais mudanças ocorrem em software, negligência
                             do levantamento de requistos, bla, bla.... A lista
                              assumia que todas as mudanças eram ruins.”




quarta-feira, 6 de janeiro de 2010
Mudança é Ruim?
                 Porque a previsão do tempo é realizada para um
                 ano inteiro de uma só vez? Porque o tempo muda
                             de maneiras imprevisíveis!

                 Em Java, Interfaces e Classes abstratas podem te
               ajudar a conseguir flexibilidade quando for preciso.




quarta-feira, 6 de janeiro de 2010
Interfaces


                                     File < FileImpl


                                      IFile < File
quarta-feira, 6 de janeiro de 2010
Interfaces Versionadas

               O que você faz quado precisa alterar uma interface
                                mas não pode?

                  Crie uma nova interface que extende a anterior e
                  utilize instanceof para verificar se pode utilizar a
                                    nova operação!




quarta-feira, 6 de janeiro de 2010
Interfaces Versionadas
                  interface Command { void run(); }

                  interface ResersibleCommand extends Command {
                  	 void undo();
                  }

                  ...
                  if (recent instanceof ReversibleCommand)
                  	 ((ReversibleCommand) recent).undo()
                  ...




quarta-feira, 6 de janeiro de 2010
Value Object

quarta-feira, 6 de janeiro de 2010
Value Object
                    São objetos que depois de
                   criados nunca mais tem seus
                         valores alterados.


              Exemplos desse padrão na linguagem Java:
               Integer, Float, String, BigDecimal, Double


quarta-feira, 6 de janeiro de 2010
Value Object
               Transação {
               	 int valor;

               	      (int valor, Conta credito, Conta debito) {
               	      	 this.valor = valor;
               	      	 credit.addCredito(this);
               	      	 debit.addDebit(this);
               	      }

               	 int getValor() { return this.valor; }
               }




quarta-feira, 6 de janeiro de 2010
Class Specialization

                       SubClass
quarta-feira, 6 de janeiro de 2010
Subclass

                    É um forma de dizer “Esse
                   objeto é semelhante a aquele
                             exceto...”




quarta-feira, 6 de janeiro de 2010
Cuidado com o Anti-Pattern
               de Hierarquias Paralelas
                                     Duplicidade, Complexidade e Acoplamento




                                         Contrato                        Produto




          ContratoDeSeguro                                     ContratoDeSeguro



                                      ContratoDePensão                     ContratoDePensão



quarta-feira, 6 de janeiro de 2010
Inner Class
                                Static and Non-Static




quarta-feira, 6 de janeiro de 2010
Instance
                                     Specific
                                     Behavior
quarta-feira, 6 de janeiro de 2010
Condicionais
                           Cuidado com a Duplicidade
                       public void display() {   public void contains() {
                         switch(getType()) {       switch(getType()) {
                            case MOUSE_DOWN:          case MOUSE_DOWN:
                            //..                      //..
                            break;                    break;
                            case SELECT:              case SELECT:
                            //..                      //..
                            break;                    break;
                            case MOUSE_OVER:          case MOUSE_OVER:
                            //..                      //..
                            break;                    break;
                         }                         }
                       }                         }




quarta-feira, 6 de janeiro de 2010
Imagine que você agora,
                          precisa adicionar um novo
                                     tipo...

                     Será preciso alterar todos os
                     métodos incluindo um nova
                        entrada no swtich case
                              statement.
quarta-feira, 6 de janeiro de 2010
Delegation

                   A lógica comum deve fica na
                   referring class e a especifica
                   nos delegates.



quarta-feira, 6 de janeiro de 2010
Delegation
               É comum passar a referência do delegador

             // Graphic Editor
             public void mouseDown() {
             tool.mouseDown(this);
             }



             // Retangle Tool
             public void mouseDown(Editor editor) {
             editor.add(new RetangleFigure());
             }




                      Ou Passe o Delegator no Construtor do Delegating Object



quarta-feira, 6 de janeiro de 2010
Pluggable Selector
                  Quando existem poucas implementações

                       Crie todos os métodos em uma única classe e armazene os
                       nomes dos métodos em Strings e chame-os através de
                       reflection. Como é feito no JUnit:


                     String name;
                     public void runTest() {
                     	 Class[] noArguments = new Class[0];
                     	 Method method = getClass().getMethod(name, noArguments);
                     	 method.invoke(this, new Object[0]);
                     }




quarta-feira, 6 de janeiro de 2010
Anonymous
                                     Inner Class
                 public class Pato {

                 	
                 	      Habilidade andar = new Habilidade() {
                 	      	 public void fazer() {
                 	      	 	 //...
                 	      	 }
                 	      };
                 	
                 }

quarta-feira, 6 de janeiro de 2010
Anonymous
                                     Inner Class
             Difícil de Testar

            Como a classe não possui nome é você não
           pode expressar sua intenção facilmente

             Pode tornar o código mais difícil de ler



quarta-feira, 6 de janeiro de 2010
?
           O que você pode
             fazer quando
          precisa de alguma
         funcionalidade que
           não encaixa em
            nenhum objeto

quarta-feira, 6 de janeiro de 2010
?
            Que tal criar uma
             classe cheia de
            métodos estáticos
                com essas
             funcionalidades

quarta-feira, 6 de janeiro de 2010
Library Class
                        public class Collections {
                        	     //..
                             public static <T extends Comparable<? super T>> void sort(List<T> list) {
                            	     Object[] a = list.toArray();
                            	     Arrays.sort(a);
                            	     ListIterator<T> i = list.listIterator();
                            	     for (int j=0; j<a.length; j++) {
                            	         i.next();
                            	         i.set((T)a[j]);
                            	     }
                             }
                        	   //..
                        }




quarta-feira, 6 de janeiro de 2010
Library Class
                          Não têm Estado

                          Difícil de Testar

                          Procedural




quarta-feira, 6 de janeiro de 2010
Estado




   http://www.flickr.com/photos/tambako/2701117725/sizes/l/

quarta-feira, 6 de janeiro de 2010
State
                    Trabalha com valores que que variam ao
                               longo do tempo



                   “Olhe para o sol, espere uma hora e olhe
                    novo, ele já não estará mais no mesmo
                                     lugar“




quarta-feira, 6 de janeiro de 2010
Cuidado!


                         Estado e concorrência
                         não se dão muito bem.


quarta-feira, 6 de janeiro de 2010
Separar Estados
                           Quando tiver dúvida,
                       pergunte-se se os atributos
                       devem nascem e morrem ao
                       mesmo tempo. Se a reposta
                         for sim, eles devem ficar
                                   juntos.
quarta-feira, 6 de janeiro de 2010
Access

                                     Mantém a Flexibilidade limitando o
                                            acesso ao estado




quarta-feira, 6 de janeiro de 2010
Access

                                A distinção entre acessar dados
                             armazenados e invocar computações é
                               uma dicotomia das linguagens de
                                         programação.




quarta-feira, 6 de janeiro de 2010
Direct Access

                                       Acessa o estado de um objeto
                                               diretamente.

                                     Geralmente utilizados em métodos
                                          acessores e construtores.




quarta-feira, 6 de janeiro de 2010
Legibilidade

                                     numeroDeFilhos = 10;

                                          porta = 1;

                                        abrirPorta();

                                        porta.abrir();


quarta-feira, 6 de janeiro de 2010
Indirect Access

                         Acessa o estado de um objeto através de
                          métodos para aumentar a flexibilidade




quarta-feira, 6 de janeiro de 2010
Indirect Access

                            “Minha estratégia padrão é permitir
                          acesso direto à própria classe, incluindo
                          inner classes, e acesso indireto à classes
                                           clientes”
                                                           Kent Beck




quarta-feira, 6 de janeiro de 2010
Common State

                             Armazena o estado comum a todos os
                                   objetos de uma classe.




quarta-feira, 6 de janeiro de 2010
Exemplo do Cartesiano
                   class Point {
                     int x;
                     int y;
                   }

                   Todos os atributos compartilham o
                   mesmo ciclo de vida.


quarta-feira, 6 de janeiro de 2010
Variable State
                            Armazena o estado que variam de
                          instancia para instancia em um mapa

                                       Alta Flexibidade
                                      Comunicação Pobre




quarta-feira, 6 de janeiro de 2010
Variable State
                 public class ObjetoFlexivel {

                 	      Map<String, Object> properties = new HashMap<String, Object>();

                 	      public Object getProperty(final String key) {
                 	      	 return properties.get(key);
                 	      }

                 	      public void setProperty(final String key, final Object value) {
                 	      	 properties.put(key, value);
                 	      }

                 }


                     Use prefixos para representar propriedades
                   relacionadas: border, borderColor, borderWidth...


quarta-feira, 6 de janeiro de 2010
Variable
                             Variáveis provêem um namespace para
                                        acessar o estado.

                           Leitores devem entender facilmente o
                          escopo, o ciclo de vida e o papel de uma
                                           variável.



quarta-feira, 6 de janeiro de 2010
Escopo
                                                    Local

                                                   Atributo
                                                    (Field)

                                                   Estático

                                               + Modificadores
                                     (private, default, protected, public)
quarta-feira, 6 de janeiro de 2010
Local Variable
                       Variáveis Locais detém o estado de um
                                    escopo único




quarta-feira, 6 de janeiro de 2010
Variável Local Coletora

                       Coleta Informações para uso posterior.

                     Geralmente são usadas no retorno de
                    métodos, neste caso chame de result ou
                                    results.



quarta-feira, 6 de janeiro de 2010
Variável Local
                                      Contadora
                   Um Tipo de Especial de Variável Coletora
                    que armazena a contagem de objetos.




quarta-feira, 6 de janeiro de 2010
Variável Local Explicatória
                                Quando há um cálculo complexa
                              armazene suas partes variáveis para
                                      facilitar a leitura.

                   int         top = 10;
                   int         left = 10;
                   int         heigth = 10;
                   int         width = 10;

                   new Retangle(top, left, height, width);



quarta-feira, 6 de janeiro de 2010
Variável Local de Reuso
                         Quando você precisa utilizar o mesmo
                               valor mais de uma vez.


                  long now = System.currentTimeMills();
                  for (Clock each: getClocks())
                    each.setTime(now);




quarta-feira, 6 de janeiro de 2010
Field
                      Fields armazenam o estado de vida de
                     um objeto. Elas nascem e morrem junto
                                  com o objeto.




quarta-feira, 6 de janeiro de 2010
Helper Field
                          Helper Fields guardam referências de
                           objetos que são usados por vários
                                        métodos.

                     Se um objeto é passado por parâmetro
                    para muitos métodos, considere torná-lo
                                    um field



quarta-feira, 6 de janeiro de 2010
Flag Field
                  Flag Fields indicam que o objeto pode ter
                  dois tipos de comportamentos diferentes.
                    Se houver um setter para esse field o
                    comportamento pode ser mudado ao
                           longo da vida do objeto.

                                     Atenção: Se houver muitas consultas repetitivas a
                                     flag para determinar o comportamento do objeto,
                                     analise a possibilidade de usar o padrão Strategy

quarta-feira, 6 de janeiro de 2010
Strategy
                        Quando você quiser expressar que
                       existem formas diferentes de realizar
                      parte do comportamento do objeto crie
                                 um strategy field.

                     Se ele puder mudar ao longo da vida do
                       objeto, crie um setter, caso contrário
                               defina no construtor.


quarta-feira, 6 de janeiro de 2010
Components
                      Atributos componentes contém objetos
                      ou dados que pertencem ao objeto em
                                    questão.


                                     Carro          Motor




quarta-feira, 6 de janeiro de 2010
Parameter
             Parâmetros comunicam o estado durante
                 a execução de um único método




quarta-feira, 6 de janeiro de 2010
Parameter
                 Além de variáveis não privadas, a única
                  forma de comunicar o estado de um
                     objeto para outro é através de
                              parâmetros.




quarta-feira, 6 de janeiro de 2010
Parameter
                         O acoplamento introduzido por um
                        parâmetro é bem menor do que uma
                       referência de permanente (atributo) de
                                um objeto para outro.




quarta-feira, 6 de janeiro de 2010
Parameter
                       Quando um parâmetro se repete em
                      muitos métodos de um objeto, é muito
                      provável que ele deva ser uma atributo.




quarta-feira, 6 de janeiro de 2010
quarta-feira, 6 de janeiro de 2010
Collection Parametor




quarta-feira, 6 de janeiro de 2010
Collection Parametor
                                   Passa um parâmetro para coletar
                                 resultados complicados de múltiplos
                                              métodos




quarta-feira, 6 de janeiro de 2010
Collection Parametor
                 void listar() {
                 	 List results = new ArrayList();
                 	 addTo(results);
                 	 return results;
                 }

                 private void adicionar(List elements) {
                 	 ...
                 }



quarta-feira, 6 de janeiro de 2010
Optinal Parameter
                         Utilizado em métodos e construtores,
                         também conhecido como Telescoping
                                       Pattern

                 public void mascarar() {mascarar(2,2);}

                 public void mascarar(int decimals) {
                    mascarar(decimals, decimals);
                 }

                 public void mascarar(int min, int max) { ... }

quarta-feira, 6 de janeiro de 2010
Parameter Object
                           Consolida longas listas de parâmetros
                           usados frequentemente em um objeto


                  setBordaExterna ( x,y,w,h );
                  setBordaInterna ( x+2,y+2,w-4,h-4 );

                  setBordaExterna ( borda );
                  setBordaInterna ( borda.expandir(-2) );


quarta-feira, 6 de janeiro de 2010
Constant
                          Armazena o estado que não se altera

                       Utilize variáveis static final com nomes
                                     em uppercase.

                    Cuidado setAlignment(CENTERED) não
                              comunica também como center()


quarta-feira, 6 de janeiro de 2010
quarta-feira, 6 de janeiro de 2010
• count: armazena contagens
                     • each: armazena elemento durante iterações
                     • result: armazena o valor que a função retornará



quarta-feira, 6 de janeiro de 2010
Nomeie variáveis de acordo com seus papéis




                     • count: armazena contagens
                     • each: armazena elemento durante iterações
                     • result: armazena o valor que a função retornará



quarta-feira, 6 de janeiro de 2010
Role-Suggesting Name
                        Nomeie variáveis de acordo com seus papéis




                     • count: armazena contagens
                     • each: armazena elemento durante iterações
                     • result: armazena o valor que a função retornará



quarta-feira, 6 de janeiro de 2010
Declared Type
                         Declara um tipo genérico para variáveis




           List<Pessoa> candidatos =
            new ArrayList<Pessoas>();



quarta-feira, 6 de janeiro de 2010
Inicialization
quarta-feira, 6 de janeiro de 2010
Eager Inicialization
                                     Inicializa campos de um instancia em
                                                 tempo de criação



                    class Clube {
                    	 List<Pessoa> membros = Lists.newArrayList();
                    }

                    class Clube { ... Clube() { /* inicialização */ } }




quarta-feira, 6 de janeiro de 2010
Lazy Inicialization
                     Inicializa campos cujo valores são caros
                       de se calcular apenas antes de serem
                              usados pela primeira vez

                 public List<Pessoa> getMembros() {
                 	 if (membros == null) {
                 	 	 membros = Lists.newArrayList();
                 	 }
                 	 return membros;
                 }




quarta-feira, 6 de janeiro de 2010
Métodos
                                     http://www.flickr.com/photos/tambako/4170480368/sizes/l/
quarta-feira, 6 de janeiro de 2010
Intetion-Revealing
                                       Method
                     Métodos devem ter nomes que revelem
                     seu objetivo e sejam intuitivos para que
                       um potencial invocador o descubra


                                       Customer.findById(id);

                                        iterator.hasNext();

quarta-feira, 6 de janeiro de 2010
Method Visibility
                                public, package, protected ou private?

                                      “Revelar o mínimo possível
                                      garante maior flexibilidade”




quarta-feira, 6 de janeiro de 2010
Method Object
                  Esse padrão pode te ajudar a transformar
                   um código massivo aglomerado em um
                  método impossível em um código legível,
                   limpo e claro, que revela gradualmente
                          suas intenções ao leitor.




quarta-feira, 6 de janeiro de 2010
Method Object
                     Aqueles métodos, cheios de variáveis
                  temporárias e um montão de parâmetros
                  são ótimos candidatos se transformarem
                    em um objeto, tentar apenas fazer um
                      Extract Method, resultaria em sub-
                  métodos difíceis de nomear com dezenas
                                 de variáveis.


quarta-feira, 6 de janeiro de 2010
Method Object
   1. Crie uma classe com o nome do método

   2. Crie um atributo para cada parâmetro, variável local e atributos do objeto
   original usados no método.

   3. Crie um construtor que recebe os parâmetros e atributos.

   4. Copie o método original para a nova classe substituindo seus parametrôs
   pelas referencias dos atributos da nova classe.

   5. Altere a chamada do método na classe original

   6. Se atributos eram definidos na classe original, obtenha-os por getters e
   defina-os.

   7. Agora faça os extract methods necessários para tornar o código mais
   legível.
quarta-feira, 6 de janeiro de 2010
Overidden Method
                                       Métodos sobre-escritos são
                                     uma forma clara de se expressar
                                             variações.




quarta-feira, 6 de janeiro de 2010
Overloaded Method
                  Métodos sobrecarregados representam
                    formas alternativas de se invocar o
                                     mesmo método.

                    Todos as versão sobrecarregadas devem
                   servir para o mesmo propósito, caso
                          contrário é melhor procurar um novo
                                         nome.

quarta-feira, 6 de janeiro de 2010
Method Return Type
                               Identificam se o método é uma
                               Procedure (void) ou uma Function
                               (Object).




                                     Generalize o tipo de retorno para
                              esconder detalhes de implementação.

quarta-feira, 6 de janeiro de 2010
Comentários
                   Expresse o máximo de informação
                    possível através de   nomes e da
                                escreva
                   estrutura do seu código,
             comentários somente para o
                que não estiver óbvio.


 Evite comentários redundantes.
quarta-feira, 6 de janeiro de 2010
Helper Method

                          São métodos        private que compõe um
                             método público e tornam seu o código
                                      mais   legível e coeso.



quarta-feira, 6 de janeiro de 2010
Debug Print Method
                            Implemente o método toString() dos
                                     objetos de forma a identificar seu
                                     valor facilmente, essa prática pode
                              reduzir significativamente o tempo de
                                           debugging .




quarta-feira, 6 de janeiro de 2010
Conversion
                              Quando você precisa   converter
                            um objeto de um tipo em outro de
                                   um tipo diferente.




quarta-feira, 6 de janeiro de 2010
Conversion Method
              class Farenheight {

                       public Celsius convertToCelsius(Farenheight f) {
              	          ...
                       }

              }




quarta-feira, 6 de janeiro de 2010
Conversion Contructor
                       class Farenheight {

                                public Farenheight (Celsius c) {
                                	 ...
                                }

                       }




quarta-feira, 6 de janeiro de 2010
Construtor
                  Deve representar a     criação de um
                                     objeto




quarta-feira, 6 de janeiro de 2010
Factory Method
                             Forma alternativa ao Construtor para
                          representar a criação de um objeto em um
                                       método estático.

                       Calculadora c = Calculadora.criar();

                      Muito útil quando se precisa de caching ou
                    retornar diferentes subclasses dependendo
                                   dos parâmetros.


quarta-feira, 6 de janeiro de 2010
Internal Factory
                            Quando criar ou calcular um objeto for
                             complexo, crie um método que cria e
                                   retorna o novo objeto.



      getX(){
      	 if (x == null)
      	 	 x = computeX();
      	 return x;
      }

quarta-feira, 6 de janeiro de 2010
Collection
                                     Accessor Method
                      Como prover acesso a uma Collection?


                          public List<Livro> getLivros() {
                          	 return livros;
                          }



                                          Qual o   problema dessa
                                              implementação?
quarta-feira, 6 de janeiro de 2010
Collection
                                      Accessor Method
                       public List<Livro> getLivros() {
                       	 return livros;
                       }

                          Apesar de dar máxima flexibilidade,
                             você perde o controle sobre um
                            atributo de seu objeto que pode ser
                                     invalidado sem que você saiba.

quarta-feira, 6 de janeiro de 2010
Unmodifiable Wrapper
                         public List<Livro> getLivros() {
                         	 return Collections.unmodifiableList(livros);
                         }




quarta-feira, 6 de janeiro de 2010
Collection Accessor Method
                                     public void addLivro(Livro livro) {}

                                     public int getQuantidadeDeLivros() {}

                                     public Iterator getLivros() {}




                       Uma boa prática é fornecer métodos que
                       para operações limitadas e significativas.
                Isso melhora a  coesão, torna o código mais
                  legível e testável. E você fica no controle.


quarta-feira, 6 de janeiro de 2010
Boolean Setting Method
                      procure usar

                      cache.ativar();
                      cache.inativar();

                                      ao   invés de
                          cache.setStatus(true);
                          cache.setStatus(false);




quarta-feira, 6 de janeiro de 2010
Boolean Setting Method
                         a menos que

                    if (booleanVar)
                    	 cache.ativar();	
                    else
                    	 cache.inativar();


                                          nesse caso

                                          cache.setStatus(booleanVar);



quarta-feira, 6 de janeiro de 2010
Getting
                                     Method

quarta-feira, 6 de janeiro de 2010
Setting Method
                       void setX(int x){      ...       }

                       void centered(){      ...    }




quarta-feira, 6 de janeiro de 2010
http://www.flickr.com/photos/pong/288491653/sizes/o/



       Safe Copy



                              public void getLivros() {
                              	 List<Livro> result = new ArrayList<Livros>();
                              	 result.addAll(this.livros);
                              	 return result;
                              }



quarta-feira, 6 de janeiro de 2010
Coleções




                                     http://www.flickr.com/photos/tambako
quarta-feira, 6 de janeiro de 2010
Array
                                     Simples e Pouco Flexíveis

                                           Tamanho Fixo
                                     Sintaxe de Acesso Simples
                                           Acesso Rápido




quarta-feira, 6 de janeiro de 2010
Iterable
                          Interface básica que permite apenas que
                             se realizem iterações e nada mais.




quarta-feira, 6 de janeiro de 2010
Collection
                        Oferece Adição, Remoção e Verificação de
                                        Presença.




quarta-feira, 6 de janeiro de 2010
List
                               Elementos Ordenados que podem ser
                                  acessados por sua localização.




quarta-feira, 6 de janeiro de 2010
Set
                                     Um conjunto de elementos sem
                                             duplicidade.




quarta-feira, 6 de janeiro de 2010
SortedSet
                                Um conjunto ordenado de elementos
                                         sem duplicidade




quarta-feira, 6 de janeiro de 2010
Map
                            Um coleção de chaves ligadas a valores




quarta-feira, 6 de janeiro de 2010
Comunicação
                              As colections Java       comunicam o que
                                são o que elas fazem. Esse é o grande

                                     beneficio de ter   padrões.


quarta-feira, 6 de janeiro de 2010
Referência

                                     Leia o Livro!



                                     http://www.amazon.com/Implementation-Patterns-Kent-Beck/dp/0321413091


quarta-feira, 6 de janeiro de 2010
OBRIGADO!!!!




                                     http://www.flickr.com/photos/tambako
quarta-feira, 6 de janeiro de 2010

Contenu connexe

Similaire à Implemention Patterns

Palestra Métodos Ágeis SERPRO
Palestra Métodos Ágeis SERPROPalestra Métodos Ágeis SERPRO
Palestra Métodos Ágeis SERPROWildtech
 
Princípios ágeis - UFRGS 2013
Princípios ágeis - UFRGS 2013Princípios ágeis - UFRGS 2013
Princípios ágeis - UFRGS 2013Lourenco P Soares
 
Métodos ágeis para design de sistemas interativos centrados no usuário
Métodos ágeis para design de sistemas interativos centrados no usuárioMétodos ágeis para design de sistemas interativos centrados no usuário
Métodos ágeis para design de sistemas interativos centrados no usuárioKarine Drumond
 
Analise de gerenciamento_de_projeto_de_software_utilizando_metodologia_agil_x...
Analise de gerenciamento_de_projeto_de_software_utilizando_metodologia_agil_x...Analise de gerenciamento_de_projeto_de_software_utilizando_metodologia_agil_x...
Analise de gerenciamento_de_projeto_de_software_utilizando_metodologia_agil_x...Elisangela Paulino
 
O uso de metodos ageis no desenvolvimento de software
O uso de metodos ageis no desenvolvimento de softwareO uso de metodos ageis no desenvolvimento de software
O uso de metodos ageis no desenvolvimento de softwareEverton vitor
 
Desenvolvimento Ágil - Pensando Além
Desenvolvimento Ágil - Pensando AlémDesenvolvimento Ágil - Pensando Além
Desenvolvimento Ágil - Pensando Alémilegra
 
Aula2 - Modelagem de Sistemas Orientada a Objetos
Aula2 - Modelagem de Sistemas Orientada a ObjetosAula2 - Modelagem de Sistemas Orientada a Objetos
Aula2 - Modelagem de Sistemas Orientada a ObjetosLeandro Rezende
 
Leds zeppellin infraestrutura de apoio ao desenvolvimento
Leds zeppellin   infraestrutura de apoio ao desenvolvimentoLeds zeppellin   infraestrutura de apoio ao desenvolvimento
Leds zeppellin infraestrutura de apoio ao desenvolvimentoledsifes
 
Introdução a Metodologia XP (E Xtreme Programming)
Introdução a Metodologia XP (E Xtreme Programming)Introdução a Metodologia XP (E Xtreme Programming)
Introdução a Metodologia XP (E Xtreme Programming)Rennan Martini
 
Desenvolvimento ágil de software
Desenvolvimento ágil de softwareDesenvolvimento ágil de software
Desenvolvimento ágil de softwarediogenes.araujo
 
Padrões em projetos de UX: alinhando a comunicação e aumentando a produtividade
Padrões em projetos de UX: alinhando a comunicação e aumentando a produtividadePadrões em projetos de UX: alinhando a comunicação e aumentando a produtividade
Padrões em projetos de UX: alinhando a comunicação e aumentando a produtividadeNeue Labs
 

Similaire à Implemention Patterns (20)

Palestra Métodos Ágeis SERPRO
Palestra Métodos Ágeis SERPROPalestra Métodos Ágeis SERPRO
Palestra Métodos Ágeis SERPRO
 
Agile User Experience
Agile User ExperienceAgile User Experience
Agile User Experience
 
eXtreme Programming
eXtreme ProgrammingeXtreme Programming
eXtreme Programming
 
Conhecendo xp
Conhecendo xpConhecendo xp
Conhecendo xp
 
Princípios ágeis - UFRGS 2013
Princípios ágeis - UFRGS 2013Princípios ágeis - UFRGS 2013
Princípios ágeis - UFRGS 2013
 
Curso Scrum
Curso ScrumCurso Scrum
Curso Scrum
 
Princípios Ágeis
Princípios ÁgeisPrincípios Ágeis
Princípios Ágeis
 
Métodos ágeis para design de sistemas interativos centrados no usuário
Métodos ágeis para design de sistemas interativos centrados no usuárioMétodos ágeis para design de sistemas interativos centrados no usuário
Métodos ágeis para design de sistemas interativos centrados no usuário
 
Analise de gerenciamento_de_projeto_de_software_utilizando_metodologia_agil_x...
Analise de gerenciamento_de_projeto_de_software_utilizando_metodologia_agil_x...Analise de gerenciamento_de_projeto_de_software_utilizando_metodologia_agil_x...
Analise de gerenciamento_de_projeto_de_software_utilizando_metodologia_agil_x...
 
O uso de metodos ageis no desenvolvimento de software
O uso de metodos ageis no desenvolvimento de softwareO uso de metodos ageis no desenvolvimento de software
O uso de metodos ageis no desenvolvimento de software
 
Desenvolvimento Ágil - Pensando Além
Desenvolvimento Ágil - Pensando AlémDesenvolvimento Ágil - Pensando Além
Desenvolvimento Ágil - Pensando Além
 
Manifesto Agil
Manifesto AgilManifesto Agil
Manifesto Agil
 
Métodos ágeis
Métodos ágeisMétodos ágeis
Métodos ágeis
 
Aula2 - Modelagem de Sistemas Orientada a Objetos
Aula2 - Modelagem de Sistemas Orientada a ObjetosAula2 - Modelagem de Sistemas Orientada a Objetos
Aula2 - Modelagem de Sistemas Orientada a Objetos
 
Scrum
ScrumScrum
Scrum
 
Leds zeppellin infraestrutura de apoio ao desenvolvimento
Leds zeppellin   infraestrutura de apoio ao desenvolvimentoLeds zeppellin   infraestrutura de apoio ao desenvolvimento
Leds zeppellin infraestrutura de apoio ao desenvolvimento
 
Métodos Ágeis - Aula02
Métodos Ágeis - Aula02Métodos Ágeis - Aula02
Métodos Ágeis - Aula02
 
Introdução a Metodologia XP (E Xtreme Programming)
Introdução a Metodologia XP (E Xtreme Programming)Introdução a Metodologia XP (E Xtreme Programming)
Introdução a Metodologia XP (E Xtreme Programming)
 
Desenvolvimento ágil de software
Desenvolvimento ágil de softwareDesenvolvimento ágil de software
Desenvolvimento ágil de software
 
Padrões em projetos de UX: alinhando a comunicação e aumentando a produtividade
Padrões em projetos de UX: alinhando a comunicação e aumentando a produtividadePadrões em projetos de UX: alinhando a comunicação e aumentando a produtividade
Padrões em projetos de UX: alinhando a comunicação e aumentando a produtividade
 

Plus de André Faria Gomes

Meetup Escale - Gestão para Equipes de Alta Performance
Meetup Escale - Gestão para Equipes de Alta PerformanceMeetup Escale - Gestão para Equipes de Alta Performance
Meetup Escale - Gestão para Equipes de Alta PerformanceAndré Faria Gomes
 
Protagonistas da inovação - Como criar e gerir os negócios do futuro
Protagonistas da inovação - Como criar e gerir os negócios do futuroProtagonistas da inovação - Como criar e gerir os negócios do futuro
Protagonistas da inovação - Como criar e gerir os negócios do futuroAndré Faria Gomes
 
A Mobilidade como Propulsor da Transformação Digital
A Mobilidade como Propulsor da Transformação DigitalA Mobilidade como Propulsor da Transformação Digital
A Mobilidade como Propulsor da Transformação DigitalAndré Faria Gomes
 
Além da Agilidade 2019 - KickOff Wow
Além da Agilidade 2019 - KickOff WowAlém da Agilidade 2019 - KickOff Wow
Além da Agilidade 2019 - KickOff WowAndré Faria Gomes
 
Modern systems architectures: Uber, Lyft, Cabify
Modern systems architectures: Uber, Lyft, CabifyModern systems architectures: Uber, Lyft, Cabify
Modern systems architectures: Uber, Lyft, CabifyAndré Faria Gomes
 
Principles and Radical Transparency - Lessons Learned from Ray Dalio
Principles and Radical Transparency - Lessons Learned from Ray DalioPrinciples and Radical Transparency - Lessons Learned from Ray Dalio
Principles and Radical Transparency - Lessons Learned from Ray DalioAndré Faria Gomes
 
Bluesoft @ AWS re:Invent 2017 + AWS 101
Bluesoft @ AWS re:Invent 2017 + AWS 101Bluesoft @ AWS re:Invent 2017 + AWS 101
Bluesoft @ AWS re:Invent 2017 + AWS 101André Faria Gomes
 
Boas Práticas da Rede Supermercadista Wegmans
Boas Práticas da Rede Supermercadista WegmansBoas Práticas da Rede Supermercadista Wegmans
Boas Práticas da Rede Supermercadista WegmansAndré Faria Gomes
 
Boas Práticas para Supermercadistas inspiradas no Whole Foods, Sprouts Marke...
Boas Práticas para Supermercadistas inspiradas no Whole Foods, Sprouts Marke...Boas Práticas para Supermercadistas inspiradas no Whole Foods, Sprouts Marke...
Boas Práticas para Supermercadistas inspiradas no Whole Foods, Sprouts Marke...André Faria Gomes
 
Change management - Kotter’s eight-step model
Change management - Kotter’s eight-step model Change management - Kotter’s eight-step model
Change management - Kotter’s eight-step model André Faria Gomes
 
Palestra na Uninove sobre Agilidade
Palestra na Uninove sobre AgilidadePalestra na Uninove sobre Agilidade
Palestra na Uninove sobre AgilidadeAndré Faria Gomes
 
What happened to Google Reader?
What happened to Google Reader?What happened to Google Reader?
What happened to Google Reader?André Faria Gomes
 
Gestão Ágil com Management 3.0
Gestão Ágil com Management 3.0Gestão Ágil com Management 3.0
Gestão Ágil com Management 3.0André Faria Gomes
 
Lições aprendidas em 10 anos de agilidade
Lições aprendidas em 10 anos de agilidadeLições aprendidas em 10 anos de agilidade
Lições aprendidas em 10 anos de agilidadeAndré Faria Gomes
 
Os 7 hábitos das pessoas altamente eficazes
Os 7 hábitos das pessoas altamente eficazesOs 7 hábitos das pessoas altamente eficazes
Os 7 hábitos das pessoas altamente eficazesAndré Faria Gomes
 
Objetividade: A Virtude Esquecida
Objetividade: A Virtude EsquecidaObjetividade: A Virtude Esquecida
Objetividade: A Virtude EsquecidaAndré Faria Gomes
 

Plus de André Faria Gomes (20)

Meetup Escale - Gestão para Equipes de Alta Performance
Meetup Escale - Gestão para Equipes de Alta PerformanceMeetup Escale - Gestão para Equipes de Alta Performance
Meetup Escale - Gestão para Equipes de Alta Performance
 
Protagonistas da inovação - Como criar e gerir os negócios do futuro
Protagonistas da inovação - Como criar e gerir os negócios do futuroProtagonistas da inovação - Como criar e gerir os negócios do futuro
Protagonistas da inovação - Como criar e gerir os negócios do futuro
 
A Mobilidade como Propulsor da Transformação Digital
A Mobilidade como Propulsor da Transformação DigitalA Mobilidade como Propulsor da Transformação Digital
A Mobilidade como Propulsor da Transformação Digital
 
Além da Agilidade 2019 - KickOff Wow
Além da Agilidade 2019 - KickOff WowAlém da Agilidade 2019 - KickOff Wow
Além da Agilidade 2019 - KickOff Wow
 
Modern systems architectures: Uber, Lyft, Cabify
Modern systems architectures: Uber, Lyft, CabifyModern systems architectures: Uber, Lyft, Cabify
Modern systems architectures: Uber, Lyft, Cabify
 
Breaking the monolith
Breaking the monolithBreaking the monolith
Breaking the monolith
 
Agilidade - APAS
Agilidade - APASAgilidade - APAS
Agilidade - APAS
 
Principles and Radical Transparency - Lessons Learned from Ray Dalio
Principles and Radical Transparency - Lessons Learned from Ray DalioPrinciples and Radical Transparency - Lessons Learned from Ray Dalio
Principles and Radical Transparency - Lessons Learned from Ray Dalio
 
Bluesoft @ AWS re:Invent 2017 + AWS 101
Bluesoft @ AWS re:Invent 2017 + AWS 101Bluesoft @ AWS re:Invent 2017 + AWS 101
Bluesoft @ AWS re:Invent 2017 + AWS 101
 
Boas Práticas da Rede Supermercadista Wegmans
Boas Práticas da Rede Supermercadista WegmansBoas Práticas da Rede Supermercadista Wegmans
Boas Práticas da Rede Supermercadista Wegmans
 
Boas Práticas para Supermercadistas inspiradas no Whole Foods, Sprouts Marke...
Boas Práticas para Supermercadistas inspiradas no Whole Foods, Sprouts Marke...Boas Práticas para Supermercadistas inspiradas no Whole Foods, Sprouts Marke...
Boas Práticas para Supermercadistas inspiradas no Whole Foods, Sprouts Marke...
 
Change management - Kotter’s eight-step model
Change management - Kotter’s eight-step model Change management - Kotter’s eight-step model
Change management - Kotter’s eight-step model
 
Palestra na Uninove sobre Agilidade
Palestra na Uninove sobre AgilidadePalestra na Uninove sobre Agilidade
Palestra na Uninove sobre Agilidade
 
Pensando Rápido e Devagar
Pensando Rápido e DevagarPensando Rápido e Devagar
Pensando Rápido e Devagar
 
What happened to Google Reader?
What happened to Google Reader?What happened to Google Reader?
What happened to Google Reader?
 
Gestão Ágil com Management 3.0
Gestão Ágil com Management 3.0Gestão Ágil com Management 3.0
Gestão Ágil com Management 3.0
 
Lições aprendidas em 10 anos de agilidade
Lições aprendidas em 10 anos de agilidadeLições aprendidas em 10 anos de agilidade
Lições aprendidas em 10 anos de agilidade
 
Os 7 hábitos das pessoas altamente eficazes
Os 7 hábitos das pessoas altamente eficazesOs 7 hábitos das pessoas altamente eficazes
Os 7 hábitos das pessoas altamente eficazes
 
Objetividade: A Virtude Esquecida
Objetividade: A Virtude EsquecidaObjetividade: A Virtude Esquecida
Objetividade: A Virtude Esquecida
 
Bematech IFRS
Bematech IFRSBematech IFRS
Bematech IFRS
 

Implemention Patterns

  • 1. http://www.flickr.com/photos/tambako/4112834255/sizes/l/in/set-72157600220682086/ Padrões de Implementação com Java de Kent Beck André Faria Gomes quarta-feira, 6 de janeiro de 2010
  • 3. Valores são conceitos que guiam nossas escolhas. http://www.flickr.com/photos/rxmflickr/ quarta-feira, 6 de janeiro de 2010
  • 5. http://www.flickr.com/photos/khalid-almasoud/474399662/sizes/o/ Flexibilidade quarta-feira, 6 de janeiro de 2010
  • 7. Os princípios explicam a motivação por trás dos padrões http://www.flickr.com/photos/rxmflickr/3828493521/sizes/l/ quarta-feira, 6 de janeiro de 2010
  • 8. Princípios Os princípios são baseados nos valores e são mais concretos Ajudam a agir conforme os valores e são mais fácil de serem traduzidos à práticas São como guias http://www.flickr.com/photos/werkunz/3680331543 quarta-feira, 6 de janeiro de 2010
  • 9. Agile Manifesto - Values and Principles Individuals and Our highest priority is to satisfy the a development team is face-to-face customer through early and continuous conversation. interactions delivery of valuable software. over processes Working software is the primary and tools Welcome changing requirements, even measure of progress. late in development. Agile processes Agile processes promote sustainable harness change for the customer's Working development. The sponsors, developers, competitive advantage. software over and users should be able to maintain a Deliver working software frequently, constant pace indefinitely. comprehensive from a couple of weeks to a couple of documentation Continuous attention to technical months, with a preference to the excellence and good design enhances shorter timescale. agility. Customer Business people and developers must collaboration Simplicity--the art of maximizing the work together daily throughout the over contract amount of work not done--is essential. project. negotiation The best architectures, requirements, Build projects around motivated and designs emerge from self- individuals. Give them the environment Responding to organizing teams. and support they need, and trust them change over to get the job done. At regular intervals, the team reflects following a on how to become more effective, then The most efficient and effective method plan tunes and adjusts its behavior of conveying information to and within accordingly. quarta-feira, 6 de janeiro de 2010
  • 10. Vamos aos Princípios... quarta-feira, 6 de janeiro de 2010
  • 11. Consequências Locais Estruture o código de forma que as consequências sejam locais. Reduza os efeitos colaterais. Diminua o custo de fazer alterações. quarta-feira, 6 de janeiro de 2010
  • 12. Reduza a Repetição Esse principio contribui para manter as consequências locais. Quando mais cópias do mesmo código, mais cara se torna a mudança. Quebre o sistema em pequenas partes, pequenos pacotes, pequenos métodos, pequenos objetos. quarta-feira, 6 de janeiro de 2010
  • 13. Lógica e Dados devem andar Juntos Na maioria da vezes quando se altera a estrutura dos dados, também se altera a lógica. Se eles estivem juntos a consequência de alterar será local. quarta-feira, 6 de janeiro de 2010
  • 14. Simetria Um método add pede um remove, input, output Um grupo de métodos recebem os mesmos parâmetros Atributos com o mesmo ciclo de vida Faz o código torna-se mais fácil de se ler Se você entender uma parte, entende o todo “A mesma idéia deve ser expressada da mesma forma em todos os lugares” quarta-feira, 6 de janeiro de 2010
  • 15. Expressões Declarativas Expressar-se o máximo que puder quarta-feira, 6 de janeiro de 2010
  • 16. Taxa de Alterações (Rate of Change) setAmont(int value, String currency) { this.value = value; this.currency = currency; } setAmont(int value, String currency) { this.money = new Money(value, currency); } setAmont(Money money) { this.money = money; } Evita Duplicidade e Criar Consequências Locais quarta-feira, 6 de janeiro de 2010
  • 17. Os padrões expressão um ou mais valores de comunicação, simplicidade ou flexibilidade http://www.flickr.com/photos/rxmflickr/4045972780/sizes/l/ quarta-feira, 6 de janeiro de 2010
  • 18. Motivação http://www.flickr.com/photos/tambako/3567125378/sizes/l/ quarta-feira, 6 de janeiro de 2010
  • 19. O Custo do Software Custo Total = Custo de Desenvolver + Custo de Manter quarta-feira, 6 de janeiro de 2010
  • 20. Custo de Manter é maior! Consome mais tempo É mais propenso a erros Tem que aprender o que o código faz quarta-feira, 6 de janeiro de 2010
  • 21. Os Padrões tem o objetivo de gerar Código Claro para o desenvolvimento futuro, reduzindo o custo de manutenção e melhorando a comunicação de programador com programador quarta-feira, 6 de janeiro de 2010
  • 22. Você passa mais tempo lendo do que escrevendo código quarta-feira, 6 de janeiro de 2010
  • 23. Classes http://www.flickr.com/photos/tambako/4112153517/sizes/l/ quarta-feira, 6 de janeiro de 2010
  • 24. Classes e Arquétipos de Platão quarta-feira, 6 de janeiro de 2010
  • 25. Classe “Estes dados vão juntos e essa lógica também” Dados são alterados mais frequentemente do que lógica. Aprender como empacotar lógica em classes e como expressar suas variações é essencial para se programar de forma eficaz com orientação à objetos. quarta-feira, 6 de janeiro de 2010
  • 26. Super-Classe Use herança cautelosamente “Sou parecida com a minha superclasse, apenas um pouco diferente” Reduzir a quantidade de classes em um sistema é uma melhora, na condição de as outras classes não fiquem inchadas quarta-feira, 6 de janeiro de 2010
  • 27. Simple Superclass Name Encontrar o nome perfeito é dos momentos mais satisfatórios da vida de um programador O nome certo implica em simplicidade e expressividade Encontrar o nome certo pode levar horas, dias, meses ou até mesmo anos quarta-feira, 6 de janeiro de 2010
  • 28. Qualified Subclass Name O Nome de uma sub-classe deve comunicar duas coisas 1. Com que classe ela se parece 2. No que ela é diferente Boleto BoletoSimples BoletoRegistrado quarta-feira, 6 de janeiro de 2010
  • 29. Abstract Interface “Aumentar o número de interfaces não diminuem o custo do software.” Uma nova interface é algo a mais para compreender, documentar, debugar, organizar, navegar e nomear. Pague esse preço quando realmente precisar da flexibilidade de uma interface. quarta-feira, 6 de janeiro de 2010
  • 30. Mudança é Ruim? “Esses dias li uma lista com todas as razões pelas quais mudanças ocorrem em software, negligência do levantamento de requistos, bla, bla.... A lista assumia que todas as mudanças eram ruins.” quarta-feira, 6 de janeiro de 2010
  • 31. Mudança é Ruim? Porque a previsão do tempo é realizada para um ano inteiro de uma só vez? Porque o tempo muda de maneiras imprevisíveis! Em Java, Interfaces e Classes abstratas podem te ajudar a conseguir flexibilidade quando for preciso. quarta-feira, 6 de janeiro de 2010
  • 32. Interfaces File < FileImpl IFile < File quarta-feira, 6 de janeiro de 2010
  • 33. Interfaces Versionadas O que você faz quado precisa alterar uma interface mas não pode? Crie uma nova interface que extende a anterior e utilize instanceof para verificar se pode utilizar a nova operação! quarta-feira, 6 de janeiro de 2010
  • 34. Interfaces Versionadas interface Command { void run(); } interface ResersibleCommand extends Command { void undo(); } ... if (recent instanceof ReversibleCommand) ((ReversibleCommand) recent).undo() ... quarta-feira, 6 de janeiro de 2010
  • 35. Value Object quarta-feira, 6 de janeiro de 2010
  • 36. Value Object São objetos que depois de criados nunca mais tem seus valores alterados. Exemplos desse padrão na linguagem Java: Integer, Float, String, BigDecimal, Double quarta-feira, 6 de janeiro de 2010
  • 37. Value Object Transação { int valor; (int valor, Conta credito, Conta debito) { this.valor = valor; credit.addCredito(this); debit.addDebit(this); } int getValor() { return this.valor; } } quarta-feira, 6 de janeiro de 2010
  • 38. Class Specialization SubClass quarta-feira, 6 de janeiro de 2010
  • 39. Subclass É um forma de dizer “Esse objeto é semelhante a aquele exceto...” quarta-feira, 6 de janeiro de 2010
  • 40. Cuidado com o Anti-Pattern de Hierarquias Paralelas Duplicidade, Complexidade e Acoplamento Contrato Produto ContratoDeSeguro ContratoDeSeguro ContratoDePensão ContratoDePensão quarta-feira, 6 de janeiro de 2010
  • 41. Inner Class Static and Non-Static quarta-feira, 6 de janeiro de 2010
  • 42. Instance Specific Behavior quarta-feira, 6 de janeiro de 2010
  • 43. Condicionais Cuidado com a Duplicidade public void display() { public void contains() { switch(getType()) { switch(getType()) { case MOUSE_DOWN: case MOUSE_DOWN: //.. //.. break; break; case SELECT: case SELECT: //.. //.. break; break; case MOUSE_OVER: case MOUSE_OVER: //.. //.. break; break; } } } } quarta-feira, 6 de janeiro de 2010
  • 44. Imagine que você agora, precisa adicionar um novo tipo... Será preciso alterar todos os métodos incluindo um nova entrada no swtich case statement. quarta-feira, 6 de janeiro de 2010
  • 45. Delegation A lógica comum deve fica na referring class e a especifica nos delegates. quarta-feira, 6 de janeiro de 2010
  • 46. Delegation É comum passar a referência do delegador // Graphic Editor public void mouseDown() { tool.mouseDown(this); } // Retangle Tool public void mouseDown(Editor editor) { editor.add(new RetangleFigure()); } Ou Passe o Delegator no Construtor do Delegating Object quarta-feira, 6 de janeiro de 2010
  • 47. Pluggable Selector Quando existem poucas implementações Crie todos os métodos em uma única classe e armazene os nomes dos métodos em Strings e chame-os através de reflection. Como é feito no JUnit: String name; public void runTest() { Class[] noArguments = new Class[0]; Method method = getClass().getMethod(name, noArguments); method.invoke(this, new Object[0]); } quarta-feira, 6 de janeiro de 2010
  • 48. Anonymous Inner Class public class Pato { Habilidade andar = new Habilidade() { public void fazer() { //... } }; } quarta-feira, 6 de janeiro de 2010
  • 49. Anonymous Inner Class Difícil de Testar Como a classe não possui nome é você não pode expressar sua intenção facilmente Pode tornar o código mais difícil de ler quarta-feira, 6 de janeiro de 2010
  • 50. ? O que você pode fazer quando precisa de alguma funcionalidade que não encaixa em nenhum objeto quarta-feira, 6 de janeiro de 2010
  • 51. ? Que tal criar uma classe cheia de métodos estáticos com essas funcionalidades quarta-feira, 6 de janeiro de 2010
  • 52. Library Class public class Collections { //.. public static <T extends Comparable<? super T>> void sort(List<T> list) { Object[] a = list.toArray(); Arrays.sort(a); ListIterator<T> i = list.listIterator(); for (int j=0; j<a.length; j++) { i.next(); i.set((T)a[j]); } } //.. } quarta-feira, 6 de janeiro de 2010
  • 53. Library Class Não têm Estado Difícil de Testar Procedural quarta-feira, 6 de janeiro de 2010
  • 54. Estado http://www.flickr.com/photos/tambako/2701117725/sizes/l/ quarta-feira, 6 de janeiro de 2010
  • 55. State Trabalha com valores que que variam ao longo do tempo “Olhe para o sol, espere uma hora e olhe novo, ele já não estará mais no mesmo lugar“ quarta-feira, 6 de janeiro de 2010
  • 56. Cuidado! Estado e concorrência não se dão muito bem. quarta-feira, 6 de janeiro de 2010
  • 57. Separar Estados Quando tiver dúvida, pergunte-se se os atributos devem nascem e morrem ao mesmo tempo. Se a reposta for sim, eles devem ficar juntos. quarta-feira, 6 de janeiro de 2010
  • 58. Access Mantém a Flexibilidade limitando o acesso ao estado quarta-feira, 6 de janeiro de 2010
  • 59. Access A distinção entre acessar dados armazenados e invocar computações é uma dicotomia das linguagens de programação. quarta-feira, 6 de janeiro de 2010
  • 60. Direct Access Acessa o estado de um objeto diretamente. Geralmente utilizados em métodos acessores e construtores. quarta-feira, 6 de janeiro de 2010
  • 61. Legibilidade numeroDeFilhos = 10; porta = 1; abrirPorta(); porta.abrir(); quarta-feira, 6 de janeiro de 2010
  • 62. Indirect Access Acessa o estado de um objeto através de métodos para aumentar a flexibilidade quarta-feira, 6 de janeiro de 2010
  • 63. Indirect Access “Minha estratégia padrão é permitir acesso direto à própria classe, incluindo inner classes, e acesso indireto à classes clientes” Kent Beck quarta-feira, 6 de janeiro de 2010
  • 64. Common State Armazena o estado comum a todos os objetos de uma classe. quarta-feira, 6 de janeiro de 2010
  • 65. Exemplo do Cartesiano class Point { int x; int y; } Todos os atributos compartilham o mesmo ciclo de vida. quarta-feira, 6 de janeiro de 2010
  • 66. Variable State Armazena o estado que variam de instancia para instancia em um mapa Alta Flexibidade Comunicação Pobre quarta-feira, 6 de janeiro de 2010
  • 67. Variable State public class ObjetoFlexivel { Map<String, Object> properties = new HashMap<String, Object>(); public Object getProperty(final String key) { return properties.get(key); } public void setProperty(final String key, final Object value) { properties.put(key, value); } } Use prefixos para representar propriedades relacionadas: border, borderColor, borderWidth... quarta-feira, 6 de janeiro de 2010
  • 68. Variable Variáveis provêem um namespace para acessar o estado. Leitores devem entender facilmente o escopo, o ciclo de vida e o papel de uma variável. quarta-feira, 6 de janeiro de 2010
  • 69. Escopo Local Atributo (Field) Estático + Modificadores (private, default, protected, public) quarta-feira, 6 de janeiro de 2010
  • 70. Local Variable Variáveis Locais detém o estado de um escopo único quarta-feira, 6 de janeiro de 2010
  • 71. Variável Local Coletora Coleta Informações para uso posterior. Geralmente são usadas no retorno de métodos, neste caso chame de result ou results. quarta-feira, 6 de janeiro de 2010
  • 72. Variável Local Contadora Um Tipo de Especial de Variável Coletora que armazena a contagem de objetos. quarta-feira, 6 de janeiro de 2010
  • 73. Variável Local Explicatória Quando há um cálculo complexa armazene suas partes variáveis para facilitar a leitura. int top = 10; int left = 10; int heigth = 10; int width = 10; new Retangle(top, left, height, width); quarta-feira, 6 de janeiro de 2010
  • 74. Variável Local de Reuso Quando você precisa utilizar o mesmo valor mais de uma vez. long now = System.currentTimeMills(); for (Clock each: getClocks()) each.setTime(now); quarta-feira, 6 de janeiro de 2010
  • 75. Field Fields armazenam o estado de vida de um objeto. Elas nascem e morrem junto com o objeto. quarta-feira, 6 de janeiro de 2010
  • 76. Helper Field Helper Fields guardam referências de objetos que são usados por vários métodos. Se um objeto é passado por parâmetro para muitos métodos, considere torná-lo um field quarta-feira, 6 de janeiro de 2010
  • 77. Flag Field Flag Fields indicam que o objeto pode ter dois tipos de comportamentos diferentes. Se houver um setter para esse field o comportamento pode ser mudado ao longo da vida do objeto. Atenção: Se houver muitas consultas repetitivas a flag para determinar o comportamento do objeto, analise a possibilidade de usar o padrão Strategy quarta-feira, 6 de janeiro de 2010
  • 78. Strategy Quando você quiser expressar que existem formas diferentes de realizar parte do comportamento do objeto crie um strategy field. Se ele puder mudar ao longo da vida do objeto, crie um setter, caso contrário defina no construtor. quarta-feira, 6 de janeiro de 2010
  • 79. Components Atributos componentes contém objetos ou dados que pertencem ao objeto em questão. Carro Motor quarta-feira, 6 de janeiro de 2010
  • 80. Parameter Parâmetros comunicam o estado durante a execução de um único método quarta-feira, 6 de janeiro de 2010
  • 81. Parameter Além de variáveis não privadas, a única forma de comunicar o estado de um objeto para outro é através de parâmetros. quarta-feira, 6 de janeiro de 2010
  • 82. Parameter O acoplamento introduzido por um parâmetro é bem menor do que uma referência de permanente (atributo) de um objeto para outro. quarta-feira, 6 de janeiro de 2010
  • 83. Parameter Quando um parâmetro se repete em muitos métodos de um objeto, é muito provável que ele deva ser uma atributo. quarta-feira, 6 de janeiro de 2010
  • 84. quarta-feira, 6 de janeiro de 2010
  • 86. Collection Parametor Passa um parâmetro para coletar resultados complicados de múltiplos métodos quarta-feira, 6 de janeiro de 2010
  • 87. Collection Parametor void listar() { List results = new ArrayList(); addTo(results); return results; } private void adicionar(List elements) { ... } quarta-feira, 6 de janeiro de 2010
  • 88. Optinal Parameter Utilizado em métodos e construtores, também conhecido como Telescoping Pattern public void mascarar() {mascarar(2,2);} public void mascarar(int decimals) { mascarar(decimals, decimals); } public void mascarar(int min, int max) { ... } quarta-feira, 6 de janeiro de 2010
  • 89. Parameter Object Consolida longas listas de parâmetros usados frequentemente em um objeto setBordaExterna ( x,y,w,h ); setBordaInterna ( x+2,y+2,w-4,h-4 ); setBordaExterna ( borda ); setBordaInterna ( borda.expandir(-2) ); quarta-feira, 6 de janeiro de 2010
  • 90. Constant Armazena o estado que não se altera Utilize variáveis static final com nomes em uppercase. Cuidado setAlignment(CENTERED) não comunica também como center() quarta-feira, 6 de janeiro de 2010
  • 91. quarta-feira, 6 de janeiro de 2010
  • 92. • count: armazena contagens • each: armazena elemento durante iterações • result: armazena o valor que a função retornará quarta-feira, 6 de janeiro de 2010
  • 93. Nomeie variáveis de acordo com seus papéis • count: armazena contagens • each: armazena elemento durante iterações • result: armazena o valor que a função retornará quarta-feira, 6 de janeiro de 2010
  • 94. Role-Suggesting Name Nomeie variáveis de acordo com seus papéis • count: armazena contagens • each: armazena elemento durante iterações • result: armazena o valor que a função retornará quarta-feira, 6 de janeiro de 2010
  • 95. Declared Type Declara um tipo genérico para variáveis List<Pessoa> candidatos = new ArrayList<Pessoas>(); quarta-feira, 6 de janeiro de 2010
  • 97. Eager Inicialization Inicializa campos de um instancia em tempo de criação class Clube { List<Pessoa> membros = Lists.newArrayList(); } class Clube { ... Clube() { /* inicialização */ } } quarta-feira, 6 de janeiro de 2010
  • 98. Lazy Inicialization Inicializa campos cujo valores são caros de se calcular apenas antes de serem usados pela primeira vez public List<Pessoa> getMembros() { if (membros == null) { membros = Lists.newArrayList(); } return membros; } quarta-feira, 6 de janeiro de 2010
  • 99. Métodos http://www.flickr.com/photos/tambako/4170480368/sizes/l/ quarta-feira, 6 de janeiro de 2010
  • 100. Intetion-Revealing Method Métodos devem ter nomes que revelem seu objetivo e sejam intuitivos para que um potencial invocador o descubra Customer.findById(id); iterator.hasNext(); quarta-feira, 6 de janeiro de 2010
  • 101. Method Visibility public, package, protected ou private? “Revelar o mínimo possível garante maior flexibilidade” quarta-feira, 6 de janeiro de 2010
  • 102. Method Object Esse padrão pode te ajudar a transformar um código massivo aglomerado em um método impossível em um código legível, limpo e claro, que revela gradualmente suas intenções ao leitor. quarta-feira, 6 de janeiro de 2010
  • 103. Method Object Aqueles métodos, cheios de variáveis temporárias e um montão de parâmetros são ótimos candidatos se transformarem em um objeto, tentar apenas fazer um Extract Method, resultaria em sub- métodos difíceis de nomear com dezenas de variáveis. quarta-feira, 6 de janeiro de 2010
  • 104. Method Object 1. Crie uma classe com o nome do método 2. Crie um atributo para cada parâmetro, variável local e atributos do objeto original usados no método. 3. Crie um construtor que recebe os parâmetros e atributos. 4. Copie o método original para a nova classe substituindo seus parametrôs pelas referencias dos atributos da nova classe. 5. Altere a chamada do método na classe original 6. Se atributos eram definidos na classe original, obtenha-os por getters e defina-os. 7. Agora faça os extract methods necessários para tornar o código mais legível. quarta-feira, 6 de janeiro de 2010
  • 105. Overidden Method Métodos sobre-escritos são uma forma clara de se expressar variações. quarta-feira, 6 de janeiro de 2010
  • 106. Overloaded Method Métodos sobrecarregados representam formas alternativas de se invocar o mesmo método. Todos as versão sobrecarregadas devem servir para o mesmo propósito, caso contrário é melhor procurar um novo nome. quarta-feira, 6 de janeiro de 2010
  • 107. Method Return Type Identificam se o método é uma Procedure (void) ou uma Function (Object). Generalize o tipo de retorno para esconder detalhes de implementação. quarta-feira, 6 de janeiro de 2010
  • 108. Comentários Expresse o máximo de informação possível através de nomes e da escreva estrutura do seu código, comentários somente para o que não estiver óbvio. Evite comentários redundantes. quarta-feira, 6 de janeiro de 2010
  • 109. Helper Method São métodos private que compõe um método público e tornam seu o código mais legível e coeso. quarta-feira, 6 de janeiro de 2010
  • 110. Debug Print Method Implemente o método toString() dos objetos de forma a identificar seu valor facilmente, essa prática pode reduzir significativamente o tempo de debugging . quarta-feira, 6 de janeiro de 2010
  • 111. Conversion Quando você precisa converter um objeto de um tipo em outro de um tipo diferente. quarta-feira, 6 de janeiro de 2010
  • 112. Conversion Method class Farenheight { public Celsius convertToCelsius(Farenheight f) { ... } } quarta-feira, 6 de janeiro de 2010
  • 113. Conversion Contructor class Farenheight { public Farenheight (Celsius c) { ... } } quarta-feira, 6 de janeiro de 2010
  • 114. Construtor Deve representar a criação de um objeto quarta-feira, 6 de janeiro de 2010
  • 115. Factory Method Forma alternativa ao Construtor para representar a criação de um objeto em um método estático. Calculadora c = Calculadora.criar(); Muito útil quando se precisa de caching ou retornar diferentes subclasses dependendo dos parâmetros. quarta-feira, 6 de janeiro de 2010
  • 116. Internal Factory Quando criar ou calcular um objeto for complexo, crie um método que cria e retorna o novo objeto. getX(){ if (x == null) x = computeX(); return x; } quarta-feira, 6 de janeiro de 2010
  • 117. Collection Accessor Method Como prover acesso a uma Collection? public List<Livro> getLivros() { return livros; } Qual o problema dessa implementação? quarta-feira, 6 de janeiro de 2010
  • 118. Collection Accessor Method public List<Livro> getLivros() { return livros; } Apesar de dar máxima flexibilidade, você perde o controle sobre um atributo de seu objeto que pode ser invalidado sem que você saiba. quarta-feira, 6 de janeiro de 2010
  • 119. Unmodifiable Wrapper public List<Livro> getLivros() { return Collections.unmodifiableList(livros); } quarta-feira, 6 de janeiro de 2010
  • 120. Collection Accessor Method public void addLivro(Livro livro) {} public int getQuantidadeDeLivros() {} public Iterator getLivros() {} Uma boa prática é fornecer métodos que para operações limitadas e significativas. Isso melhora a coesão, torna o código mais legível e testável. E você fica no controle. quarta-feira, 6 de janeiro de 2010
  • 121. Boolean Setting Method procure usar cache.ativar(); cache.inativar(); ao invés de cache.setStatus(true); cache.setStatus(false); quarta-feira, 6 de janeiro de 2010
  • 122. Boolean Setting Method a menos que if (booleanVar) cache.ativar(); else cache.inativar(); nesse caso cache.setStatus(booleanVar); quarta-feira, 6 de janeiro de 2010
  • 123. Getting Method quarta-feira, 6 de janeiro de 2010
  • 124. Setting Method void setX(int x){ ... } void centered(){ ... } quarta-feira, 6 de janeiro de 2010
  • 125. http://www.flickr.com/photos/pong/288491653/sizes/o/ Safe Copy public void getLivros() { List<Livro> result = new ArrayList<Livros>(); result.addAll(this.livros); return result; } quarta-feira, 6 de janeiro de 2010
  • 126. Coleções http://www.flickr.com/photos/tambako quarta-feira, 6 de janeiro de 2010
  • 127. Array Simples e Pouco Flexíveis Tamanho Fixo Sintaxe de Acesso Simples Acesso Rápido quarta-feira, 6 de janeiro de 2010
  • 128. Iterable Interface básica que permite apenas que se realizem iterações e nada mais. quarta-feira, 6 de janeiro de 2010
  • 129. Collection Oferece Adição, Remoção e Verificação de Presença. quarta-feira, 6 de janeiro de 2010
  • 130. List Elementos Ordenados que podem ser acessados por sua localização. quarta-feira, 6 de janeiro de 2010
  • 131. Set Um conjunto de elementos sem duplicidade. quarta-feira, 6 de janeiro de 2010
  • 132. SortedSet Um conjunto ordenado de elementos sem duplicidade quarta-feira, 6 de janeiro de 2010
  • 133. Map Um coleção de chaves ligadas a valores quarta-feira, 6 de janeiro de 2010
  • 134. Comunicação As colections Java comunicam o que são o que elas fazem. Esse é o grande beneficio de ter padrões. quarta-feira, 6 de janeiro de 2010
  • 135. Referência Leia o Livro! http://www.amazon.com/Implementation-Patterns-Kent-Beck/dp/0321413091 quarta-feira, 6 de janeiro de 2010
  • 136. OBRIGADO!!!! http://www.flickr.com/photos/tambako quarta-feira, 6 de janeiro de 2010