1) O documento discute as vantagens e desvantagens da aplicação de padrões de projeto comportamentais como Strategy, Chain of Responsibility e Template Method na linguagem C#.
2) É demonstrado como esses padrões melhoram a manutenibilidade do código ao reduzir acoplamentos e aumentar a reusabilidade.
3) Os resultados indicam que a aplicação dos padrões diminui condicionais, aumenta a coesão e permite maior uso de conceitos da orientação a objetos.
As vantagens e desvantagens da aplicação de padrões de projeto
1. As Vantagens e Desvantagens da
Aplicação de Padrões de Projeto
Comportamentais em CSharp
Por Gabriel W. Galdino
Orientador Ms. Peter J. Jandl
11 de Dezembro de 2014
Jundiaí - SP
2. Introdução
• História
• Christopher Alexander
Notes on the Synthesis of Form e A Pattern Language
• Gang of Four (GoF)
(Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides)
Design Patterns: Elements of Reusable Object-Oriented Software
• Linguagem C#
• Anders Hejlsberg
• Fortemente Tipada
• Plataforma .NET
• Orientação a Objeto
3. Problema
• Falta de Padrões de Projeto nos Softwares.
• Classes e Métodos Gigantes
• Difícil manutenção
• Excesso de Condicionais
• Falta de conteúdo específico sobre padrões em C#.
4. Objetivo
• Construir um software ambíguo, aonde seja possível
demonstrar as diferenças na construção de um software
seguindo os conceitos dos padrões de projetos e outro
construído sem aplicação de padrões.
7. Strategy
Definir uma família de algoritmos, encapsular cada uma
delas e torná-las intercambiáveis. Ele permite que o
algoritmo varie independentemente dos clientes que o
utilizam
É viável quando:
• Há muitas classes relacionadas diferem apenas no seu
comportamento.
• Um algoritmo usa dados dos quais os clientes não
deveriam ter conhecimento.
• Uma classe define muitos comportamentos e estes
aparecem em suas operações como múltiplos comandos
condicionais da linguagem.
8. Strategy
VANTAGENS
• Permite reuso de famílias de algoritmos com funcionalidades
comuns.
• Alternativa ao uso de subclasses.
• Elimina comandos condicionais no código.
• Permite a escolha de diferentes implementações para o mesmo
comportamento.
DESVANTAGEM
• Torna-se complicado saber como os algoritmos obtêm ou
recebem dados de suas classes de contexto.
• Deve-se conhecer as diferenças dos Strategies.
• Aumento do número de objetos no sistema.
9. Chain of Responsibility
Evitar o acoplamento do remetente de uma solicitação ao
seu receptor, ao dar a mais de um objeto a oportunidade
de tratar a solicitação.
É viável quando:
• Há mais de um objeto pode tratar uma solicitação e o
objeto que a tratará não conhecido a priori.
• Você quer emitir uma solicitação para um dentre vários
objetos, sem especificar explicitamente o receptor;
• O conjunto de objetos que pode tratar uma solicitação
deveria ser especificado dinamicamente.
10. Chain of Responsibility
VANTAGENS
• Evita acoplamento do transmissor de uma requisição com seus
receptores.
• Encadeia os objetos receptores e passa a requisição ao longo
dessa cadeia até que um objeto possa manipulá-lo.
• Permite que um conjunto de classes atue como uma classe.
• Flexibilidade adicional na distribuição de responsabilidades
entre objetos.
DESVANTAGEM
• Não há uma garantia da recepção, uma vez que uma
solicitação não tem um receptor explícito, não há garantia de
que ela será tratada – a solicitação pode sair pelo final da
cadeia sem ter sido tratada.
11. Template Method
Definir o esqueleto de um algoritmo dentro de um método,
transferindo alguns de seus passos para as subclasses.
Permitindo assim que subclasses redefinam certos passos
de um algoritmo sem alterar a estrutura do mesmo
É viável quando:
• É necessário implementar as partes invariantes de um
algoritmo uma única vez e deixar para subclasses a
implementação da parte variante;
• Há comportamento semelhante entre subclasses deve ser
fatorado numa superclasse evitando-se assim a
duplicação de código;
• É necessário controlar extensões de classes com métodos
"gancho";
12. Template Method
VANTAGEM
• Reutiliza-se o código.
• Conduz a uma estrutura de inversão de controle, de modo que
a classe-mãe chama as operações de uma subclasse.
DESVANTAGEM
• Torna-se fácil esquecer de chamar a operação herdada.
13. Protótipo
• Módulo de Venda
• Strategy
• Calcula imposto da venda.
• Chain of Resposibility
• Calcula desconto sobre à venda.
• Template Method
• Calcula taxação de imposto de acordo com o valor da venda.
15. namespace ConsoleTCC.Sem_Strategy
{
public class Calcula
{
public void Calcular(Venda venda, String imposto)
{
if ("ICMS".Equals(imposto))
{
double icms = venda.ValorVenda * 0.10;
Console.WriteLine(icms);
}
else if ("ISS".Equals(imposto))
{
double iss = venda.ValorVenda * 0.15;
Console.WriteLine(iss);
}
}
}
}
Strategy
16. namespace ConsoleTCC.Com_Strategy
{
public class Calcula
{
public void RealizaCalculo(Venda venda, Imposto imposto)
{
double _imposto = imposto.Calcula(venda);
Console.WriteLine(_imposto);
}
}
}
Strategy
17. Chain of Responsibility
public interface Desconto
{
double Desconta(Venda venda);
Desconto Proximo {get; set;}
}
REGRA DE NEGÓCIO
Chamar o próximo
desconto da venda
18. namespace ConsoleTCC.Sem_ChainOfResp
{
public class CalculaDesconto
{
public double Calcula(Venda venda)
{
if (venda.Itens.Count > 3)
{
return venda.ValorVenda * 0.10;
}
else if (venda.ValorVenda > 200.0)
{
return venda.ValorVenda * 0.07;
}
return 0;
}
}
}
Chain of Responsibility
19. namespace ConsoleTCC.Com_ChainOfResp
{
public class CalculaDesconto
{
public double Calcula(Venda venda)
{
Desconto d1 = new DescontoQuatroItens();
Desconto d2 = new DescontoDuzentosReais();
Desconto d3 = new SemDesconto();
d1.Proximo = d2;
d2.Proximo = d3;
return d1.Desconta(venda);
}
}
}
Chain of Responsibility
20. Template Method
namespace ConsoleTCC.Com_TempMethod
{
public abstract class TemplateDeImpostoCondicional : Imposto
{
public double Calcula(Venda venda)
{
if (DeveUsarMaximaTaxacao(venda))
{
return MaximaTaxacao(venda);
}
return MinimaTaxacao(venda);
}
//Chama os métodos abstratos
}
}
REGRA DE NEGÓCIO
Taxas diferentes para
valores diferentes
21. namespace ConsoleTCC.Sem_TempMethod
{
public class IOF : Imposto
{
public double Calcula(Venda venda)
{
if (venda.ValorVenda > 500 && temItemMaiorQue100ReaisNa(venda))
{
return venda.ValorVenda * 0.1;
}
return venda.ValorVenda * 0.06;
}
}
}
Template Method
22. namespace ConsoleTCC.Com_TempMethod
{
public class IOF : TemplateDeImpostoCondicional
{
public override bool DeveUsarMaximaTaxacao(Venda venda)
{
return venda.ValorVenda > 500 && temItemMaiorQue100ReaisNa(venda);
}
public override double MaximaTaxacao(Venda venda)
{
return venda.ValorVenda * 0.10;
}
public override double MinimaTaxacao(Venda venda)
{
return venda.ValorVenda * 0.06;
}
}
}
Template Method
23. Resultados Obtidos
• Diminuição do acoplamento
• Diminuição dos condicionais SE.
• Aumento no tempo da construção
• Classes
• Interfaces
• Aumento da coesão
• Maior possibilidade de reuso
• Maior uso dos conceitos da Orientação à Objetos
• Herança
• Composição
• Abstração
• Interface
• Encapsulamento
24. Conclusões
• C# é uma boa linguagem para aplicação de padrões de
projeto
• É necessário o uso consciente dos padrões de projeto
• Melhor manutenibilidade
25. Bibliografia
• ALEXANDER, Christopher; ISHIKAWA, Sara; SILVERSTEIN,
Murray. A Pattern Language. Oxford University Press, New York,
1977. 1171p. ISBN 0195019199
• BISHOP, Judith. C# 3.0 Design Patterns. O’Reilly Media, Inc. 2007,
318p. ISBN 9780596551445
• FREEMAN, Eric; FREEMAN, Elisabeth. Use a Cabeça: Padrões de
Projetos. 2ª Ed. Alta Books, 2009. 478p. ISBN 9788576081746.
• GAMMA, Erich; HELM, Richard; JOHNSON, Ralph, VLISSIDES,
John. Padrões de Projeto: Soluções Reutilizáveis de Software
Orientado a Objetos. Porto Alegre: Bookman, 2007. 360p. ISBN
9788577800469
• JANDL, Peter Jr. Mais Java. São Paulo, SP: Futura, 2003. 635p. ISBN
8574131407.
• MSDN. Visual C#. Disponível em http://msdn.microsoft.com/pt-
br/library/kx37x362.aspx. Acesso em 10/10/2014.
• SOMMERVILLE, Ian. Engenharia de Software. 6ª Ed. Addison Wesley,
2003. 592p. ISBN 9788579361081.