Implemention Patterns
-
Upload
andre-faria-gomes -
Category
Technology
-
view
2.013 -
download
1
description
Transcript of 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
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/
Simplicidadequarta-feira, 6 de janeiro de 2010
http://www.flickr.com/photos/khalid-almasoud/474399662/sizes/o/
Flexibilidadequarta-feira, 6 de janeiro de 2010
http://www.flickr.com/photos/rxmflickr/2687319911/sizes/l/
Comunicaçãoquarta-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
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
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
Vamos aos Princípios...
quarta-feira, 6 de janeiro de 2010
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
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
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
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
Expressar-se o máximo que puderExpressões Declarativas
quarta-feira, 6 de janeiro de 2010
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
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
Custo Total
= Custo de Desenvolver
+ Custo de Manter
O Custo do Software
quarta-feira, 6 de janeiro de 2010
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
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
“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
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
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
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
“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
“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
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
File < FileImpl
IFile < File
Interfaces
quarta-feira, 6 de janeiro de 2010
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
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
Value Object
quarta-feira, 6 de janeiro de 2010
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
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
Class Specialization
SubClassquarta-feira, 6 de janeiro de 2010
É um forma de dizer “Esse objeto é semelhante a aquele
exceto...”
Subclass
quarta-feira, 6 de janeiro de 2010
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
Inner ClassStatic and Non-Static
quarta-feira, 6 de janeiro de 2010
Instance Specific Behavior
quarta-feira, 6 de janeiro de 2010
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
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
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
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
AnonymousInner Class
public class Pato {
Habilidade andar = new Habilidade() { public void fazer() { //... } };}
quarta-feira, 6 de janeiro de 2010
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
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 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
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
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
Cuidado!
Estado e concorrência não se dão muito bem.
quarta-feira, 6 de janeiro de 2010
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
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 Cartesianoclass Point {int x;int y;
}
Todos os atributos compartilham o mesmo ciclo de vida.
quarta-feira, 6 de janeiro de 2010
Variable StateArmazena o estado que variam de
instancia para instancia em um mapa
Alta FlexibidadeComunicação Pobre
quarta-feira, 6 de janeiro de 2010
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
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
EscopoLocal
Atributo(Field)
Estático
+ Modificadores(private, default, protected, public)
quarta-feira, 6 de janeiro de 2010
Local VariableVariá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ó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
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
FieldFields armazenam o estado de vida de um objeto. Elas nascem e morrem junto
com o objeto.
quarta-feira, 6 de janeiro de 2010
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
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
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
ComponentsAtributos componentes contém objetos ou dados que pertencem ao objeto em
questão.
Carro Motor
quarta-feira, 6 de janeiro de 2010
ParameterParâmetros comunicam o estado durante
a execução de um único método
quarta-feira, 6 de janeiro de 2010
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
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
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
quarta-feira, 6 de janeiro de 2010
Collection Parametor
quarta-feira, 6 de janeiro de 2010
Collection ParametorPassa um parâmetro para coletar
resultados complicados de múltiplos métodos
quarta-feira, 6 de janeiro de 2010
Collection Parametorvoid listar() { List results = new ArrayList(); addTo(results); return results;}
private void adicionar(List elements) { ...}
quarta-feira, 6 de janeiro de 2010
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
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
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
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
• 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
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
Declared Type
List<Pessoa> candidatos = new ArrayList<Pessoas>();
Declara um tipo genérico para variáveis
quarta-feira, 6 de janeiro de 2010
Inicializationquarta-feira, 6 de janeiro de 2010
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
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
Métodoshttp://www.flickr.com/photos/tambako/4170480368/sizes/l/
quarta-feira, 6 de janeiro de 2010
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
Method Visibilitypublic, package, protected ou private?
“Revelar o mínimo possível garante maior flexibilidade”
quarta-feira, 6 de janeiro de 2010
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
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
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
Overidden MethodMétodos sobre-escritos são
uma forma clara de se expressar
variações.
quarta-feira, 6 de janeiro de 2010
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
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
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
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 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
ConversionQuando você precisa converter um objeto de um tipo em outro de
um tipo diferente.
quarta-feira, 6 de janeiro de 2010
Conversion Methodclass Farenheight {
public Celsius convertToCelsius(Farenheight f) { ... }
}
quarta-feira, 6 de janeiro de 2010
Conversion Contructorclass Farenheight {
public Farenheight (Celsius c) { ... }
}
quarta-feira, 6 de janeiro de 2010
ConstrutorDeve representar a criação de um
objeto
quarta-feira, 6 de janeiro de 2010
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
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
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 Wrapperpublic List<Livro> getLivros() { return Collections.unmodifiableList(livros);}
quarta-feira, 6 de janeiro de 2010
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
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
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
Getting Method
quarta-feira, 6 de janeiro de 2010
Setting Methodvoid setX(int x){ ... }
void centered(){ ... }
quarta-feira, 6 de janeiro de 2010
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
Coleções
http://www.flickr.com/photos/tambako
quarta-feira, 6 de janeiro de 2010
ArraySimples e Pouco Flexíveis
Tamanho FixoSintaxe de Acesso Simples
Acesso Rápido
quarta-feira, 6 de janeiro de 2010
IterableInterface básica que permite apenas que
se realizem iterações e nada mais.
quarta-feira, 6 de janeiro de 2010
CollectionOferece Adição, Remoção e Verificação de
Presença.
quarta-feira, 6 de janeiro de 2010
ListElementos Ordenados que podem ser
acessados por sua localização.
quarta-feira, 6 de janeiro de 2010
SetUm conjunto de elementos sem
duplicidade.
quarta-feira, 6 de janeiro de 2010
SortedSetUm conjunto ordenado de elementos
sem duplicidade
quarta-feira, 6 de janeiro de 2010
MapUm coleção de chaves ligadas a valores
quarta-feira, 6 de janeiro de 2010
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
Referência
http://www.amazon.com/Implementation-Patterns-Kent-Beck/dp/0321413091
Leia o Livro!
quarta-feira, 6 de janeiro de 2010
OBRIGADO!!!!
http://www.flickr.com/photos/tambako
quarta-feira, 6 de janeiro de 2010