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

Tipos de Licença de Softwares
Tipos de Licença de SoftwaresTipos de Licença de Softwares
Tipos de Licença de SoftwaresLucas Castejon
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
Introdução ao Front-end no Desenvolvimento Web
Introdução ao Front-end no Desenvolvimento WebIntrodução ao Front-end no Desenvolvimento Web
Introdução ao Front-end no Desenvolvimento WebAnderson Luís Furlan
 
Apresentação java
Apresentação javaApresentação java
Apresentação javamunosai
 
Modelos de estruturação de sistemas distribuídos
Modelos de estruturação de sistemas distribuídosModelos de estruturação de sistemas distribuídos
Modelos de estruturação de sistemas distribuídosPortal_do_Estudante_SD
 
Protocolos HTTP e HTTPS
Protocolos HTTP e HTTPSProtocolos HTTP e HTTPS
Protocolos HTTP e HTTPSTrabalhosCVIGR
 
Sistemas operativos 10º
Sistemas operativos 10ºSistemas operativos 10º
Sistemas operativos 10ºteacherpereira
 
Introdução sobre desenvolvimento web
Introdução sobre desenvolvimento webIntrodução sobre desenvolvimento web
Introdução sobre desenvolvimento webRodrigo Rodrigues
 
html, css e java script - renato araujo
html, css e java script - renato araujohtml, css e java script - renato araujo
html, css e java script - renato araujoorenatoaraujo
 
Minicurso de JavaScript (Portuguese)
Minicurso de JavaScript (Portuguese)Minicurso de JavaScript (Portuguese)
Minicurso de JavaScript (Portuguese)Bruno Grange
 
Resumo de S.O.
Resumo de S.O.Resumo de S.O.
Resumo de S.O.dannas_06
 
Curso de HTML5 - Aula 01
Curso de HTML5 - Aula 01   Curso de HTML5 - Aula 01
Curso de HTML5 - Aula 01 Léo Dias
 
Interação Humano Computador Capítulo 8 - Antecipação
Interação Humano Computador Capítulo 8 - AntecipaçãoInteração Humano Computador Capítulo 8 - Antecipação
Interação Humano Computador Capítulo 8 - AntecipaçãoWellington Oliveira
 

Mais procurados (20)

Tipos de Licença de Softwares
Tipos de Licença de SoftwaresTipos de Licença de Softwares
Tipos de Licença de Softwares
 
Plano de aula sobre HTML básico
Plano de aula sobre HTML básicoPlano de aula sobre HTML básico
Plano de aula sobre HTML básico
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Introdução ao Front-end no Desenvolvimento Web
Introdução ao Front-end no Desenvolvimento WebIntrodução ao Front-end no Desenvolvimento Web
Introdução ao Front-end no Desenvolvimento Web
 
Apresentação java
Apresentação javaApresentação java
Apresentação java
 
Modelos de estruturação de sistemas distribuídos
Modelos de estruturação de sistemas distribuídosModelos de estruturação de sistemas distribuídos
Modelos de estruturação de sistemas distribuídos
 
Computação em Nuvem
Computação em NuvemComputação em Nuvem
Computação em Nuvem
 
Apresentação sobre ipv6
Apresentação sobre ipv6Apresentação sobre ipv6
Apresentação sobre ipv6
 
JAVA - Herança
JAVA - HerançaJAVA - Herança
JAVA - Herança
 
Protocolos HTTP e HTTPS
Protocolos HTTP e HTTPSProtocolos HTTP e HTTPS
Protocolos HTTP e HTTPS
 
Sistemas operativos 10º
Sistemas operativos 10ºSistemas operativos 10º
Sistemas operativos 10º
 
Introdução sobre desenvolvimento web
Introdução sobre desenvolvimento webIntrodução sobre desenvolvimento web
Introdução sobre desenvolvimento web
 
Algoritmo 06 - Array e Matrizes
Algoritmo 06 - Array e MatrizesAlgoritmo 06 - Array e Matrizes
Algoritmo 06 - Array e Matrizes
 
html, css e java script - renato araujo
html, css e java script - renato araujohtml, css e java script - renato araujo
html, css e java script - renato araujo
 
Minicurso de JavaScript (Portuguese)
Minicurso de JavaScript (Portuguese)Minicurso de JavaScript (Portuguese)
Minicurso de JavaScript (Portuguese)
 
Resumo de S.O.
Resumo de S.O.Resumo de S.O.
Resumo de S.O.
 
Curso de HTML5 - Aula 01
Curso de HTML5 - Aula 01   Curso de HTML5 - Aula 01
Curso de HTML5 - Aula 01
 
Interação Humano Computador Capítulo 8 - Antecipação
Interação Humano Computador Capítulo 8 - AntecipaçãoInteração Humano Computador Capítulo 8 - Antecipação
Interação Humano Computador Capítulo 8 - Antecipação
 
IHC - Slide 2 - Usabilidade e Princípios de Design
IHC - Slide 2 - Usabilidade e Princípios de DesignIHC - Slide 2 - Usabilidade e Princípios de Design
IHC - Slide 2 - Usabilidade e Princípios de Design
 
Rede de computadores
Rede de computadoresRede de computadores
Rede de computadores
 

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.