SlideShare ist ein Scribd-Unternehmen logo
1 von 26
Downloaden Sie, um offline zu lesen
Design Patterns
resolvendo problemas comuns
Agenda
● Gang of Four (GoF)
● O que é design pattern
● Tipos de padrões
○ template method
○ strategy
○ observer
○ composite
○ iterator
● Ordem do livro
○ template
○ strategy
○ observer
○ composite
○ iterator
○ command
○ adapter
○ proxy
○ decorator
○ singleton
○ factory
○ builder
○ interpreter
Gang of Four (GoF)
O que seria Gang of Four?
Gang of Four (GoF)
talvez...
Gang of Four (GoF)
nããããão...
Gang of Four (GoF)
O Gang of Four são os autores do livro "Design
Patterns: Elements of Reusable Object-
Oriented Software". Este importante livro
descreve várias técnicas de desenvolvimento e
armadilhas, além de fornecer vinte e três
padrões de projeto de programação orientadas
a objeto. Os quatro autores foram Erich
Gamma, Richard Helm, Ralph Johnson e John
Vlissides.
— Richard Carr (blackwasp.co.uk)
O que é design pattern?
(…) Design Pattern, descreve uma solução
geral reutilizável para um problema
recorrente no desenvolvimento de sistemas de
software orientados a objetos.
— wikipedia (sic)
Gang of Four (GoF)
Debate sugerido
Gang of Four (GoF)
Debate sugerido
Separe as coisas que mudam das coisas que
são sempre as mesmas
Gang of Four (GoF)
Debate sugerido
Programe para uma interface e não para uma
implementação
Gang of Four (GoF)
Debate sugerido
Prefira composição ao no lugar de herança
Gang of Four (GoF)
Debate sugerido
Delegue, delegue, delegue
●
○ factory method
○ prototype
○
●
○ facade
○ flyweight
○ composite
○ decorator
○ proxy
●
○ chain of responsibility
○ mediator
○ memento
○ state
○ visitor
○ template method
●
○ factory method
○ prototype
○
●
○ facade
○ flyweight
○ composite
○ decorator
○ proxy
●
○ chain of responsibility
○ mediator
○ memento
○ state
○ visitor
○ template method
● Padrões de Criação
○ factory
○ builder
○ singleton
● Padrões estruturais
○ adapter
○ bridge
○ composite
○ decorator
○ proxy
● Padrões comportamentais
○ command
○ interpreter
○ iterator
○ observer
○ strategy
○ template method
Tipos de padrões
●
○ abstract factory
○ builder
○ singleton
●
○ adapter
○ bridge
○ composite
○ decorator
○ proxy
●
○ command
○ interpreter
○ iterator
○ observer
○ strategy
○ template method
●
○ factory method
○ prototype
○
●
○ facade
○ flyweight
○ composite
○ decorator
○ proxy
●
○ chain of responsibility
○ mediator
○ memento
○ state
○ visitor
○ template method
●
○ factory method
○ prototype
○
●
○ facade
○ flyweight
○ composite
○ decorator
○ proxy
●
○ chain of responsibility
○ mediator
○ memento
○ state
○ visitor
○ template method
● Padrões de Criação
○ factory
○ builder
○ singleton
● Padrões estruturais
○ adapter
○ bridge
○ composite
○ decorator
○ proxy
● Padrões comportamentais
○ command
○ interpreter
○ iterator
○ observer
○ strategy
○ template method
Tipos de padrões
●
○ abstract factory
○ builder
○ singleton
●
○ adapter
○ bridge
○ composite
○ decorator
○ proxy
●
○ command
○ interpreter
○ iterator
○ observer
○ strategy
○ template method
●
○ abstract factory
○ builder
○ singleton
●
○ adapter
○ bridge
○ composite
○ decorator
○ proxy
●
○ command
○ interpreter
○ iterator
○ observer
○ strategy
○ template method
o que veremos hoje
O problema:
O script precisa de uma alteração em uma
determinada parte do processo para que seja
usada de outra forma dependendo de sua
apliação
template method
Como resolver
class Report
// define header, output_line and footer as raised
def report()
header
@lines.each do |line|
output_line line
end
footer
end
end
class HTMLReport < Report
# implement header, output_line and footer methods
end
class PlainReport < Report
# implement header, output_line and footer methods
end
strategy
O problema:
Apesar do template method resolver o
problema de forma simples e direta às vezes
queremos mudar grande parte do script
Como resolver
class Consessionaria
attr_reader :loja, :carros
attr_accessor :testador
def initialize(testador)
@loja = "Importados Classic"
@carros = ["Ferrari", "Lamborghini", "BMW", "Chevrolet"]
@testador = testador
end
def fazer_test_drive
@testador.fazer_test_drive(@loja, @carros)
end
end
class Test_Drive
def fazer_test_drive(loja, carros)
puts "> #{loja}"
carros.each do |carro|
puts "Testando #{carro}..."
end
end
end
observer
O problema:
Integrar vários objetos a apenas um para que
eles executem determinada ação a partir da
ação executada pelo primeiro objeto
Como resolver
class Funcionario
def initialize(nome, salario)
@nome = nome
@salario = salario
@observers = []
end
def salario=(novo_salario)
@salario = novo_salario
notify_observers
end
def notify_observers
@observers.each do |observer|
observer.update self
end
end
def add_observer(observer)
@observers << observer
end
def remove_observer(observer)
@observer.remove(observer)
end
end
composite
O problema:
Criar uma estrutura em forma de árvore a fim
de poder adicionar ou remover tarefas em
cascata, desta forma o código se torna mais
limpo e de fácil compreensão
Como resolver
class Tarefa
attr_reader :nome
def initialize(nome)
@nome = nome
end
def tempo_requerido
0.0
end
end
class AdicionarIngredientes < tarefa
def initialize
super "Adicionar ingredientes"
end
def tempo_requerido
1.0
end
end
class BaterIngredientes < Tarefa
def initialize
super "Bater ingredientes"
end
def tempo_requerido
3.0
end
end
class CompositeTask < Tarefa
def initialize(name)
super name
@sub_tarefas = []
end
def adiciona_sub_tarefa(tarefa)
@sub_tarefas << tarefa
end
def remove_sub_tarefa(tarefa)
@sub_tarefas.delete(tarefa)
end
def tempo_requerido
tempo = 0
@sub_tarefas.each do |tarefa|
tempo += tarefa.tempo_requerido
end
tempo
end
end
class BaterBolo < CompositeTask
def initialize
super "Bater o Bolo"
adiciona_sub_tarefa AdicionarIngredientes.new
adiciona_sub_tarefa BaterIngredientes.new
end
end
iterator
O problema:
Criar uma estrutura de objetos similares em
forma de coleção a fim de poder acessar todos
de uma só vez
Como resolver
# external
class ArrayIterator
def initialize(array)
@array = array
@index = 0
end
def has_next?
@index < @array.length
end
def item
@array[@index]
end
def next_item
value = @array[@index]
@index++
value
end
end
array = ["Michael", "Alice", "Lyssa"]
i = ArrayIterator(array)
while i.has_next?
puts "Pessoa: #{i.next_item}"
end
# internal
def roll_all_elements(array)
i = 0
while i < array.length
yield array[i]
i += 1
end
end
a = ["Milfont", "Demis", "Enzo"]
roll_all_elements(a) {|p| puts "Pessoa: #{p}" }
referencias
Design Patterns In Ruby — Russ Olsen
http://blackwasp.co.uk/GofPatterns.aspx
http://sourcemaking.com/design_patterns/
http://pt.wikipedia.org/wiki/Padr%C3%
A3o_de_projeto_de_software
https://github.com/nslocum/design-patterns-in-ruby
Obrigado!

Weitere ähnliche Inhalte

Ähnlich wie Design patterns: resolvendo problemas comuns (ruby)

Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverEduardo Jorge
 
AutomaçãoWeb - Chaordic Academy
AutomaçãoWeb - Chaordic AcademyAutomaçãoWeb - Chaordic Academy
AutomaçãoWeb - Chaordic AcademyFausto Siqueira
 
TDC Florianópolis 2013 - Refatorar! porque ninguém gosta de código que cheir...
TDC Florianópolis 2013  - Refatorar! porque ninguém gosta de código que cheir...TDC Florianópolis 2013  - Refatorar! porque ninguém gosta de código que cheir...
TDC Florianópolis 2013 - Refatorar! porque ninguém gosta de código que cheir...Elias Souza
 
Apresentação design patterns GOF, padrão decorator e padrão Observer.
Apresentação design patterns GOF, padrão decorator e padrão Observer.Apresentação design patterns GOF, padrão decorator e padrão Observer.
Apresentação design patterns GOF, padrão decorator e padrão Observer.Vinicius Pulgatti
 
Cacheamento Lado Servidor
Cacheamento Lado ServidorCacheamento Lado Servidor
Cacheamento Lado ServidorMario Guedes
 
Exemplos de Design Patterns em Java
Exemplos de Design Patterns em JavaExemplos de Design Patterns em Java
Exemplos de Design Patterns em Javaalexmacedo
 
Padrões de Projeto de Software Orientado a Objetos
Padrões de Projeto de Software Orientado a ObjetosPadrões de Projeto de Software Orientado a Objetos
Padrões de Projeto de Software Orientado a ObjetosCloves da Rocha
 
Aula02_Vars_Ident_Ent_Saida_Algoritmos.pptx
Aula02_Vars_Ident_Ent_Saida_Algoritmos.pptxAula02_Vars_Ident_Ent_Saida_Algoritmos.pptx
Aula02_Vars_Ident_Ent_Saida_Algoritmos.pptxaronoliveira3
 
Treinamento TDD - Atech
Treinamento TDD - AtechTreinamento TDD - Atech
Treinamento TDD - Atechcesarcneto
 
Java+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso TotalJava+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso TotalEduardo Bregaida
 
JavaScript Firme: Módulos com RequireJS e BDD com Jasmine
JavaScript Firme: Módulos com RequireJS e BDD com JasmineJavaScript Firme: Módulos com RequireJS e BDD com Jasmine
JavaScript Firme: Módulos com RequireJS e BDD com JasmineAndré Willik Valenti
 
Dicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDouglas V. Pasqua
 
Aula 1 view model livedata e databinding.pptx
Aula 1   view model livedata e databinding.pptxAula 1   view model livedata e databinding.pptx
Aula 1 view model livedata e databinding.pptxRicardo Ogliari
 
POO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdfPOO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdfAndreCosta502039
 
Drupal e a Qualidade de Software
Drupal e a Qualidade de SoftwareDrupal e a Qualidade de Software
Drupal e a Qualidade de SoftwareDaniel Carvalhinho
 
De Zero à Web com Python e Django
De Zero à Web com Python e DjangoDe Zero à Web com Python e Django
De Zero à Web com Python e DjangoOsvaldo Santana Neto
 
Formando Desenvolvedores Efetivos
Formando Desenvolvedores EfetivosFormando Desenvolvedores Efetivos
Formando Desenvolvedores EfetivosDiego Santos
 

Ähnlich wie Design patterns: resolvendo problemas comuns (ruby) (20)

Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserver
 
AutomaçãoWeb - Chaordic Academy
AutomaçãoWeb - Chaordic AcademyAutomaçãoWeb - Chaordic Academy
AutomaçãoWeb - Chaordic Academy
 
TDC Florianópolis 2013 - Refatorar! porque ninguém gosta de código que cheir...
TDC Florianópolis 2013  - Refatorar! porque ninguém gosta de código que cheir...TDC Florianópolis 2013  - Refatorar! porque ninguém gosta de código que cheir...
TDC Florianópolis 2013 - Refatorar! porque ninguém gosta de código que cheir...
 
Programando em Go
Programando em GoProgramando em Go
Programando em Go
 
Apresentação design patterns GOF, padrão decorator e padrão Observer.
Apresentação design patterns GOF, padrão decorator e padrão Observer.Apresentação design patterns GOF, padrão decorator e padrão Observer.
Apresentação design patterns GOF, padrão decorator e padrão Observer.
 
Design Patterns em Ruby
Design Patterns em RubyDesign Patterns em Ruby
Design Patterns em Ruby
 
Cacheamento Lado Servidor
Cacheamento Lado ServidorCacheamento Lado Servidor
Cacheamento Lado Servidor
 
Exemplos de Design Patterns em Java
Exemplos de Design Patterns em JavaExemplos de Design Patterns em Java
Exemplos de Design Patterns em Java
 
Padrões de Projeto de Software Orientado a Objetos
Padrões de Projeto de Software Orientado a ObjetosPadrões de Projeto de Software Orientado a Objetos
Padrões de Projeto de Software Orientado a Objetos
 
Aula02_Vars_Ident_Ent_Saida_Algoritmos.pptx
Aula02_Vars_Ident_Ent_Saida_Algoritmos.pptxAula02_Vars_Ident_Ent_Saida_Algoritmos.pptx
Aula02_Vars_Ident_Ent_Saida_Algoritmos.pptx
 
Treinamento TDD - Atech
Treinamento TDD - AtechTreinamento TDD - Atech
Treinamento TDD - Atech
 
Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
 
Java+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso TotalJava+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso Total
 
JavaScript Firme: Módulos com RequireJS e BDD com Jasmine
JavaScript Firme: Módulos com RequireJS e BDD com JasmineJavaScript Firme: Módulos com RequireJS e BDD com Jasmine
JavaScript Firme: Módulos com RequireJS e BDD com Jasmine
 
Dicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHP
 
Aula 1 view model livedata e databinding.pptx
Aula 1   view model livedata e databinding.pptxAula 1   view model livedata e databinding.pptx
Aula 1 view model livedata e databinding.pptx
 
POO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdfPOO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdf
 
Drupal e a Qualidade de Software
Drupal e a Qualidade de SoftwareDrupal e a Qualidade de Software
Drupal e a Qualidade de Software
 
De Zero à Web com Python e Django
De Zero à Web com Python e DjangoDe Zero à Web com Python e Django
De Zero à Web com Python e Django
 
Formando Desenvolvedores Efetivos
Formando Desenvolvedores EfetivosFormando Desenvolvedores Efetivos
Formando Desenvolvedores Efetivos
 

Design patterns: resolvendo problemas comuns (ruby)

  • 2. Agenda ● Gang of Four (GoF) ● O que é design pattern ● Tipos de padrões ○ template method ○ strategy ○ observer ○ composite ○ iterator ● Ordem do livro ○ template ○ strategy ○ observer ○ composite ○ iterator ○ command ○ adapter ○ proxy ○ decorator ○ singleton ○ factory ○ builder ○ interpreter
  • 3. Gang of Four (GoF) O que seria Gang of Four?
  • 4. Gang of Four (GoF) talvez...
  • 5. Gang of Four (GoF) nããããão...
  • 6. Gang of Four (GoF) O Gang of Four são os autores do livro "Design Patterns: Elements of Reusable Object- Oriented Software". Este importante livro descreve várias técnicas de desenvolvimento e armadilhas, além de fornecer vinte e três padrões de projeto de programação orientadas a objeto. Os quatro autores foram Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides. — Richard Carr (blackwasp.co.uk)
  • 7. O que é design pattern? (…) Design Pattern, descreve uma solução geral reutilizável para um problema recorrente no desenvolvimento de sistemas de software orientados a objetos. — wikipedia (sic)
  • 8. Gang of Four (GoF) Debate sugerido
  • 9. Gang of Four (GoF) Debate sugerido Separe as coisas que mudam das coisas que são sempre as mesmas
  • 10. Gang of Four (GoF) Debate sugerido Programe para uma interface e não para uma implementação
  • 11. Gang of Four (GoF) Debate sugerido Prefira composição ao no lugar de herança
  • 12. Gang of Four (GoF) Debate sugerido Delegue, delegue, delegue
  • 13. ● ○ factory method ○ prototype ○ ● ○ facade ○ flyweight ○ composite ○ decorator ○ proxy ● ○ chain of responsibility ○ mediator ○ memento ○ state ○ visitor ○ template method ● ○ factory method ○ prototype ○ ● ○ facade ○ flyweight ○ composite ○ decorator ○ proxy ● ○ chain of responsibility ○ mediator ○ memento ○ state ○ visitor ○ template method ● Padrões de Criação ○ factory ○ builder ○ singleton ● Padrões estruturais ○ adapter ○ bridge ○ composite ○ decorator ○ proxy ● Padrões comportamentais ○ command ○ interpreter ○ iterator ○ observer ○ strategy ○ template method Tipos de padrões ● ○ abstract factory ○ builder ○ singleton ● ○ adapter ○ bridge ○ composite ○ decorator ○ proxy ● ○ command ○ interpreter ○ iterator ○ observer ○ strategy ○ template method
  • 14. ● ○ factory method ○ prototype ○ ● ○ facade ○ flyweight ○ composite ○ decorator ○ proxy ● ○ chain of responsibility ○ mediator ○ memento ○ state ○ visitor ○ template method ● ○ factory method ○ prototype ○ ● ○ facade ○ flyweight ○ composite ○ decorator ○ proxy ● ○ chain of responsibility ○ mediator ○ memento ○ state ○ visitor ○ template method ● Padrões de Criação ○ factory ○ builder ○ singleton ● Padrões estruturais ○ adapter ○ bridge ○ composite ○ decorator ○ proxy ● Padrões comportamentais ○ command ○ interpreter ○ iterator ○ observer ○ strategy ○ template method Tipos de padrões ● ○ abstract factory ○ builder ○ singleton ● ○ adapter ○ bridge ○ composite ○ decorator ○ proxy ● ○ command ○ interpreter ○ iterator ○ observer ○ strategy ○ template method ● ○ abstract factory ○ builder ○ singleton ● ○ adapter ○ bridge ○ composite ○ decorator ○ proxy ● ○ command ○ interpreter ○ iterator ○ observer ○ strategy ○ template method o que veremos hoje
  • 15. O problema: O script precisa de uma alteração em uma determinada parte do processo para que seja usada de outra forma dependendo de sua apliação template method
  • 16. Como resolver class Report // define header, output_line and footer as raised def report() header @lines.each do |line| output_line line end footer end end class HTMLReport < Report # implement header, output_line and footer methods end class PlainReport < Report # implement header, output_line and footer methods end
  • 17. strategy O problema: Apesar do template method resolver o problema de forma simples e direta às vezes queremos mudar grande parte do script
  • 18. Como resolver class Consessionaria attr_reader :loja, :carros attr_accessor :testador def initialize(testador) @loja = "Importados Classic" @carros = ["Ferrari", "Lamborghini", "BMW", "Chevrolet"] @testador = testador end def fazer_test_drive @testador.fazer_test_drive(@loja, @carros) end end class Test_Drive def fazer_test_drive(loja, carros) puts "> #{loja}" carros.each do |carro| puts "Testando #{carro}..." end end end
  • 19. observer O problema: Integrar vários objetos a apenas um para que eles executem determinada ação a partir da ação executada pelo primeiro objeto
  • 20. Como resolver class Funcionario def initialize(nome, salario) @nome = nome @salario = salario @observers = [] end def salario=(novo_salario) @salario = novo_salario notify_observers end def notify_observers @observers.each do |observer| observer.update self end end def add_observer(observer) @observers << observer end def remove_observer(observer) @observer.remove(observer) end end
  • 21. composite O problema: Criar uma estrutura em forma de árvore a fim de poder adicionar ou remover tarefas em cascata, desta forma o código se torna mais limpo e de fácil compreensão
  • 22. Como resolver class Tarefa attr_reader :nome def initialize(nome) @nome = nome end def tempo_requerido 0.0 end end class AdicionarIngredientes < tarefa def initialize super "Adicionar ingredientes" end def tempo_requerido 1.0 end end class BaterIngredientes < Tarefa def initialize super "Bater ingredientes" end def tempo_requerido 3.0 end end class CompositeTask < Tarefa def initialize(name) super name @sub_tarefas = [] end def adiciona_sub_tarefa(tarefa) @sub_tarefas << tarefa end def remove_sub_tarefa(tarefa) @sub_tarefas.delete(tarefa) end def tempo_requerido tempo = 0 @sub_tarefas.each do |tarefa| tempo += tarefa.tempo_requerido end tempo end end class BaterBolo < CompositeTask def initialize super "Bater o Bolo" adiciona_sub_tarefa AdicionarIngredientes.new adiciona_sub_tarefa BaterIngredientes.new end end
  • 23. iterator O problema: Criar uma estrutura de objetos similares em forma de coleção a fim de poder acessar todos de uma só vez
  • 24. Como resolver # external class ArrayIterator def initialize(array) @array = array @index = 0 end def has_next? @index < @array.length end def item @array[@index] end def next_item value = @array[@index] @index++ value end end array = ["Michael", "Alice", "Lyssa"] i = ArrayIterator(array) while i.has_next? puts "Pessoa: #{i.next_item}" end # internal def roll_all_elements(array) i = 0 while i < array.length yield array[i] i += 1 end end a = ["Milfont", "Demis", "Enzo"] roll_all_elements(a) {|p| puts "Pessoa: #{p}" }
  • 25. referencias Design Patterns In Ruby — Russ Olsen http://blackwasp.co.uk/GofPatterns.aspx http://sourcemaking.com/design_patterns/ http://pt.wikipedia.org/wiki/Padr%C3% A3o_de_projeto_de_software https://github.com/nslocum/design-patterns-in-ruby