Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Padrões de Projeto Facade em Linguagens Dinâmicas

Padrões de Projeto Facade em Linguagens Dinâmicas

Padrões de projeto é um conceito muito importante em programação. Esta apresentação abordará conceitos de padrões de projeto e explorará o padrão façade no contexto de linguagens dinâmicas.

Marcel dos Santos

November 16, 2016
Tweet

More Decks by Marcel dos Santos

Other Decks in Technology

Transcript

  1. Marcel Gonçalves dos Santos
    @marcelgsantos
    em linguagens dinâmicas
    padrões de projeto
    Façade

    View Slide

  2. pensandonaweb.com.br
    desenvolvedor web full-stack
    Marcel Gonçalves dos Santos
    @marcelgsantos

    View Slide

  3. View Slide

  4. @phpsp
    phpsp.org.br

    View Slide

  5. @femugsp
    sp.femug.com

    View Slide

  6. Learning OOP in PHP
    Tutoriais, vídeos, slides, livros sobre OOP, OOD,
    padrões de projetos, refatoração e arquitetura.
    bit.ly/Learning-OOP-in-PHP

    View Slide

  7. O que são padrões
    de projeto?

    View Slide

  8. o projeto de software
    orientado a objetos
    é difícil

    View Slide

  9. o projeto de software
    reutilizável orientado a
    objetos é ainda mais difícil

    View Slide

  10. costumamos utilizar
    soluções que funcionaram
    anteriormente

    View Slide

  11. quando encontramos boas
    soluções, utilizamos elas
    repetidamente

    View Slide

  12. e encontramos padrões
    de classes e de comunicação
    entre objetos…

    View Slide

  13. …que reaparecem
    frequentemente em sistemas
    orientados a objetos

    View Slide

  14. cada padrão de projeto
    sistematicamente nomeia,
    explica e avalia um aspecto
    importante e recorrente em
    sistemas orientado o objetos

    View Slide

  15. os padrões de projetos,
    segundo o GoF, são
    descrições de objetos e
    classes comunicantes…

    View Slide

  16. …que precisam ser persona-
    lizadas para resolver um
    problema geral de projeto
    num contexto particular

    View Slide

  17. Elementos essenciais
    de um padrão
    de projeto

    View Slide

  18. um padrão de projeto tem
    quatro elementos
    essenciais

    View Slide

  19. os elementos são nome do
    padrão, problema, solução
    e consequências

    View Slide

  20. Classificação dos
    padrões de projeto

    View Slide

  21. os padrões de projetos podem
    ser de criação, estrutural ou
    comportamental

    View Slide

  22. Padrões estruturais

    View Slide

  23. os padrões estruturais se
    preocupam com a forma como
    classes e objetos são
    compostos para formar
    estruturas maiores

    View Slide

  24. Façade é um padrão de
    projeto estrutural

    View Slide

  25. Padrão de projeto 

    Façade

    View Slide

  26. Intenção

    View Slide

  27. fornecer uma interface
    unificada para um conjunto
    de interfaces em um
    subsistema

    View Slide

  28. definir uma interface de
    nível mais alto que torna o
    subsistema mais fácil de ser
    usado

    View Slide

  29. Motivação

    View Slide

  30. estruturar um sistema em
    subsistemas ajuda a reduzir
    a complexidade

    View Slide

  31. um objetivo de todos os
    projetos é minimizar a
    comunicação e as
    dependências entre
    subsistemas

    View Slide

  32. uma maneira de atingir este
    objetivo é introduzir um
    objeto façade…

    View Slide

  33. …ele fornece uma interface
    única e simplificada para os
    recursos e facilidades mais
    gerais de um subsistema

    View Slide

  34. uma façade é uma interface
    entre classes-clientes e
    classes do subsistema

    View Slide

  35. View Slide

  36. uma façade torna a vida
    mais fácil para a maioria dos
    programadores…

    View Slide

  37. …sem ocultar a funcionalidade
    de nível mais baixo dos
    poucos que a necessitam

    View Slide

  38. Aplicabilidade

    View Slide

  39. devemos usar uma façade
    quando…

    View Slide

  40. desejamos fornecer uma
    interface simples para um
    subsistema complexo

    View Slide

  41. existirem muitas dependên-
    cias entre clientes e classes
    de implementação de uma
    abstração

    View Slide

  42. desejamos estruturar
    nossos subsistemas em
    camadas

    View Slide

  43. Estrutura

    View Slide

  44. View Slide

  45. Participantes

    View Slide

  46. Façade

    View Slide

  47. conhece quais as classes do
    subsistema são responsáveis
    pelo atendimento de uma
    solicitação

    View Slide

  48. delega solicitações de
    clientes a objetos
    apropriados do subsistema

    View Slide

  49. Classes de subsistema

    View Slide

  50. implementam a
    funcionalidade do
    subsistema

    View Slide

  51. encarregam-se do trabalho
    atribuído a elas pelo objeto
    façade

    View Slide

  52. não tem conhecimento da
    façade, ou seja, não mantêm
    referências para a mesma

    View Slide

  53. Colaborações

    View Slide

  54. os clientes se comunicam
    com um subsistema através
    do envio de solicitações
    para a façade…

    View Slide

  55. …que as repassa para os
    objetos apropriados do
    subsistema

    View Slide

  56. a façade pode ter código
    próprio para poder traduzir
    a sua interface para as
    interfaces de subsistemas

    View Slide

  57. os clientes que utilizam uma
    façade não acessam os
    objetos do subsistema
    diretamente

    View Slide

  58. Consequências

    View Slide

  59. Benefícios

    View Slide

  60. isola os clientes dos
    componentes do
    subsistema…

    View Slide

  61. …reduzindo o número de
    objetos que os clientes têm
    que lidar e tornando o sub-
    sistema mais fácil de usar

    View Slide

  62. promove um acoplamento
    fraco entre o subsistema e
    seus clientes

    View Slide

  63. não impedem as aplicações
    utilizar as classes do
    subsistema caso necessitem

    View Slide

  64. Implementação

    View Slide

  65. // Complex Parts
    interface BiosInterface
    {
    public function execute();
    public function waitForKeyPress();
    public function launch(OsInterface $os);
    public function powerDown();
    }
    interface OsInterface
    {
    public function halt();
    public function getName(): string;
    }

    View Slide

  66. // Facade
    class Facade
    {
    private $os;
    private $bios;
    public function __construct(BiosInterface $bios, OsInterface $os)
    {
    $this->bios = $bios;
    $this->os = $os;
    }
    public function turnOn()
    {
    $this->bios->execute();
    $this->bios->waitForKeyPress();
    $this->bios->launch($this->os);
    }
    public function turnOff()
    {
    $this->os->halt();
    $this->bios->powerDown();
    }
    }

    View Slide

  67. # Complex Parts
    class CPU
    def freeze; end
    def jump(position); end
    def execute; end
    end
    class Memory
    def load(position, data); end
    end
    class HardDrive
    def read(lba, size); end
    end

    View Slide

  68. # Facade
    class ComputerFacade
    def initialize
    @processor = CPU.new
    @ram = Memory.new
    @hd = HardDrive.new
    end
    def start
    @processor.freeze
    @ram.load(BOOT_ADDRESS,
    @hd.read(BOOT_SECTOR, SECTOR_SIZE))
    @processor.jump(BOOT_ADDRESS)
    @processor.execute
    end
    end

    View Slide

  69. # Client
    computer_facade = ComputerFacade.new
    computer_facade.start

    View Slide

  70. Linguagens Dinâmicas

    View Slide

  71. segundo Peter Norvig, o
    padrão façade com
    módulos é invisível

    View Slide

  72. não é necessário classes e
    objetos para bookkeeping

    View Slide

  73. basta exportar os nomes
    que compõem a interface

    View Slide

  74. Usos Conhecidos

    View Slide

  75. Padrões Relacionados

    View Slide

  76. * Abstract Factory
    * Mediator
    * Singleton

    View Slide

  77. Referências

    View Slide

  78. * Padrões de Projeto, GoF
    * https:/
    /pt.wikipedia.org/wiki/Façade
    * https:/
    /github.com/domnikl/
    DesignPatternsPHP
    * https:/
    /garoa.net.br/wiki/
    Design_patterns_em_linguagens_dinâ
    micas

    View Slide

  79. Perguntas?

    View Slide

  80. Obrigado.
    @marcelgsantos
    speakerdeck.com/marcelgsantos

    View Slide