Vous êtes sur la page 1sur 22

Programao no Mundo Real

DESIGN PATTERNS vol.1 (verso reduzida)


2017 Fabio Silva Lima
Publicao: www.fabiosilvalima.net
ISBN: 978-85-922686-0-2
Volume: 1
Edio: 1
Autor: Fabio Silva Lima
Edio e Design: Fabio Silva Lima
Reviso: Jean Michel Azzoni Cecon
Andr Luis Godoi de Moraes
Programao no Mundo Real
DESIGN PATTERNS vol.1

Sumrio

Apresentao 4
Sobre o Autor 5
Objetivos 6
Padres do eBook 7
Repository 9
Dependency Injection
Service Locator
Lazy Loading
Unit of Work
Decorator
Adapter Baixe a verso completa
gratuitamente.
Composite
Facade www.fabiosilvalima.net
Proxy
Singleton
Strategy
Chain of Responsibility
Factory
Flyweight
Outros eBooks 19
Agradecimentos 20
Feedbacks e Contato 21

fabiosilvalima.net 3
Programao no Mundo Real
DESIGN PATTERNS vol.1

Apresentao

Obrigado por adquirir este eBook de Design Patterns da


srie Programao no Mundo Real.

Aqui voc encontrar diversos exemplos e cdigo fonte em


C# dos mais famosos Design Patterns utilizados na
comunidade de desenvolvimento de software alm de
sugerir o uso de uma forma alternativa.

O mais importante alm de explicar os conceitos, sugerir o


uso dessas solues e onde elas se encaixam no seu
Mundo Real.

Eu encorajo voc a visitar meu site Fabio Silva Lima -


Programao no Mundo Real, onde voc poder baixar
outros eBooks e ler artigos de programao. O site tambm
possui uma verso em ingls.

Esse eBook est protegido por direitos autorais e


registrado sob o ISBN 978-85-922686-0-2. Proibida a venda,
cpia ou distribuio sem autorizao.

Boa leitura!

fabiosilvalima.net 4
Programao no Mundo Real
DESIGN PATTERNS vol.1

Sobre o Autor

Me chamo Fabio Silva Lima, sou


autor deste eBook, vivo
tecnologia, adoro programao,
jogo vdeo game, assisto
seriados de TV, pratico corrida e
amo minha famlia.

Trabalho como arquiteto de solues e desenvolvedor, tenho


mais de 16 anos de experincia em desenvolvimento de
software sendo 14 anos somente para o mercado de
seguros.

Caso queira conferir outras contribuies ou me seguir nas


redes sociais basta clicar nos cones acima.

Conto com o seu apoio, por isso no hesite e entre em


contato comigo para crticas e sugestes sobre esse eBook.

Boa leitura!

fabiosilvalima.net 5
Programao no Mundo Real
DESIGN PATTERNS vol.1

Objetivos

O objetivo principal que voc aprenda e que esse


contedo seja til no seu dia a dia, no seu Mundo Real.

Voc pode pesquisar por a e saber mais sobre os Design


Patterns, e vai encontrar muita informao, muita
informao mesmo.

Por isso tento passar o conhecimento de forma que voc


consiga aplicar as solues aqui sugeridas.

Por fim, o mais importante que explico o que voc


realmente precisa saber, tirando todos aqueles detalhes
chatos e desnecessrios.

A errata deste eBook voc pode encontrar aqui.

Baixe o cdigo fonte, acompanhe os artigos no meu site,


sugira um contedo ou tema e divirta-se!

fabiosilvalima.net 6
Programao no Mundo Real
DESIGN PATTERNS vol.1

Padres do eBook

Cada tpico descreve boas ou ms prticas de


desenvolvimento, que so demonstradas por uma
determinada cor e uma palavra em negrito ressaltando a
recomendao.

Sempre siga essa sugesto.


Considere na medida do possvel.
Nunca deve ser feito.

Voc deve ter reparado que h diversas palavras grifadas


em azul, isso quer dizer que nesta palavra h um atalho para
algum contedo neste e-book ou algum site externo.

Ento, caso deseje saber mais sobre o assunto, basta clicar


nessa palavra ou imagem para ir ao contedo
correspondente.

Observaes relevantes viro no formato amigvel de um


comentrio de cdigo fonte conforme exemplo abaixo.

/*!
* INTERFACES devem ser o mais especfico
* possvel. Se perceber que h uma interface com
* muitos mtodos, tente quebrar em mais de uma
* interface.
*/

fabiosilvalima.net 7
Programao no Mundo Real
DESIGN PATTERNS vol.1

voc est lendo Padres do eBook

Quando ver um cdigo fonte (veja exemplo abaixo), basta


clicar sobre o nome do arquivo para seu contedo
correspondente no meu repositrio de cdigo fonte no
github.

ApiClientException.cs
private string FilterResponse(IRestResponse
response)
{
var sb = new StringBuilder();
if (response == null)
{
return "Response is Null";
}

return "";
}

Cada tpico ter um pequeno resumo (veja abaixo)


referente a dificuldades, facilidades e pontos de ateno com
notas de 1 a 5, sendo 1 baixo e 5 alto.

Aplicabilidade: 5
Nvel de dificuldade na implementao: 3
Refactor ps implementao: 1
Referncias: Dependency Injection e Unit of Work.

fabiosilvalima.net 8
Programao no Mundo Real
DESIGN PATTERNS vol.1

Repository

fabiosilvalima.net 9
Programao no Mundo Real
DESIGN PATTERNS vol.1

Repository

O que ou para que serve?


um elo de ligao entre a camada de negcios e a camada
de acesso a dados sem que a camada de negcios saiba
qual a base de dados que est sendo acessada.

Onde uso?
No acesso a base de dados.

Principal regra ou cenrio:


Criar uma interface e uma classe que implementa essa
interface. Nessa classe herde de uma outra classe bsica
que far o acesso a base de dados correspondente.

/*!
* No necessariamente REPOSITRIO resume-se
* apenas em banco de dados. Poderia ser um
* web service, um arquivo XML ou outra
* base de dados
*/

Aplicabilidade: 5
Nvel de dificuldade na implementao: 3
Refactor ps implementao: 1
Referncias: Dependency Injection e Unit of Work.

fabiosilvalima.net 10
Programao no Mundo Real
DESIGN PATTERNS vol.1

voc est lendo Repository

Cenrio comum

No diagrama ao lado a classe


ProductController
ProductController explicita a
chamada a classe de acesso a
dados SQL. Ou seja, essa classe
totalmente dependente do
SQL banco de dados SQL.

Nunca explicite o acesso a classe de dados, pois a


mudana de base de dados acarretar em um refactor
considervel no cdigo fonte.

Essa mesma regra serve tambm para classes de acesso


a dados. Por exemplo, voc pode no querer mais usar a
biblioteca Dapper para acessar o seu banco de dados SQL
e sim usar uma outra biblioteca ou seja haver um grande
refactor.

Considere o uso do Dapper para acesso a dados,


muito simples e muito performtico nas requisies ao
banco de dados. Dapper foi feito pela equipe do Stack
Overflow.

fabiosilvalima.net 11
Programao no Mundo Real
DESIGN PATTERNS vol.1

voc est lendo Repository

Cenrio Repository Pattern

ProductController

IProductRepository

MongoDbProductRepository DapperSqlProductRepository

MongoDB SQL

A classe ProductController agora possui uma dependncia


a uma interface para inserirmos um produto, no caso
IProductRepository (repositrio de produtos). Neste
cenrio, a classe ProductController no sabe qual o
banco de dados a ser utilizado.

Existem duas classes que implementam a interface do


repositrio de produtos, so elas:

- MongoDbProductRepository
- DapperSqlProductRepository

fabiosilvalima.net 12
Programao no Mundo Real
DESIGN PATTERNS vol.1

voc est lendo Repository

Cdigo de exemplo - a interface do repositrio

IProductRepository.cs
public interface IProductRepository
{
void InsertProduct(Product product);
}

Tudo comea pela interface do repositrio, no exemplo


acima temos um mtodo para inserir um produto.

/*!
* As INTERFACES devem ser definidas da forma mais
* especfica possvel. Se perceber que h uma
* interface com muitos mtodos, tente quebrar em
* mais de uma interface.
*/

Sempre crie uma interface e classe por arquivo.


Sempre use o prefixo I em maisculo no nome de uma
interface.

fabiosilvalima.net 13
Programao no Mundo Real
DESIGN PATTERNS vol.1

voc est lendo Repository

Cdigo de exemplo - a classe de repositrio

O segundo passo criar uma classe que implementa essa


interface.

DapperSqlProductRepository.cs
public class DapperSqlProductRepository :
SqlRepository, IProductRepository
{
public DapperSqlProductRepository()
{

public void InsertProduct(Product product)


{
var command = $"INSERT INTO Product (Id, Name)
VALUES (@Id, @Name)";

Database.Execute(command, product);
}
}

Repare que DapperSqlProductRepository herda de outra


classe no caso SqlRepository. E essa que possui os
mtodos bsicos de acesso a dados ao banco de dados
SQL Server.

fabiosilvalima.net 14
Programao no Mundo Real
DESIGN PATTERNS vol.1

voc est lendo Repository

Cenrio da mudana do acesso a dados

Lembra da questo em trocar o Dapper por outra biblioteca


de acesso a dados? Nesse caso, basta criar uma classe
ADOSqlProductRepository que implementa a interface
IProductRepository e pronto!

ProductController

IProductRepository

ADOSqlProductRepository

SQL

Sempre use o Repository Pattern para separar o elo


entre a camada de negcios e a camada de acesso a
dados podendo assim no futuro implementar mais de um
tipo de acesso a dados usando a mesma interface.

fabiosilvalima.net 15
Programao no Mundo Real
DESIGN PATTERNS vol.1

voc est lendo Repository

A mgica por trs do Repository Pattern

Voc deve estar se perguntando, como a classe


ProductController sabe qual instncia que implementa
IProductRepository ser utilizada?

A resposta : Dependency Injection (DI)

Para DI voc ir configurar algo assim:

Se algum quiser uma instncia que implemente


IProductRepository, fornea a instncia da classe
DapperSqlProductRepository.

Sempre use o padro de Dependency Injection para


automatizar a criao das instncias dos Design Patterns
e no simplesmente explicit-las.

O prximo captulo Dependency Injection possui alguns


exemplos de como e onde fazer a cofigurao mencionada
acima.

No captulo de SOLID veremos muitos exemplos de boas


prticas a serem seguidos ao usar DI.

fabiosilvalima.net 16
Programao no Mundo Real
DESIGN PATTERNS vol.1

voc est lendo Repository

Cdigo de exemplo - o uso do repositrio

O repositrio IProductRepository injetado no construtor


do RepositoryController (veja exemplo abaixo), que guarda
a instncia em uma varivel local. A chamada do repositrio
est no mtodo Index que instancia uma classe model de
Product e solicita ao repositrio que insira esses dados
atravs do mtodo InsertProduct.

Olhe para o cdigo acima e veja: voc no sabe qual o


mecanismo de acesso a dados e muito menos qual a base
de dados que est sendo acessada.

RepositoryController.cs
public RepositoryController(IProductRepository
repository)
{
_repository = repository;
}

public ActionResult Index()


{
var product = new Product();
_repository.InsertProduct(product);

return View();
}

fabiosilvalima.net 17
Programao no Mundo Real
DESIGN PATTERNS vol.1

voc est lendo Repository

Resumo

Neste captulo demonstrei o uso do design pattern


Repository que muito usado para acesso a banco de
dados.

Uma coisa interessante em repositrios que podemos criar


classes bsicas (normalmente chamadas de DAO ou Data
Helper) para acessar um determinado banco de dados, por
exemplo Dapper SQL.

Nessa classe bsica teriam todos os mtodos necessrios


para trabalhar com Dapper + SQL. Para essa tcnica
podemos usar o Facade Pattern ou Adapter Pattern que
iro expor somente o necessrio e simplificando o uso pelo
desenvolvedor.

Assim, qualquer outra classe que fosse usar Dapper + SQL


hedaria dessa classe bsica otimizando muito o tempo de
desenvolvimento. Se quiser saber mais leia meu artigo
Repository Pattern com Dapper SQL e MongoDB.

fabiosilvalima.net 18
Programao no Mundo Real
DESIGN PATTERNS vol.1

Outros eBooks

Nesse eBook foram apresentados 15 Design Patterns,


porm existem muitos outros e no volume 2 de Design
Patterns da srie Programao no Mundo Real eu discuto
os seguintes:

- SOLID
- DRY
- Builder
- Visitor
- Bridge
- Iterator
- State
- Template Method
- MVVM
- MVC
- Command
- Interpreter
- Mediator
- Observer
- Memento

Acesse o site Programao no Mundo Real e opine sobre


quais outros Design Patterns poderiam fazer parte dos
prximos volumes.

fabiosilvalima.net 19
Programao no Mundo Real
DESIGN PATTERNS vol.1

Agradecimentos

A criao desse eBook Design Patterns vol.1 da srie


Programao no Mundo Real teve a contribuio das
pessoas abaixo. O meu sincero agradecimento pela ajuda e
pacincia, pois nada nesse mundo fcil.

Muito obrigado :)

Reviso:

- Jean Michel Azzoni Cecon


- Andr Luis Godoi de Moraes

Apoio:

- Luciano Damiani
- Marco Aurlio Damiani
- Broker Consultoria e Solues de TI

Por fim,

Um agradecimento especial a minha famlia que sempre me


apoiou pacientemente em todo o perodo desde a
idealizao at a criao deste eBook.

fabiosilvalima.net 20
Programao no Mundo Real
DESIGN PATTERNS vol.1

Est gostando do eBook?

Baixe a verso completa gratuitamente.


www.fabiosilvalima.net/ebooks/design-patterns-vol-1

Acompanhe tambm nas redes sociais.

No est gostando?

Envie seu feedback para que possamos aprimor-lo.


www.fabiosilvalima.net/contato

fabiosilvalima.net 21
Programao no Mundo Real
DESIGN PATTERNS vol.1

* FIM *

* OBRIGADO *

fabiosilvalima.net 22

Vous aimerez peut-être aussi