SlideShare uma empresa Scribd logo
1 de 25
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.

Mais conteúdo relacionado

Mais procurados

Implementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelImplementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelManoel Pimentel Medeiros
 
principles of object oriented class design
principles of object oriented class designprinciples of object oriented class design
principles of object oriented class designNeetu Mishra
 
Padrões de Projeto: Adapter
Padrões de Projeto: AdapterPadrões de Projeto: Adapter
Padrões de Projeto: AdapterMessias Batista
 
JAVA - ENCAPSULAMENTO
JAVA - ENCAPSULAMENTOJAVA - ENCAPSULAMENTO
JAVA - ENCAPSULAMENTOAndré Victor
 
Advanced Reflection in Java
Advanced Reflection in JavaAdvanced Reflection in Java
Advanced Reflection in Javakim.mens
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareFelipe
 
How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?Dmitry Buzdin
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnitelliando dias
 
Computação Gráfica em Python
Computação Gráfica em PythonComputação Gráfica em Python
Computação Gráfica em Pythongsroma
 
구글테스트
구글테스트구글테스트
구글테스트진화 손
 
Encapsulamento em Orientação a Objetos
Encapsulamento em Orientação a ObjetosEncapsulamento em Orientação a Objetos
Encapsulamento em Orientação a ObjetosDaniel Brandão
 
05 junit
05 junit05 junit
05 junitmha4
 
POO - Unidade 2 (parte 2) - Classe de Associação, Agregação, Composição (ver...
POO - Unidade 2 (parte 2) - Classe de Associação, Agregação, Composição  (ver...POO - Unidade 2 (parte 2) - Classe de Associação, Agregação, Composição  (ver...
POO - Unidade 2 (parte 2) - Classe de Associação, Agregação, Composição (ver...Marcello Thiry
 

Mais procurados (20)

Implementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelImplementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel Pimentel
 
Unit Testing in Java
Unit Testing in JavaUnit Testing in Java
Unit Testing in Java
 
principles of object oriented class design
principles of object oriented class designprinciples of object oriented class design
principles of object oriented class design
 
Padrões de Projeto: Adapter
Padrões de Projeto: AdapterPadrões de Projeto: Adapter
Padrões de Projeto: Adapter
 
POO - 16 - Polimorfismo
POO - 16 - PolimorfismoPOO - 16 - Polimorfismo
POO - 16 - Polimorfismo
 
JAVA - ENCAPSULAMENTO
JAVA - ENCAPSULAMENTOJAVA - ENCAPSULAMENTO
JAVA - ENCAPSULAMENTO
 
Advanced Reflection in Java
Advanced Reflection in JavaAdvanced Reflection in Java
Advanced Reflection in Java
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de software
 
How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?
 
POO - 13 - Arrays em Java
POO - 13 - Arrays em JavaPOO - 13 - Arrays em Java
POO - 13 - Arrays em Java
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
Diagramas de pacotes
Diagramas de pacotesDiagramas de pacotes
Diagramas de pacotes
 
Computação Gráfica em Python
Computação Gráfica em PythonComputação Gráfica em Python
Computação Gráfica em Python
 
구글테스트
구글테스트구글테스트
구글테스트
 
POO - 17 - Interfaces
POO - 17 - InterfacesPOO - 17 - Interfaces
POO - 17 - Interfaces
 
POO - Aula 09 - Herança
POO - Aula 09 - HerançaPOO - Aula 09 - Herança
POO - Aula 09 - Herança
 
Encapsulamento em Orientação a Objetos
Encapsulamento em Orientação a ObjetosEncapsulamento em Orientação a Objetos
Encapsulamento em Orientação a Objetos
 
05 junit
05 junit05 junit
05 junit
 
SOLID
SOLIDSOLID
SOLID
 
POO - Unidade 2 (parte 2) - Classe de Associação, Agregação, Composição (ver...
POO - Unidade 2 (parte 2) - Classe de Associação, Agregação, Composição  (ver...POO - Unidade 2 (parte 2) - Classe de Associação, Agregação, Composição  (ver...
POO - Unidade 2 (parte 2) - Classe de Associação, Agregação, Composição (ver...
 

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

qualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesqualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesedgarddavidson.com
 
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on AzureTDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azuretdc-globalcode
 
ZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasRafael Chinelato Del Nero
 
ASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre TarifaASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre Tarifaguestea329c
 
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...Daniel Makiyama
 
TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"Cesar Romero
 
Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Saulo Arruda
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverEduardo Jorge
 
Hexagonal Rails
Hexagonal RailsHexagonal Rails
Hexagonal RailsLuiz Costa
 
Delphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTIDelphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTIMario Guedes
 
Como aplicar práticas DevOps em um sistema monólito
Como aplicar práticas DevOps em um sistema monólito Como aplicar práticas DevOps em um sistema monólito
Como aplicar práticas DevOps em um sistema monólito Anderson Silveira
 
Padrões de Projeto - Observer e Strategy
Padrões de Projeto - Observer e StrategyPadrões de Projeto - Observer e Strategy
Padrões de Projeto - Observer e StrategyJoão Carlos Ottobboni
 

Semelhante a As vantagens e desvantagens da aplicação de padrões de projeto (20)

qualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesqualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrões
 
Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
 
Code Smells
Code SmellsCode Smells
Code Smells
 
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on AzureTDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
 
ZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivas
 
Aula1
Aula1Aula1
Aula1
 
ASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre TarifaASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre Tarifa
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
 
Grasp Patterns.ppt
Grasp Patterns.pptGrasp Patterns.ppt
Grasp Patterns.ppt
 
TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"
 
Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1
 
Curso AngularJS - Parte 1
Curso AngularJS - Parte 1Curso AngularJS - Parte 1
Curso AngularJS - Parte 1
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserver
 
Hexagonal Rails
Hexagonal RailsHexagonal Rails
Hexagonal Rails
 
Delphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTIDelphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTI
 
Como aplicar práticas DevOps em um sistema monólito
Como aplicar práticas DevOps em um sistema monólito Como aplicar práticas DevOps em um sistema monólito
Como aplicar práticas DevOps em um sistema monólito
 
Tdc 2017
Tdc 2017Tdc 2017
Tdc 2017
 
Padrões de Projeto - Observer e Strategy
Padrões de Projeto - Observer e StrategyPadrões de Projeto - Observer e Strategy
Padrões de Projeto - Observer e Strategy
 
Palestra ASP.NET MVC
Palestra ASP.NET MVCPalestra ASP.NET MVC
Palestra ASP.NET MVC
 

Mais de Gabriel Galdino

Mais de Gabriel Galdino (6)

Marketing social
Marketing socialMarketing social
Marketing social
 
Extreming Programming XP
Extreming Programming XPExtreming Programming XP
Extreming Programming XP
 
Boletim Informativo
Boletim InformativoBoletim Informativo
Boletim Informativo
 
Sistema Kanban
Sistema KanbanSistema Kanban
Sistema Kanban
 
Microsoft PowerBI
Microsoft PowerBIMicrosoft PowerBI
Microsoft PowerBI
 
Douglas McGregor e a Teoria X e Y
Douglas McGregor e a Teoria X e YDouglas McGregor e a Teoria X e Y
Douglas McGregor e a Teoria X e Y
 

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.
  • 6.
  • 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.
  • 14. 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.
  • 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.