implemention patterns

136
Padrões de Implementação com Java de Kent Beck André Faria Gomes http://www.flickr.com/photos/tambako/4112834255/sizes/l/in/set-72157600220682086/ quarta-feira, 6 de janeiro de 2010

Upload: andre-faria-gomes

Post on 17-Nov-2014

2.012 views

Category:

Technology


1 download

DESCRIPTION

Palestra sobre o livro Implemention Patterns de Kent Beck

TRANSCRIPT

Page 1: Implemention Patterns

Padrões de Implementação

com Javade Kent Beck

André Faria Gomes

http://www.flickr.com/photos/tambako/4112834255/sizes/l/in/set-72157600220682086/

quarta-feira, 6 de janeiro de 2010

Page 2: Implemention Patterns

Valores e Princípios

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

Page 3: Implemention Patterns

Valores são conceitos que guiam nossas escolhas.

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

quarta-feira, 6 de janeiro de 2010

Page 4: Implemention Patterns

http://www.flickr.com/photos/sgw/2857641872/sizes/l/

Simplicidadequarta-feira, 6 de janeiro de 2010

Page 5: Implemention Patterns

http://www.flickr.com/photos/khalid-almasoud/474399662/sizes/o/

Flexibilidadequarta-feira, 6 de janeiro de 2010

Page 6: Implemention Patterns

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

Comunicaçãoquarta-feira, 6 de janeiro de 2010

Page 7: Implemention Patterns

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

Page 8: Implemention Patterns

Os princípios são baseados nos valores e são mais concretosAjudam a agir conforme os valores e são mais fácil de serem traduzidos à

práticas

http://www.flickr.com/photos/werkunz/3680331543

Princípios

São como guiasquarta-feira, 6 de janeiro de 2010

Page 9: Implemention Patterns

Individuals andinteractions

over processes and tools

Working software over comprehensivedocumentation

Customer collaboration over contract negotiation

Responding to change over following a

plan

Our highest priority is to satisfy the customer through early and continuous

delivery of valuable software.

Welcome changing requirements, even late in development. Agile processes harness change for the customer's

competitive advantage.

Deliver working software frequently, from a couple of weeks to a couple of months, with a preference to the

shorter timescale.

Business people and developers must work together daily throughout the

project.

Build projects around motivated individuals. Give them the environment and support they need, and trust them

to get the job done.

The most efficient and effective method of conveying information to and within

a development team is face-to-face conversation.

Working software is the primary measure of progress.

Agile processes promote sustainable development. The sponsors, developers, and users should be able to maintain a

constant pace indefinitely.

Continuous attention to technical excellence and good design enhances

agility.

Simplicity--the art of maximizing the amount of work not done--is essential.

The best architectures, requirements, and designs emerge from self-

organizing teams.

At regular intervals, the team reflects on how to become more effective, then

tunes and adjusts its behavior accordingly.

Agile Manifesto - Values and Principles

quarta-feira, 6 de janeiro de 2010

Page 10: Implemention Patterns

Vamos aos Princípios...

quarta-feira, 6 de janeiro de 2010

Page 11: Implemention Patterns

Estruture o código de forma que as consequências sejam locais. Reduza os efeitos colaterais. Diminua o custo de

fazer alterações.

Consequências Locais

quarta-feira, 6 de janeiro de 2010

Page 12: Implemention Patterns

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.

Reduza a Repetição

quarta-feira, 6 de janeiro de 2010

Page 13: Implemention Patterns

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.

Lógica e Dados devem andar Juntos

quarta-feira, 6 de janeiro de 2010

Page 14: Implemention Patterns

Um método add pede um remove, input, outputUm grupo de métodos recebem os mesmos

parâmetros

Atributos com o mesmo ciclo de vidaFaz 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”

Simetria

quarta-feira, 6 de janeiro de 2010

Page 15: Implemention Patterns

Expressar-se o máximo que puderExpressões Declarativas

quarta-feira, 6 de janeiro de 2010

Page 16: Implemention Patterns

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;

}

Taxa de Alterações (Rate of Change)

Evita Duplicidade e Criar Consequências Locais

quarta-feira, 6 de janeiro de 2010

Page 17: Implemention Patterns

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

Page 18: Implemention Patterns

Motivação

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

quarta-feira, 6 de janeiro de 2010

Page 19: Implemention Patterns

Custo Total

= Custo de Desenvolver

+ Custo de Manter

O Custo do Software

quarta-feira, 6 de janeiro de 2010

Page 20: Implemention Patterns

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

Custo de Manter

é maior!

quarta-feira, 6 de janeiro de 2010

Page 21: Implemention Patterns

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

Page 22: Implemention Patterns

Você passa mais

tempo lendo

do que escrevendo código

quarta-feira, 6 de janeiro de 2010

Page 23: Implemention Patterns

Classes http://www.flickr.com/photos/tambako/4112153517/sizes/l/

quarta-feira, 6 de janeiro de 2010

Page 24: Implemention Patterns

Classes e Arquétipos de Platão

quarta-feira, 6 de janeiro de 2010

Page 25: Implemention Patterns

“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.

Classe

quarta-feira, 6 de janeiro de 2010

Page 26: Implemention Patterns

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

Super-Classe

quarta-feira, 6 de janeiro de 2010

Page 27: Implemention Patterns

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

Simple Superclass Name

quarta-feira, 6 de janeiro de 2010

Page 28: Implemention Patterns

O Nome de uma sub-classe deve comunicar duas coisas

1. Com que classe ela se parece2. No que ela é diferente

BoletoBoletoSimplesBoletoRegistrado

Qualified Subclass Name

quarta-feira, 6 de janeiro de 2010

Page 29: Implemention Patterns

“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.

Abstract Interface

quarta-feira, 6 de janeiro de 2010

Page 30: Implemention Patterns

“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.”

Mudança é Ruim?

quarta-feira, 6 de janeiro de 2010

Page 31: Implemention Patterns

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.

Mudança é Ruim?

quarta-feira, 6 de janeiro de 2010

Page 32: Implemention Patterns

File < FileImpl

IFile < File

Interfaces

quarta-feira, 6 de janeiro de 2010

Page 33: Implemention Patterns

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!

Interfaces Versionadas

quarta-feira, 6 de janeiro de 2010

Page 34: Implemention Patterns

interface Command { void run(); }

interface ResersibleCommand extends Command { void undo();}

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

Interfaces Versionadas

quarta-feira, 6 de janeiro de 2010

Page 35: Implemention Patterns

Value Object

quarta-feira, 6 de janeiro de 2010

Page 36: Implemention Patterns

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

Value Object

quarta-feira, 6 de janeiro de 2010

Page 37: Implemention Patterns

Value ObjectTransaçã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

Page 38: Implemention Patterns

Class Specialization

SubClassquarta-feira, 6 de janeiro de 2010

Page 39: Implemention Patterns

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

exceto...”

Subclass

quarta-feira, 6 de janeiro de 2010

Page 40: Implemention Patterns

Cuidado com o Anti-Pattern de Hierarquias Paralelas

Contrato Produto

ContratoDeSeguro

ContratoDePensão

ContratoDeSeguro

ContratoDePensão

Duplicidade, Complexidade e Acoplamento

quarta-feira, 6 de janeiro de 2010

Page 41: Implemention Patterns

Inner ClassStatic and Non-Static

quarta-feira, 6 de janeiro de 2010

Page 42: Implemention Patterns

Instance Specific Behavior

quarta-feira, 6 de janeiro de 2010

Page 43: Implemention Patterns

CondicionaisCuidado com a Duplicidade

public void display() {switch(getType()) {

case MOUSE_DOWN://.. break;case SELECT://.. break;case MOUSE_OVER://.. break;

}}

public void contains() {switch(getType()) {

case MOUSE_DOWN://.. break;case SELECT://.. break;case MOUSE_OVER://.. break;

}}

quarta-feira, 6 de janeiro de 2010

Page 44: Implemention Patterns

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

Page 45: Implemention Patterns

Delegation

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

quarta-feira, 6 de janeiro de 2010

Page 46: Implemention Patterns

DelegationÉ comum passar a referência do delegador

Ou Passe o Delegator no Construtor do Delegating Object

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

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

quarta-feira, 6 de janeiro de 2010

Page 47: Implemention Patterns

Pluggable SelectorQuando 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

Page 48: Implemention Patterns

AnonymousInner Class

public class Pato {

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

quarta-feira, 6 de janeiro de 2010

Page 49: Implemention Patterns

AnonymousInner 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

Page 50: Implemention Patterns

O que você pode fazer quando

precisa de alguma funcionalidade que não encaixa em nenhum objeto?

quarta-feira, 6 de janeiro de 2010

Page 51: Implemention Patterns

Que tal criar uma classe cheia de

métodos estáticos com essas

funcionalidades?quarta-feira, 6 de janeiro de 2010

Page 52: Implemention Patterns

Library Classpublic 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

Page 53: Implemention Patterns

Library Class Não têm Estado

Difícil de Testar

Procedural

quarta-feira, 6 de janeiro de 2010

Page 54: Implemention Patterns

Estado

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

quarta-feira, 6 de janeiro de 2010

Page 55: Implemention Patterns

StateTrabalha 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

Page 56: Implemention Patterns

Cuidado!

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

quarta-feira, 6 de janeiro de 2010

Page 57: Implemention Patterns

Separar EstadosQuando 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

Page 58: Implemention Patterns

Access

Mantém a Flexibilidade limitando o acesso ao estado

quarta-feira, 6 de janeiro de 2010

Page 59: Implemention Patterns

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

Page 60: Implemention Patterns

Direct Access

Acessa o estado de um objeto diretamente.

Geralmente utilizados em métodos acessores e construtores.

quarta-feira, 6 de janeiro de 2010

Page 61: Implemention Patterns

Legibilidade

numeroDeFilhos = 10;

porta = 1;

abrirPorta();

porta.abrir();

quarta-feira, 6 de janeiro de 2010

Page 62: Implemention Patterns

Indirect Access

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

quarta-feira, 6 de janeiro de 2010

Page 63: Implemention Patterns

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

Page 64: Implemention Patterns

Common State

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

quarta-feira, 6 de janeiro de 2010

Page 65: Implemention Patterns

Exemplo do Cartesianoclass Point {int x;int y;

}

Todos os atributos compartilham o mesmo ciclo de vida.

quarta-feira, 6 de janeiro de 2010

Page 66: Implemention Patterns

Variable StateArmazena o estado que variam de

instancia para instancia em um mapa

Alta FlexibidadeComunicação Pobre

quarta-feira, 6 de janeiro de 2010

Page 67: Implemention Patterns

Variable Statepublic 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

Page 68: Implemention Patterns

VariableVariá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

Page 69: Implemention Patterns

EscopoLocal

Atributo(Field)

Estático

+ Modificadores(private, default, protected, public)

quarta-feira, 6 de janeiro de 2010

Page 70: Implemention Patterns

Local VariableVariáveis Locais detém o estado de um

escopo único

quarta-feira, 6 de janeiro de 2010

Page 71: Implemention Patterns

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

Page 72: Implemention Patterns

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

Page 73: Implemention Patterns

Variável Local ExplicatóriaQuando 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

Page 74: Implemention Patterns

Variável Local de ReusoQuando 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

Page 75: Implemention Patterns

FieldFields armazenam o estado de vida de um objeto. Elas nascem e morrem junto

com o objeto.

quarta-feira, 6 de janeiro de 2010

Page 76: Implemention Patterns

Helper FieldHelper 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

Page 77: Implemention Patterns

Flag FieldFlag 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

Page 78: Implemention Patterns

StrategyQuando 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

Page 79: Implemention Patterns

ComponentsAtributos componentes contém objetos ou dados que pertencem ao objeto em

questão.

Carro Motor

quarta-feira, 6 de janeiro de 2010

Page 80: Implemention Patterns

ParameterParâmetros comunicam o estado durante

a execução de um único método

quarta-feira, 6 de janeiro de 2010

Page 81: Implemention Patterns

ParameterAlé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

Page 82: Implemention Patterns

ParameterO 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

Page 83: Implemention Patterns

ParameterQuando 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

Page 84: Implemention Patterns

quarta-feira, 6 de janeiro de 2010

Page 85: Implemention Patterns

Collection Parametor

quarta-feira, 6 de janeiro de 2010

Page 86: Implemention Patterns

Collection ParametorPassa um parâmetro para coletar

resultados complicados de múltiplos métodos

quarta-feira, 6 de janeiro de 2010

Page 87: Implemention Patterns

Collection Parametorvoid listar() { List results = new ArrayList(); addTo(results); return results;}

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

quarta-feira, 6 de janeiro de 2010

Page 88: Implemention Patterns

Optinal Parameter

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

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

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

Utilizado em métodos e construtores, também conhecido como Telescoping

Pattern

quarta-feira, 6 de janeiro de 2010

Page 89: Implemention Patterns

Parameter ObjectConsolida 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

Page 90: Implemention Patterns

ConstantArmazena 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

Page 91: Implemention Patterns

quarta-feira, 6 de janeiro de 2010

Page 92: Implemention Patterns

• 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

Page 93: Implemention Patterns

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

Nomeie variáveis de acordo com seus papéis

quarta-feira, 6 de janeiro de 2010

Page 94: Implemention Patterns

Role-Suggesting Name

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

Nomeie variáveis de acordo com seus papéis

quarta-feira, 6 de janeiro de 2010

Page 95: Implemention Patterns

Declared Type

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

Declara um tipo genérico para variáveis

quarta-feira, 6 de janeiro de 2010

Page 96: Implemention Patterns

Inicializationquarta-feira, 6 de janeiro de 2010

Page 97: Implemention Patterns

Eager Inicialization

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

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

Inicializa campos de um instancia em tempo de criação

quarta-feira, 6 de janeiro de 2010

Page 98: Implemention Patterns

Lazy InicializationInicializa 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

Page 99: Implemention Patterns

Métodoshttp://www.flickr.com/photos/tambako/4170480368/sizes/l/

quarta-feira, 6 de janeiro de 2010

Page 100: Implemention Patterns

Intetion-RevealingMethod

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

Page 101: Implemention Patterns

Method Visibilitypublic, package, protected ou private?

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

quarta-feira, 6 de janeiro de 2010

Page 102: Implemention Patterns

Method ObjectEsse 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

Page 103: Implemention Patterns

Method ObjectAqueles 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

Page 104: Implemention Patterns

Method Object1. 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

Page 105: Implemention Patterns

Overidden MethodMétodos sobre-escritos são

uma forma clara de se expressar

variações.

quarta-feira, 6 de janeiro de 2010

Page 106: Implemention Patterns

Overloaded MethodMé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

Page 107: Implemention Patterns

Method Return Type

Generalize o tipo de retorno para

esconder detalhes de implementação.

Identificam se o método é uma Procedure (void) ou uma Function

(Object).

quarta-feira, 6 de janeiro de 2010

Page 108: Implemention Patterns

ComentáriosExpresse o máximo de informação possível através de nomes e da

estrutura do seu código, escreva comentários somente para o

que não estiver óbvio.

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

Page 109: Implemention Patterns

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

Page 110: Implemention Patterns

Debug Print MethodImplemente 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

Page 111: Implemention Patterns

ConversionQuando você precisa converter um objeto de um tipo em outro de

um tipo diferente.

quarta-feira, 6 de janeiro de 2010

Page 112: Implemention Patterns

Conversion Methodclass Farenheight {

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

}

quarta-feira, 6 de janeiro de 2010

Page 113: Implemention Patterns

Conversion Contructorclass Farenheight {

public Farenheight (Celsius c) { ... }

}

quarta-feira, 6 de janeiro de 2010

Page 114: Implemention Patterns

ConstrutorDeve representar a criação de um

objeto

quarta-feira, 6 de janeiro de 2010

Page 115: Implemention Patterns

Factory MethodForma 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

Page 116: Implemention Patterns

Internal FactoryQuando 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

Page 117: Implemention Patterns

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

Page 118: Implemention Patterns

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

Page 119: Implemention Patterns

Unmodifiable Wrapperpublic List<Livro> getLivros() { return Collections.unmodifiableList(livros);}

quarta-feira, 6 de janeiro de 2010

Page 120: Implemention Patterns

Collection Accessor Methodpublic 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

Page 121: Implemention Patterns

Boolean Setting Method

ao invés de

procure usar

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

cache.setStatus(true);cache.setStatus(false);

quarta-feira, 6 de janeiro de 2010

Page 122: Implemention Patterns

Boolean Setting Method

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

a menos que

nesse caso

cache.setStatus(booleanVar);

quarta-feira, 6 de janeiro de 2010

Page 123: Implemention Patterns

Getting Method

quarta-feira, 6 de janeiro de 2010

Page 124: Implemention Patterns

Setting Methodvoid setX(int x){ ... }

void centered(){ ... }

quarta-feira, 6 de janeiro de 2010

Page 125: Implemention Patterns

Safe Copy

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

http://www.flickr.com/photos/pong/288491653/sizes/o/

quarta-feira, 6 de janeiro de 2010

Page 126: Implemention Patterns

Coleções

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

quarta-feira, 6 de janeiro de 2010

Page 127: Implemention Patterns

ArraySimples e Pouco Flexíveis

Tamanho FixoSintaxe de Acesso Simples

Acesso Rápido

quarta-feira, 6 de janeiro de 2010

Page 128: Implemention Patterns

IterableInterface básica que permite apenas que

se realizem iterações e nada mais.

quarta-feira, 6 de janeiro de 2010

Page 129: Implemention Patterns

CollectionOferece Adição, Remoção e Verificação de

Presença.

quarta-feira, 6 de janeiro de 2010

Page 130: Implemention Patterns

ListElementos Ordenados que podem ser

acessados por sua localização.

quarta-feira, 6 de janeiro de 2010

Page 131: Implemention Patterns

SetUm conjunto de elementos sem

duplicidade.

quarta-feira, 6 de janeiro de 2010

Page 132: Implemention Patterns

SortedSetUm conjunto ordenado de elementos

sem duplicidade

quarta-feira, 6 de janeiro de 2010

Page 133: Implemention Patterns

MapUm coleção de chaves ligadas a valores

quarta-feira, 6 de janeiro de 2010

Page 134: Implemention Patterns

ComunicaçãoAs 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

Page 135: Implemention Patterns

Referência

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

Leia o Livro!

quarta-feira, 6 de janeiro de 2010

Page 136: Implemention Patterns

OBRIGADO!!!!

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

quarta-feira, 6 de janeiro de 2010