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
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
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#.
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.
Tipos de Padrão
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.
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.
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.
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.
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";
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.
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.
Strategy
public interface Imposto
{
double Calcula(Venda venda);
}
REGRA DE NEGÓCIO
Calcular o valor de
vários impostos de
acordo com o valor da
venda.
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
namespace ConsoleTCC.Com_Strategy
{
public class Calcula
{
public void RealizaCalculo(Venda venda, Imposto imposto)
{
double _imposto = imposto.Calcula(venda);
Console.WriteLine(_imposto);
}
}
}
Strategy
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
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
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
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
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
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
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
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
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.

As vantagens e desvantagens da aplicação de padrões de projeto

  • 1.
    As Vantagens eDesvantagens 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 • ChristopherAlexander 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 dePadrõ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 umsoftware 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.
  • 5.
  • 7.
    Strategy Definir uma famíliade 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 reusode 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 Evitaro 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 oesqueleto 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-seo 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 deVenda • 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.
  • 14.
    Strategy public interface Imposto { doubleCalcula(Venda venda); } REGRA DE NEGÓCIO Calcular o valor de vários impostos de acordo com o valor da venda.
  • 15.
    namespace ConsoleTCC.Sem_Strategy { public classCalcula { 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 classCalcula { public void RealizaCalculo(Venda venda, Imposto imposto) { double _imposto = imposto.Calcula(venda); Console.WriteLine(_imposto); } } } Strategy
  • 17.
    Chain of Responsibility publicinterface 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 classCalculaDesconto { 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 classCalculaDesconto { 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 { publicabstract 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 classIOF : 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 classIOF : 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çãodo 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.