Design patterns em linguagens dinâmicas

De Garoa Hacker Clube
Ir para: navegação, pesquisa
2º encontro do ciclo "Design Patterns em linguagens dinâmicas", edição 2013

Proposta

Grupo de estudos e discussão presencial no Garoa Hacker Clube para rever padrões de projeto e sua aplicabilidade e variações em linguagens dinâmicas (Python, Ruby, JavaScript etc.).

Na edição 2014 o foco é na linguagem Python.

Atenção: não é preciso se inscrever! Esta atividade é aberta e gratuita. Basta aparecer!

Contexto

O livro Design Patterns de Gamma et. al., documenta 23 padrões de projeto. A maioria dos exemplos de código são em C++ e há alguns em Smalltalk.

Em 1996, Peter Norvig fez uma apresentação Design Patterns in Dynamic Languages

Nesta apresentação o slide 10 tem o seguinte conteúdo:

Design Patterns in Dylan or Lisp

16 of 23 patterns are either invisible or simpler, due to:

  • First-class types (6): Abstract-Factory, Flyweight, Factory-Method, State, Proxy, Chain-Of-Responsibility
  • First-class functions (4): Command, Strategy, Template-Method, Visitor
  • Macros (2): Interpreter, Iterator
  • Method Combination (2): Mediator, Observer
  • Multimethods (1): Builder
  • Modules (1): Facade

Proposta detalhada

Considerando que linguagens dinâmicas modernas como Python, Ruby e JavaScript emprestam várias das características dinâmicas de Lisp mencionadas por Norvig, a idéia é rever um subconjunto dos design patterns originais avaliando sua utilidade e alternativas de implementação em uma ou mais dessas linguagens.

  • Para cada encontro, escolher 2 padrões para estudo e discussão:
    • um dos 16 da lista do Norvig (acima)
    • um dos 7 restantes, que não aparecem nesta lista porque devem ser aplicáveis também em linguagens dinâmicas na forma descrita no livro Design Patterns.
  • Apresentar código exemplo nas linguagens dinâmicas de preferência dos participantes

Pares de padrões relacionados

  • Memento e Visitor
  • Proxy e Decorator
  • Prototype, Singleton e Borg

Cronograma

Edição 2014

Reuniões em 2 quartas-feiras por mês (normalmente a cada 2 semanas), começando sempre às 19:30.

Datas:

  • 12/mar
  • 26/mar *pausa*: Seven Masters
  • 9/abr *pausa*: palestra Voltando a gostar de GUIs com Go e QML com Gustavo Niemeyer
  • 16/abr: Strategy, Multiton(*) (slides e código)
  • 5/mai: Abstract Factory, Factory Method (apresentado por Hilton Fernandes)
  • 19/mai: Builder (apresentado por Leonardo Leite (apresentação))
  • 9/jun: Interpreter (apresentado por Guto Maia)
  • 23/jun: State (apresentado por Luciano Ramalho)

(*) Multiton não é um dos patterns citados no GoF, exceto como "registry of singletons".

Edição 2013

Datas:

  • 3/abr - Iterator e Generator, GRASP, exemplo de Template Method
  • 17/abr - Memento e Visitor
  • 8/mai - Composite e Flyweight
  • 22/mai - Strategy, State e Chain of Responsability. Motivação: Remover uma grande sequência de IFs
  • 5/jun - Abstract Factory, Observer, Singleton e Borg*
  • 19/jun

(*) Borg não é um dos 23 patterns do GoF, mas é um substituto interessante do Singleton em Python

Padrões

Legenda
# número do padrão no livro de Gamma et.al.
type família do padrão
name nome do padrão
V visto nos encontros do Turing Clube em 2013
HF analisado no livro Head First Design Patterns (+++: três análises)
R número de citações como padrão relacionado (v. related patterns)
PN M=mencionado; A=analisado nos slides de Peter Norvig
feature característica de linguagens dinâmicas que afeta este padrão
related patterns padrões relacionados a este no livro de Gamma et.al.


# type name V HF R PN feature related patterns
1 Creational Abstract Factory v + 6 MA First class types Factory Method, Prototype, Singleton
2 Creational Builder 1 MA Multimethods Abstract Factory, Composite
3 Creational Factory Method + 3 M First class types Abstract Factory, Template Method, Prototypes
4 Creational Prototype 3 Abstract Factory, Composite, Decorator
5 Creational Singleton v + 4 A Abstract Factory, Builder, Prototype
6 Structural Adapter + 3 Bridge, Decorator, Proxy
7 Structural Bridge 1 Abstract Factory, Adapter
8 Structural Composite v + 9 Chain of Responsibility, Decorator, Flyweight, Iterator, Visitor
9 Structural Decorator + 4 Adapter, Composite, Strategy
10 Structural Facade v + 1 MA Modules Abstract Factory, Mediator, Singleton
11 Structural Flyweight v 4 M First class types Composite, State, Strategy
12 Structural Proxy +++ 1 M First class types Adapter, Decorator
13 Behavioral Chain of Responsibility v 1 M First class types Composite
14 Behavioral Command + 1 M First class functions Composite, Memento, Prototype
15 Behavioral Interpreter 1 MA Macros Composite, Flyweight, Iterator, Visitor
16 Behavioral Iterator v + 3 MA Macros Composite, Factory Method, Memento
17 Behavioral Mediator 2 MA Method Combination Facade, Observer
18 Behavioral Memento v 2 Command, Iterator
19 Behavioral Observer v + 1 MA Method Combination Mediator, Singleton
20 Behavioral State v + 1 M First class types Flyweight, Singleton
21 Behavioral Strategy v + 3 MA First class functions Flyweight
22 Behavioral Template Method v + 1 M First class functions Factory Method, Strategy
23 Behavioral Visitor v 2 M First class functions Composite, Interpreter

Grafo de relação entre padrões

RelacaoEntreDesignPatterns.png

Referências

Participantes

Grupo de 2014

Grupo de 2013

Mais informações

Dúvidas, comentários e sugestões: inscreva-se e mande sua mensagem para o grupo de discussão do Garoa Hacker Clube em https://groups.google.com/group/hackerspacesp . Coloque Design Patterns no assunto.