Your SlideShare is downloading. ×
Padrões de design no .NET Framework<br />Giovanni Bassi<br />ConsultorIndependente<br />Microsoft MVP C#<br />26/01/2010<b...
Ou...5 Padrões em 50 minutos<br />2<br />
Giovanni Bassi<br />
Online @<br /><ul><li>Giovanni BassiEmail: 		giggio@giggio.netBlog:		unplugged.giggio.netSite: 		giovannibassi.comTwitter:...
.Net ArchitectsGrupo:		www.dotnetarchitects.netPodcast:	podcast.dotnetarchitects.netOnline: 	tinyurl.com/DotNetArchDojo:		...
Agenda<br />5<br />
Padrões de Projeto<br />6<br />
Quando você começa a estudar padrões de projeto<br />7<br />
8<br />
9<br />Alguémjápensounisso antes!<br />
10<br />
11<br />
12<br />
Alguns padrões de projeto<br />13<br />Na wikipedia: http://tinyurl.com/dpwiki<br />
Strategy (ou Policy)<br />14<br />
Strategy<br />15<br />
Strategy – código<br />publicclassContexto<br />{<br />publicEstrategiaEstrategia { get; set; }<br />}<br />publicabstract...
Strategy – código<br />classController <br />{<br />publicIRepositorioRepositorio { get; set; }<br />publicvoidExcluir(Ent...
Strategy – repositório SQL Server<br />classRepositorioSQLServer : Irepositorio<br />{<br />publicvoidExcluir(int id)<br /...
Strategy – repositório XML<br />classRepositorioXml : Irepositorio<br />{<br />publicvoidExcluir(int id)<br />{<br />//alt...
Strategy – repositório para testes<br />classRepositorioFalso : IRepositorio<br />{<br />publicboolChamouExcluir;<br />pub...
21<br />“<br />Definaumafamília de algoritmos, encapsulecada um, e torne-osintercambiáveis. Strategy permiteque o algoritm...
22<br />Encapsule e separe o que muda<br />
23<br />“Policy”?<br />(“Política”?)<br />
24<br />Princípio SOLID<br />Open ClosedPrinciplePrincípio aberto fechado<br /><ul><li>“Entidades de software (classes, mó...
Você deve ser capaz de estender uma classe sem modificá-la
Separe o pode mudar do que não deve mudar
Só é possível com abstrações</li></li></ul><li>TemplateMethod<br />25<br />
Template Method<br />26<br />
Template Method<br />27<br />
Template Method – código<br />abstractclassTransferencia<br />{<br />publicvoidTransferir()<br />{<br />Debitar();<br />Cr...
Template Method– código<br />abstractclassTransferencia<br />{<br />publicvoidTransferir()<br />{<br />Debitar();<br />Cre...
Template Method– código<br />abstractclassTransferencia<br />{<br />publicvoidTransferir()<br />{<br />Debitar();<br />Cre...
Template Method – Transferência interna<br />classTransferenciaInterna : Transferencia<br />{<br />protectedoverridevoidCr...
Template Method – DOC<br />classDOC : Transferencia<br />{<br />protectedoverridevoidCreditar()<br />    {<br />//creditar...
33<br />“<br />Define um esqueleto de algoritmos em um método, delegando alguns passos a subclasses. O método permite que ...
Padrão Factory?<br />34<br />
Padrão Factory?<br />Factory Method<br />Abstract Factory<br />35<br />
FactoryMethod<br />36<br />
Era uma vez um “new”...<br />37<br />
Factory Method<br />38<br />
Factory Method – criador e produto<br />abstractclassGerenciadorDeConexoes<br />{<br />publicabstractConexaoObterConexao()...
Factory Method – SQL Server<br />classGerenciadorDeConexoesSqlServer : GerenciadorDeConexoes<br />{<br />publicoverrideCon...
Factory Method – SQL Compact<br />classGerenciadorDeConexoesSqlCompact : GerenciadorDeConexoes<br />{<br />publicoverrideC...
Simple Factory – Não confundir<br />classGerenciadorDeConexoesSuperAcoplado<br />{<br />publicConexaoObterConexao()<br /> ...
43<br />“<br />O Factory Method define uma interface para criar um objeto, mas deixa as subclasses decidirem qual classe i...
Abstract Factory<br />44<br />
Abstract Factory<br />45<br />
Abstract Factory no .Net Framework<br />46<br />
Abstract Factory – no .Net Framework<br />classCliente{<br />publicvoidFazAlgumaCoisa()<br />{<br />vardbProviderFactory= ...
48<br />“<br />O Abstract Factory fornece uma interface para criação de famílias de objetos relacionados ou dependentes se...
Singleton<br />49<br />
Singleton<br />50<br />
Singleton – Simples<br />classSingleton<br />{<br />privatestaticreadonlySingleton _instancia = newSingleton();<br />priva...
Singleton – Simples<br />classSingleton<br />{<br />privatestaticreadonlySingleton _instancia = newSingleton();<br />priva...
Singleton – Sincronizado<br />classSingleton {<br />privatestaticSingleton _instancia;<br />private Singleton() { }<br />p...
Cuidado!<br />54<br />Singletons podem ser perigosos...<br />
55<br />Singleton desnecessário<br />Estado global<br />Anti-pattern?<br />Reversão difícil<br />Maisdifíciltestar<br />Po...
Alternativas:<br />56<br />
57<br />“<br />O padrão Singleton garante que uma classe possui apenas uma instância, e provê um ponto de acesso global a ...
Padrões de Arquitetura<br />58<br />
59<br />
Alguns padrões de arquitetura (1)<br />60<br />http://martinfowler.com/eaaCatalog/<br />
Alguns padrões de arquitetura (2)<br />61<br />http://martinfowler.com/eaaCatalog/<br />
Conclusões<br />62<br />
63<br />Patterns Cop<br />
64<br />
Patterns Crazy<br />
66<br />
Mais informações<br />Design Patterns: http://dofactory.com/Patterns/Patterns.aspxhttp://en.wikipedia.org/wiki/Design_Patt...
68<br />Obrigado!<br />
Upcoming SlideShare
Loading in...5
×

Design Patterns (MSDN Webcast)

2,600

Published on

Um padrão de design é uma solução geral e reusável para um problema comum no software. Um padrão não é um design acabado que pode ser transformado diretamente em código. É uma descrição ou template para resolver um problema particular. Veja neste WebCast sobre os seguintes tópicos:
- Histórico dos Patterns;
- Patterns básicos do .NET
- Classificação dos Patterns

Published in: Technology

Transcript of "Design Patterns (MSDN Webcast)"

  1. 1. Padrões de design no .NET Framework<br />Giovanni Bassi<br />ConsultorIndependente<br />Microsoft MVP C#<br />26/01/2010<br />
  2. 2. Ou...5 Padrões em 50 minutos<br />2<br />
  3. 3. Giovanni Bassi<br />
  4. 4. Online @<br /><ul><li>Giovanni BassiEmail: giggio@giggio.netBlog: unplugged.giggio.netSite: giovannibassi.comTwitter: @giovannibassi
  5. 5. .Net ArchitectsGrupo: www.dotnetarchitects.netPodcast: podcast.dotnetarchitects.netOnline: tinyurl.com/DotNetArchDojo: dojo.dotnetarchitects.netTwitter: #DotNetArchitects@NetArchitects</li></ul>4<br />
  6. 6. Agenda<br />5<br />
  7. 7. Padrões de Projeto<br />6<br />
  8. 8. Quando você começa a estudar padrões de projeto<br />7<br />
  9. 9. 8<br />
  10. 10. 9<br />Alguémjápensounisso antes!<br />
  11. 11. 10<br />
  12. 12. 11<br />
  13. 13. 12<br />
  14. 14. Alguns padrões de projeto<br />13<br />Na wikipedia: http://tinyurl.com/dpwiki<br />
  15. 15. Strategy (ou Policy)<br />14<br />
  16. 16. Strategy<br />15<br />
  17. 17. Strategy – código<br />publicclassContexto<br />{<br />publicEstrategiaEstrategia { get; set; }<br />}<br />publicabstractclassEstrategia<br />{<br />}<br />publicclassEstrategiaConcreta1 : Estrategia<br />{<br />}<br />publicclassEstrategiaConcreta2 : Estrategia<br />{<br />}<br />16<br />Poderia ser uma Interface<br />
  18. 18. Strategy – código<br />classController <br />{<br />publicIRepositorioRepositorio { get; set; }<br />publicvoidExcluir(Entidadeentidade)<br /> {<br />Repositorio.Excluir(entidade.Id);<br /> }<br />}<br />interfaceIrepositorio<br />{<br />voidExcluir(int id);<br />}<br />17<br />
  19. 19. Strategy – repositório SQL Server<br />classRepositorioSQLServer : Irepositorio<br />{<br />publicvoidExcluir(int id)<br />{ <br />//altera o banco de dados <br />}<br />}<br />18<br />
  20. 20. Strategy – repositório XML<br />classRepositorioXml : Irepositorio<br />{<br />publicvoidExcluir(int id)<br />{<br />//altera o xml<br />}<br />}<br />19<br />
  21. 21. Strategy – repositório para testes<br />classRepositorioFalso : IRepositorio<br />{<br />publicboolChamouExcluir;<br />publicintIdChamado;<br />publicvoidExcluir(int id)<br /> {<br />ChamouExcluir = true;<br />IdChamado = id;<br /> }<br />}<br />20<br />
  22. 22. 21<br />“<br />Definaumafamília de algoritmos, encapsulecada um, e torne-osintercambiáveis. Strategy permiteque o algoritmovarieindependente dos clientesque o utilizam.<br />
  23. 23. 22<br />Encapsule e separe o que muda<br />
  24. 24. 23<br />“Policy”?<br />(“Política”?)<br />
  25. 25. 24<br />Princípio SOLID<br />Open ClosedPrinciplePrincípio aberto fechado<br /><ul><li>“Entidades de software (classes, módulos, funções, etc) devem ser abertasparaextensãomasfechadasparamodificações” – Bertrand Meyer (1988)
  26. 26. Você deve ser capaz de estender uma classe sem modificá-la
  27. 27. Separe o pode mudar do que não deve mudar
  28. 28. Só é possível com abstrações</li></li></ul><li>TemplateMethod<br />25<br />
  29. 29. Template Method<br />26<br />
  30. 30. Template Method<br />27<br />
  31. 31. Template Method – código<br />abstractclassTransferencia<br />{<br />publicvoidTransferir()<br />{<br />Debitar();<br />Creditar();<br />AcoesPosLancamento();<br />}<br />protectedvirtualvoidAcoesPosLancamento(){ }<br />protectedabstractvoidCreditar();<br />protectedabstractvoidDebitar();<br />}<br />28<br />Template Method<br />
  32. 32. Template Method– código<br />abstractclassTransferencia<br />{<br />publicvoidTransferir()<br />{<br />Debitar();<br />Creditar();<br />AcoesPosLancamento();<br />}<br />protectedvirtualvoidAcoesPosLancamento(){ }<br />protectedabstractvoidCreditar();<br />protectedabstractvoidDebitar();<br />}<br />29<br />Algoritmo encapsulado<br />
  33. 33. Template Method– código<br />abstractclassTransferencia<br />{<br />publicvoidTransferir()<br />{<br />Debitar();<br />Creditar();<br />AcoesPosLancamento();<br />}<br />protectedvirtualvoidAcoesPosLancamento(){ }<br />protectedabstractvoidCreditar();<br />protectedabstractvoidDebitar();<br />}<br />30<br />Gancho<br />
  34. 34. Template Method – Transferência interna<br />classTransferenciaInterna : Transferencia<br />{<br />protectedoverridevoidCreditar()<br /> {<br />//creditarcontainterna<br /> }<br />protectedoverridevoidDebitar()<br /> {<br />//debitarcontainterna<br /> }<br />}<br />31<br />
  35. 35. Template Method – DOC<br />classDOC : Transferencia<br />{<br />protectedoverridevoidCreditar()<br /> {<br />//creditarbanco de destino<br /> }<br />protectedoverridevoidDebitar()<br /> {<br />//debitarbanco local<br /> }<br />protectedoverridevoidAcoesPosLancamento()<br /> {<br />//notificarbanco de destino, etc...<br /> }<br />}<br />32<br />
  36. 36. 33<br />“<br />Define um esqueleto de algoritmos em um método, delegando alguns passos a subclasses. O método permite que subclasses redefinam alguns passos de um algoritmo sem mudar a estrutura do algoritmo.<br />
  37. 37. Padrão Factory?<br />34<br />
  38. 38. Padrão Factory?<br />Factory Method<br />Abstract Factory<br />35<br />
  39. 39. FactoryMethod<br />36<br />
  40. 40. Era uma vez um “new”...<br />37<br />
  41. 41. Factory Method<br />38<br />
  42. 42. Factory Method – criador e produto<br />abstractclassGerenciadorDeConexoes<br />{<br />publicabstractConexaoObterConexao();<br />}<br />abstractclassConexao<br />{<br />}<br />39<br />Factory Method<br />
  43. 43. Factory Method – SQL Server<br />classGerenciadorDeConexoesSqlServer : GerenciadorDeConexoes<br />{<br />publicoverrideConexaoObterConexao()<br /> {<br />returnnewConexaoSqlServer();<br /> }<br />}<br />classConexaoSqlServer : Conexao<br />{<br />}<br />40<br />
  44. 44. Factory Method – SQL Compact<br />classGerenciadorDeConexoesSqlCompact : GerenciadorDeConexoes<br />{<br />publicoverrideConexaoObterConexao()<br /> {<br />returnnewConexaoSqlCompact();<br /> }<br />}<br />classConexaoSqlCompact : Conexao<br />{<br />}<br />41<br />
  45. 45. Simple Factory – Não confundir<br />classGerenciadorDeConexoesSuperAcoplado<br />{<br />publicConexaoObterConexao()<br /> {<br />//if (blablabla...)<br />returnnewConexaoSqlServer();<br />//else (xyz...)<br />returnnewConexaoSqlCompact();<br /> }<br />}<br />42<br />
  46. 46. 43<br />“<br />O Factory Method define uma interface para criar um objeto, mas deixa as subclasses decidirem qual classe instanciar. O Factory Method permite a uma classe adiar a instanciação às subclasses.<br />
  47. 47. Abstract Factory<br />44<br />
  48. 48. Abstract Factory<br />45<br />
  49. 49. Abstract Factory no .Net Framework<br />46<br />
  50. 50. Abstract Factory – no .Net Framework<br />classCliente{<br />publicvoidFazAlgumaCoisa()<br />{<br />vardbProviderFactory= <br />DbProviderFactories.GetFactory(&quot;System.Data.OleDb&quot;);<br />var command = dbProviderFactory.CreateCommand();<br />var connection = dbProviderFactory.CreateConnection();<br />//fazalgumacoisa...<br />}<br />}<br />47<br />
  51. 51. 48<br />“<br />O Abstract Factory fornece uma interface para criação de famílias de objetos relacionados ou dependentes sem especificar suas classes concretas.<br />
  52. 52. Singleton<br />49<br />
  53. 53. Singleton<br />50<br />
  54. 54. Singleton – Simples<br />classSingleton<br />{<br />privatestaticreadonlySingleton _instancia = newSingleton();<br />private Singleton() { }<br />publicstaticSingletonInstancia<br /> {<br />get<br /> {<br />return _instancia;<br /> }<br /> }<br />}<br />51<br />
  55. 55. Singleton – Simples<br />classSingleton<br />{<br />privatestaticreadonlySingleton _instancia = newSingleton();<br />private Singleton() { }<br />publicstaticSingletonInstancia<br /> {<br />get<br /> {<br />return _instancia;<br /> }<br /> }<br />}<br />52<br />Construtor<br />
  56. 56. Singleton – Sincronizado<br />classSingleton {<br />privatestaticSingleton _instancia;<br />private Singleton() { }<br />publicstaticSingletonInstancia<br /> {<br />get<br /> {<br />if (_instancia == null)<br />lock (typeof(Singleton))<br />if (_instancia == null)<br /> _instancia = newSingleton();<br />return _instancia;<br /> }<br /> }<br />}<br />53<br />
  57. 57. Cuidado!<br />54<br />Singletons podem ser perigosos...<br />
  58. 58. 55<br />Singleton desnecessário<br />Estado global<br />Anti-pattern?<br />Reversão difícil<br />Maisdifíciltestar<br />Podeserquebrado…<br />
  59. 59. Alternativas:<br />56<br />
  60. 60. 57<br />“<br />O padrão Singleton garante que uma classe possui apenas uma instância, e provê um ponto de acesso global a ela.<br />
  61. 61. Padrões de Arquitetura<br />58<br />
  62. 62. 59<br />
  63. 63. Alguns padrões de arquitetura (1)<br />60<br />http://martinfowler.com/eaaCatalog/<br />
  64. 64. Alguns padrões de arquitetura (2)<br />61<br />http://martinfowler.com/eaaCatalog/<br />
  65. 65. Conclusões<br />62<br />
  66. 66. 63<br />Patterns Cop<br />
  67. 67. 64<br />
  68. 68. Patterns Crazy<br />
  69. 69. 66<br />
  70. 70. Mais informações<br />Design Patterns: http://dofactory.com/Patterns/Patterns.aspxhttp://en.wikipedia.org/wiki/Design_Patterns<br />Padrões de Arquitetura (Fowler):http://martinfowler.com/eaaCatalog<br />.Net Unplugged:http://unplugged.giggio.net/?tag=/design+patterns<br />Na MSDN Magazine:http://tinyurl.com/msdnmagdp1http://tinyurl.com/msdnmagdp2<br />
  71. 71. 68<br />Obrigado!<br />
  72. 72. 69<br />Dúvidas<br />
  73. 73. Online @<br /><ul><li>Giovanni BassiEmail: giggio@giggio.netBlog: unplugged.giggio.netSite: giovannibassi.comTwitter: @giovannibassi
  74. 74. .Net ArchitectsGrupo: www.dotnetarchitects.netPodcast: podcast.dotnetarchitects.netOnline: tinyurl.com/DotNetArchTwitter: #DotNetArchitects@NetArchitects</li></ul>70<br />
  75. 75. © 2009 Microsoft Corporation. All rights reserved. Microsoft, MSDN, the MSDN logo, and [list other trademarks referenced] are trademarks of the Microsoft group of companies.  <br />The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation.  Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation.  MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED, OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.<br />

×