Boas Práticas
de desenvolvimento
de software
Olá!
Eu sou Carlos Alberto
Arquiteto de software
CAPES
@euprogramador
euprogramador@gmail.com
Desenvolvimento de
software é difícil
Como organizar o código?
“Se você está tendo um problema
no desenvolvimento, você não
está sozinho. Outro já passou
pelo mesmo problema e já deve
ter solução para o problema.
S.O.L.I.D.
Princípio de desenvolvimento
S ingle principle
O pen closed
L iskov Substitution
I nterface segregation
D ependency Inversion
S.O.L.I.D.
Single responsability
× Sua classe deve ser responsável por apenas um
comportamento
× Deve fazer apenas 1 coisa
× Deve fazer bem
Single responsability
O que há de errado nessa classe?
Single responsability
Após aplicar Single responsability?
× Classes devem poder extender seu
comportamento, facilmente, seja por herança,
interface ou composição.
× Temos de ter boas abstrações.
Open Closed
Exemplo de open/closed
Open Closed
Liskov Substitution
× Herança é bom.
× Cuidado com a herança.
× Projeto por contrato.
× Estabelece regras para uso
× Pré condições - não podem ser mais fortes
que a super-classe.
× Pós condições - não podem ser
enfraquecidas
Eventualmente desenvolvedor escolhe herança
Liskov Substitution
Exemplo de bom uso:
Liskov Substitution
Exemplo de problemas com o uso de herança:
× Properties não deveria ser uma Hashtable, pois tem o put(object,
object) se for usado pode causar problemas.
× Vector é sincronizado, todas as stacks deveriam ser
sincronizadas?
Liskov Substitution
Exemplo de problemas com o uso de herança:
× CEP você busca do correios
× CEP deveria pode salvar ou
remover?
Liskov Substitution
Alternativas para o uso de herança? Composição:
Interface Segregation
× Módulos enxutos
× Pouco comportamento (método)
× Desenvolvimento orientado a interface
Interface Segregation
Exemplo:
Dependency Inversion
× Dependa de abstrações não implementações
× Facilita mudar no futuro
Dependency Inversion
Exemplo:
Padrões de Projeto - Principios de design
Princípios
Dependency Injection
Inversion of Control
Inversion of control
× Princípio de Hollywood, “Não ligue para nós, nós ligamos para
você.”
× Controle das chamadas é invertido não é determinado pelo
programador.
× Controle é delegado a uma infraestrutura, container.
Inversion of control - Exemplos
Spring:
Inversion of control - Exemplos
Weld/CDI:
Dependency Injection
Benefícios
Baixo acomplamento
Testabilidade
Facilidade de manutenção
Dependency Injection
Tipos
Constructor Injection
Property Injection
Method Injection
Service Locator
Dependency Injection
Constructor Injection
Property Injection
Dependency Injection
Method Injection
Dependency Injection
Dependency Injection
Service Locator
Dependency Injection
Melhor Padrão
× Injeção no construtor, good citizen (bom cidadão)
× Tudo que a classe precisa é passado no construtor.
× Garantia de inicialização somente quando atendido as
dependências.
Nem tudo são flores
× Não são todos os frameworks de IOC/DI que implementam
Padrões de Projeto
× Solução para um problema frequente
× Reusavéis
Padrões de projeto dizem respeito a como
organizar o código.
“GOF - Gang of
Four”
Padrões a serem conhecidos
Padrões de Projeto - Categorias
Criacionais
Factory Method
Abstract Method
Builder
Prototype
Singleton
Estruturais
Composite
Adapter
Bridge
Decorator
Facade
Proxy
Flyweight
Comportamentais
Strategy
Template Method
Observer
Mediator
Command
Chain of Responsability
State
Visitor
...
Padrões de Projeto - Categorias
Criacionais
Factory Method
Abstract Method
Builder
Prototype
Singleton
Estruturais
Composite
Adapter
Bridge
Decorator
Facade
Proxy
Flyweight
Comportamentais
Strategy
Template Method
Observer
Mediator
Command
Chain of Responsability
State
Visitor
...
Factory / Abstract Factory
Padrão criacional
Builder
Padrão criacional
Singleton
Padrão criacional
“Dependency
Injection simplifica
ou acaba com
todos eles”
Dependency Injection
Padrão criacional
× Desacopla a solicitação de uma dependência da sua instanciação
× Simplifica código
× Melhora isolamento
× Testável
Dependency Injection
Factory é necessária?
Builder é necessário?
Dependency Injection - Scopes
Define o ciclo de vida do objeto
Padrões de Projeto - Categorias
Criacionais
Factory Method
Abstract Method
Builder
Prototype
Singleton
Estruturais
Composite
Adapter
Bridge
Decorator
Facade
Proxy
Flyweight
Comportamentais
Strategy
Template Method
Observer
Mediator
Command
Chain of Responsability
State
Visitor
...
Composite
Representa um objeto como uma
composição de objetos similares
Trata um conjunto de objetos como um
unico objeto
Composite exemplo
Composite exemplo
Adapter
Bridge
Decorator
Facade
Proxy
Proxy
Flyweight
Permite economizar memória
Compartilhamento de objetos
Exemplo:
String do java possui um pool interno
Padrões de Projeto - Categorias
Criacionais
Factory Method
Abstract Method
Builder
Prototype
Singleton
Estruturais
Composite
Adapter
Bridge
Decorator
Facade
Proxy
Flyweight
Comportamentais
Strategy
Template Method
Observer
Mediator
Command
Chain of Responsability
State
Visitor
...
Strategy
Permite a troca de algoritmos
Muda comportamento conforme contexto
Template Method
Adiciona uma indireção entre componentes
Favorece um baixo acoplamento
Cuidado.
Observer
Mediator
Command
Chain of Responsability
Chain of Responsability
State
Permite mudar de
comportamento
Simplifica ifs para tratar
estado
Thanks!
Perguntas?
Como me encontrar:
@euprogramador
euprogramador@gmail.com

Boas práticas no desenvolvimento de software