Design Patterns (MSDN Webcast)

2,936 views

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
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,936
On SlideShare
0
From Embeds
0
Number of Embeds
1,037
Actions
Shares
0
Downloads
0
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

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 />

×