O que você NÃO aprendeu sobre Programação Orientada a Objetos

Danilo Sato
Danilo SatoSoftware Consultant at ThoughtWorks
O que você NÃO
aprendeu sobre
Orientação a
Objetos
Danilo Sato
@dtsato
Danilo Sato
@dtsato - www.dtsato.com
Desenvolvedor, Arquiteto, Coach, DevOps, Treinador
Como
aprendemos OO?
Orientação a Objetos é:
Herança +
Polimorfismo +
Encapsulamento
Orientação a Objetos é:
Modelar o Mundo Real
O que você NÃO aprendeu sobre Programação Orientada a Objetos
“A execução de um programa é considerada um
modelo físico, simulando o comportamento de
uma parte real ou imaginária do mundo."
-- Kristen Nygaard
O que você NÃO aprendeu sobre Programação Orientada a Objetos
“Programação orientada a objetos é uma
péssima ideia, que só poderia ter nascido na
Califórnia."
-- Edsger W. Dijkstra
“Programação orientada a objetos é uma
péssima ideia, que só poderia ter nascido na
Califórnia."
-- Edsger W. Dijkstra
O que você NÃO aprendeu sobre Programação Orientada a Objetos
“Na Ciência da Computação, arrogância é
medida em nano-Dijkstras"
-- Alan Kay
Inventou o termo “Orientação a
Objetos”
Inventou o termo “Orientação a
Objetos”
Smalltalk
Células
Inventou o termo “Orientação a
Objetos”
Inventou o termo “Orientação a
Objetos”
“OO significa passagem de mensagem,
retenção local, proteção e ocultação do estado
de um processo, e associação tardia de tudo"
Inventou o termo “Orientação a
Objetos”
“OO significa passagem de mensagem,
retenção local, proteção e ocultação do estado
de um processo, e associação tardia de tudo"
“A grande ideia é passagem de mensagem"
Inventou o termo “Orientação a
Objetos”
“OO significa passagem de mensagem,
retenção local, proteção e ocultação do estado
de um processo, e associação tardia de tudo"
“A grande ideia é passagem de mensagem"
“OO é um modelo computacional, não um
paradigma de programação"
O que você NÃO aprendeu sobre Programação Orientada a Objetos
O que você NÃO aprendeu sobre Programação Orientada a Objetos
“...(Erlang) é a única linguagem orientada a
objetos e talvez eu tenha sido prematuro em
dizer o que era orientação a objetos"
-- Joe Armstrong
O que você NÃO aprendeu sobre Programação Orientada a Objetos
O que você NÃO aprendeu sobre Programação Orientada a Objetos
O que você NÃO aprendeu sobre Programação Orientada a Objetos
O que você NÃO aprendeu sobre Programação Orientada a Objetos
Orientação a Objetos:
Programa?
Linguagem?
Paradigma?
Modelo Computacional?
Orientação a Objetos:
Programa?
Linguagem?
Paradigma?
Modelo Computacional?
Ninguém Concorda
Esta palestra
é sobre oo
Esta palestra
Não é sobre oo
Esta palestra
é sobre DESIGNDESIGN
O que é ?DESIGN
DESIGN Código==
DESIGN Código==
Estrutura
Organização
Flexibilidade
Testabilidade
Legibilidade
Coesão
Acoplamento
Dependências
BOM reduz o
custo da mudança
DESIGN
DESIGN
Hipótese da
stamina do DESIGN
Funcionalidades
Tempo
Funcionalidades
Tempo
Sem Design
Funcionalidades
Tempo
Bom Design
Sem Design
Funcionalidades
Tempo
Bom Design
Sem Design
Onde o design
se paga
O que você NÃO aprendeu sobre Programação Orientada a Objetos
2004!
Design foi esquecido
Rails
Design foi esquecido
Rails
Model
View
Controller
Helper
Mailer
...
Model
View
Controller
Zero
Design
Design
Ágil
Up-front
Design
DESIGN É BOM
Design “ativo”
DESIGN É BOM
Design “passivo”
DESIGN É BOM
Design ágil == Design evolutivo
DESIGN É BOM
Design ágil == Design evolutivo
O que você NÃO aprendeu sobre Programação Orientada a Objetos
O que você NÃO aprendeu sobre Programação Orientada a Objetos
TUDO É UM
OBJETO!
TUDO É UM
OBJETO?
TUDO É UM
OBJETO?
class?
TUDO É UM
OBJETO?
if?
class?
TUDO É UM
OBJETO?
while?
if?
class?
Smalltalk
WARNING!
O código que você está prestes a ler foi escrito
com o propósito educacional. Não faça isso em
casa ou coloque código parecido em produção.
class TrueClass
def if_true(is_true, otherwise: -> {})
is_true.call
end
def if_false(is_false, otherwise: -> {})
otherwise.call
end
end
class FalseClass
def if_true(is_true, otherwise: -> {})
otherwise.call
end
def if_false(is_false, otherwise: -> {})
is_false.call
end
end
Condições
2.0.0 > (2 > 1).if_true -> {
2.0.0?> puts "sim"
2.0.0?> }, otherwise: -> {
2.0.0?> puts "não"
2.0.0?> }
sim
=> nil
2.0.0 > (1 > 2).if_true -> {
2.0.0?> puts "sim"
2.0.0?> }, otherwise: -> {
2.0.0?> puts "não"
2.0.0?> }
não
=> nil
Condições
class Proc
def while_true(&blk)
self.call.if_true -> {
blk.call
while_true(&blk)
}
end
end
2.0.0?> i = 0
2.0.0?> -> {i < 3}.while_true do
2.0.0?> puts i
2.0.0?> i += 1
2.0.0?> end
0
1
2
=> nil
Loops
Herança
Herança
“É um”
Ave
Pato Pinguim
+ voa()
+ voa() + voa()
class Bird
def fly
puts "flap, flap, flap"
end
end
class Penguin < Bird
def fly
raise "I don't know how to fly"
end
end
flock = [Bird.new, Bird.new, Bird.new]
flock.each { |bird| bird.fly }
# >> flap, flap, flap
# >> flap, flap, flap
# >> flap, flap, flap
class Bird
def fly
puts "flap, flap, flap"
end
end
class Penguin < Bird
def fly
raise "I don't know how to fly"
end
end
flock = [Penguin.new, Penguin.new,
Penguin.new]
flock.each { |bird| bird.fly }
# ~> -:9:in `fly': I don't know how to fly
(RuntimeError)
# ~> from -:14:in `block in <main>'
# ~> from -:14:in `each'
Princípio de Substituição
de Liskov
Se S é um subtipo de T, então os
objetos do tipo T podem ser
substituídos pelos objetos de tipo
S em qualquer lugar do programa
O que você NÃO aprendeu sobre Programação Orientada a Objetos
Isto não é uma ave.Isto não é uma ave.
Herança
“É um”
Herança
“É um”
Herança
Herança
?
Herança
class Book < ActiveRecord::Base
def initialize(attributes = nil, options = {})
super
@my_cache = {}
end
def number_of_pages
@my_cache[:number_of_pages] ||= 10000
end
end
Book.create(
:title => "Lord of the Rings").number_of_pages
# => 10000
Book.find_by(
:title => "Lord of the Rings").number_of_pages
# ~> -:8:in `number_of_pages': undefined method
`[]' for nil:NilClass (NoMethodError)
class Book < ActiveRecord::Base
def after_initialize
@my_cache = {}
end
def number_of_pages
@my_cache[:number_of_pages] ||= 10000
end
end
Book.create(
:title => "Lord of the Rings").number_of_pages
# => 10000
Book.find_by(
:title => "Lord of the Rings").number_of_pages
# => 10000
Herança:
Preciso entender o
que a(s) classe(s)
Pai faz(em)!
class Deck < Array
def initialize
suits = %w(S H C D)
indexes = %w(A 2 3 4 5 6 7 8 9 10 J Q K)
cards = indexes.product(suits)
super(cards)
end
def draw(n)
self.pop(n)
end
end
deck = Deck.new
deck.shuffle!.draw(5) # => [["6", "H"], ["Q",
"H"], ["3", "C"], ["6", "S"], ["K", "C"]]
deck << ["A", "S"] << ["A", "S"]
deck.count { |card| card[0] == "A"} # => 6 aces?
Não use herança
se não usar todo
o comportamento
do(s) pais(s)
Herança é perigoso
Herança é perigoso
Herança é perigoso
Herança é perigoso
Herança é perigoso
Use Herança
quando há
especialização
Prefira
hierarquias
rasas
BigDecimal RationalComplexFloatInteger
Fixnum Bignum
Numeric
Agregação e
composição
Agregação Composição
“Tem um”
Agregação
Agregação
Agregação
composição
composição
composição
class Deck
def initialize
suits = %w(S H C D)
indexes = %w(A 2 3 4 5 6 7 8 9 10 J Q K)
@cards = indexes.product(suits)
end
def count(&blk); @cards.count(&blk) end
def <<(card)
@cards << card unless @cards.include?(card)
self
end
end
deck = Deck.new
deck << ["A", "S"] << ["A", "S"]
deck.count { |card| card[0] == "A"} # => 4
Prefira
composição ao
invés de Herança
Delegação
Delegação
require 'forwardable'
class Deck
extend Forwardable
def_delegator :@cards, :pop, :draw
def_delegators :@cards, :count
def initialize
suits = %w(S H C D)
indexes = %w(A 2 3 4 5 6 7 8 9 10 J Q K)
@cards = indexes.product(suits)
end
def <<(card)
@cards << card unless @cards.include?(card)
self
end
end
deck = Deck.new
deck.draw(5) # => [["Q", "D"], ["K", "S"], ["K",
"H"], ["K", "C"], ["K", "D"]]
polimorfismo
polimorfismo
polimorfismo
O que você NÃO aprendeu sobre Programação Orientada a Objetos
1. Herança
1. Herança
2. Duck Typing
1. Herança
2. Duck Typing
3. Mixins
permite separar
abstração da
concretização
permite separar
“O que” do
“Como”
Princípio “Open-Closed”
Entidades de software como
classes, módulos e funções devem
ser abertas para extensão, mas
fechadas para modificação
-- Bertrand Meyer
MITO: Modelar OO é
modelar o mundo real
O que você NÃO aprendeu sobre Programação Orientada a Objetos
Actor
Ghost Pacman
center, direction
+ collidesWith(Actor)
+ advance(millis)
+ getNextDirection()
Actor
Ghost
Strategy
Pacman
Strategy
MovementStrategy
+ getNextDirection()
Actor
Random
Strategy
UserControl
Strategy
MovementStrategy
+ getNextDirection()
Actor
Random
Strategy
UserControl
Strategy
MovementStrategy
+ getNextDirection()
TargetChasing
Strategy
+ getTarget()
o design evolui
Conforme o
entendimento do
domínio evolui
[ ] Metallica (10)
[ ] Iron Maiden (5)
[ ] AC/DC (15)
[ ] ...
[ ] Black Album (5)
[ ] Master of
Puppets (5)
[ ] Killers (5)
[ ] ...
[x] Rock (50)
[ ] Clássico (100)
[ ] Jazz (80)
Filtros
Artista
Album
Estilo
class Song < ActiveRecord::Base
searchable do
string :title
string :album { album.title }
string :artist { album.artist.name }
...
end
def self.build_with_filters(p={})
search = Sunspot.new_search(Song)
search.build do
title = with(:title, p[:title]) if p[:title].present?
artist = with(:artist, p[:artist]) if p[:artist].present?
album = with(:album, p[:album]) if p[:album].present?
...
facet :artist, exclude: artist
facet :album, exclude: album
end
search
end
end
class Song < ActiveRecord::Base
...
def self.build_with_filters(p={})
search = Sunspot.new_search(Song)
if p[:artist]
to_reject = p[:artist_album].map do |artist_album|
JSON.parse(artist_album)['album']
end
p[:album].reject! do |element|
to_reject.include?(element)
end
p[:album] = [{}] if p[:album].empty?
end
search.build do
...
end
search
end
end
o domínio
não é música
o domínio
é busca
require 'forwadable'
module Search
class SongDocument
extend Forwardable
def_delegators :@song, :title
def initialize(song)
@song = song
end
def album
@song.album.title
end
def artist
@song.artist.name
end
...
end
end
module Search
class SongDocument
def self.search_filters(p={})
[
Search::OptionalFilter.new(:artist, p),
Search::AlbumFilter.new(:artist, :artist_album, p),
Search::OptionalFilter.new(:title, p)
]
end
def self.build_with_filters(filters, p={})
Sunspot.new_search(Song).tap do |search|
filters.each do |filter|
filter.apply_to(search)
end
Search::Faceter.new(filters, p).apply_to(search)
end
end
end
end
Busca
Música
Document
Filter
Facet
Indexer
Song
Album
Artist
Contextos
Delimitados
Busca
Música
Document
Filter
Facet
Indexer
Song
Album
Artist
Mapa de
Contextos
Busca
Música
O que você NÃO aprendeu sobre Programação Orientada a Objetos
“Todos os modelos estão errados,
alguns modelos são úteis"
-- George Box
MITO: Modelar OO é
modelar o mundo real
MITO: Modelar OO é
modelar o mundo real
Resumindo...
OO é passagem
de mensagem
Herança
agregação
Composição
delegação
polimorfismo
DESIGN É BOM
Zero
Design
Design
Ágil
Up-front
Design
Design ágil == Design evolutivo
DESIGN É BOM
Zero
Design
Design
Ágil
Up-front
Design
Design ágil == Design evolutivo
O que você NÃO aprendeu sobre Programação Orientada a Objetos
O que você NÃO aprendeu sobre Programação Orientada a Objetos
Não modele o
mundo real
modele o
seu domínio
aprenda o
seu domínio
evolua o
seu domínio
se divirta!
Obrigado!
Danilo Sato
@dtsato - www.dtsato.com
Desenvolvedor, Arquiteto, Coach, DevOps, Treinador
Referências
• “Practical Object-Oriented Design in Ruby” Sandi Metz
• “Domain-Driven Design: Tackling Complexity in the Heart of
Software” Eric Evans
• “Analysis Patterns: Reusable Object Models” Martin Fowler
• “Patterns of Enterprise Application Architecture” Martin Fowler
• “Design Patterns: Elements of Reusable Object-Oriented
Software” Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
• “Growing Object-Oriented Software, Guided by Tests” Steve
Freeman , Nat Pryce
• “Object-Oriented Software Construction” Bertrand Meyer
Livros:
1 of 147

Recommended

A ferramenta ideal: uma questão de perspectiva. by
A ferramenta ideal: uma questão de perspectiva.A ferramenta ideal: uma questão de perspectiva.
A ferramenta ideal: uma questão de perspectiva.Ricardo Valeriano
324 views166 slides
Javascript para CSharpers 4 - POO by
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOWesley Lemos
677 views38 slides
Minicurso de Lógica e Linguagem Java 6.0 by
Minicurso de Lógica e Linguagem Java 6.0Minicurso de Lógica e Linguagem Java 6.0
Minicurso de Lógica e Linguagem Java 6.0Thiago Dieb
1.8K views56 slides
Domain Driven Design by
Domain Driven DesignDomain Driven Design
Domain Driven DesignSaulo Arruda
833 views29 slides
Programacao Orientada A Objetos (Java) by
Programacao Orientada A Objetos (Java)Programacao Orientada A Objetos (Java)
Programacao Orientada A Objetos (Java)Robson Silva Espig
2.9K views118 slides
Programação orientada a objetos by
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetosCleyton Ferrari
25K views28 slides

More Related Content

Viewers also liked

Apostila algoritmos - Lógica de Programação by
Apostila algoritmos - Lógica de ProgramaçãoApostila algoritmos - Lógica de Programação
Apostila algoritmos - Lógica de ProgramaçãoLucas Mendes
476 views34 slides
FC-Logic by
FC-LogicFC-Logic
FC-Logicguest119e7e
624 views81 slides
Pug pe viii - luciano rodrigues - debugger by
Pug pe viii - luciano rodrigues - debuggerPug pe viii - luciano rodrigues - debugger
Pug pe viii - luciano rodrigues - debuggerpugpe
1.1K views23 slides
Apostila vijeo citect basico by
Apostila vijeo citect basicoApostila vijeo citect basico
Apostila vijeo citect basicoMarcos Paulo Nascimento
3.9K views378 slides
Testes In Browser Em Rails Com Capybara E Webdriver by
Testes In Browser Em Rails Com Capybara E WebdriverTestes In Browser Em Rails Com Capybara E Webdriver
Testes In Browser Em Rails Com Capybara E WebdriverMaurício Linhares
1.6K views23 slides
Geek night-2015 by
Geek night-2015Geek night-2015
Geek night-2015Taise Dias da Silva
286 views19 slides

Viewers also liked(20)

Apostila algoritmos - Lógica de Programação by Lucas Mendes
Apostila algoritmos - Lógica de ProgramaçãoApostila algoritmos - Lógica de Programação
Apostila algoritmos - Lógica de Programação
Lucas Mendes476 views
Pug pe viii - luciano rodrigues - debugger by pugpe
Pug pe viii - luciano rodrigues - debuggerPug pe viii - luciano rodrigues - debugger
Pug pe viii - luciano rodrigues - debugger
pugpe1.1K views
Testes In Browser Em Rails Com Capybara E Webdriver by Maurício Linhares
Testes In Browser Em Rails Com Capybara E WebdriverTestes In Browser Em Rails Com Capybara E Webdriver
Testes In Browser Em Rails Com Capybara E Webdriver
Maurício Linhares1.6K views
Aula 02 POO - Meu Primeiro Código by Aislan Rafael
Aula 02 POO - Meu Primeiro CódigoAula 02 POO - Meu Primeiro Código
Aula 02 POO - Meu Primeiro Código
Aislan Rafael614 views
Revisão Sobre Programação Orientada a Objetos com Java by Mario Jorge Pereira
Revisão Sobre Programação Orientada a Objetos com Java Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java
Mario Jorge Pereira5.3K views
Programação Orientada á Objeto - Paradigmas e Implementação by Evandro Júnior
Programação Orientada á Objeto - Paradigmas e ImplementaçãoProgramação Orientada á Objeto - Paradigmas e Implementação
Programação Orientada á Objeto - Paradigmas e Implementação
Evandro Júnior1.5K views
Introdução a programação Orientada a Objeto by Marconi Rodrigues
Introdução a programação Orientada a ObjetoIntrodução a programação Orientada a Objeto
Introdução a programação Orientada a Objeto
Marconi Rodrigues6.4K views
Apostila Lógica de Programação by Ricardo Terra
Apostila Lógica de ProgramaçãoApostila Lógica de Programação
Apostila Lógica de Programação
Ricardo Terra3.1K views
CURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃO by Microsoft
CURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃOCURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃO
CURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃO
Microsoft14.1K views
Curso Java Basico by Joel Lobo
Curso Java BasicoCurso Java Basico
Curso Java Basico
Joel Lobo18.5K views
Material de Apoio de Algoritmo e Lógica de Programação by rodfernandes
Material de Apoio de Algoritmo e Lógica de ProgramaçãoMaterial de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de Programação
rodfernandes190.2K views

Similar to O que você NÃO aprendeu sobre Programação Orientada a Objetos

De Zero à Web com Python e Django by
De Zero à Web com Python e DjangoDe Zero à Web com Python e Django
De Zero à Web com Python e DjangoOsvaldo Santana Neto
4.7K views32 slides
Qualidade de código - a qualidade que faz a diferença by
Qualidade de código - a qualidade que faz a diferençaQualidade de código - a qualidade que faz a diferença
Qualidade de código - a qualidade que faz a diferençaCaelum
692 views240 slides
Antipatterns Javascript by
Antipatterns JavascriptAntipatterns Javascript
Antipatterns JavascriptAlcides Queiroz
639 views70 slides
Programação Orientada a Testes by
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a TestesGregorio Melo
1.5K views84 slides
"Se tornando um Desenvolvedor Java NINJA" - Semana Integrada da PUC Campinas ... by
"Se tornando um Desenvolvedor Java NINJA" - Semana Integrada da PUC Campinas ..."Se tornando um Desenvolvedor Java NINJA" - Semana Integrada da PUC Campinas ...
"Se tornando um Desenvolvedor Java NINJA" - Semana Integrada da PUC Campinas ...Cesar Augusto Nogueira
354 views79 slides
JavaScript - A Linguagem by
JavaScript - A LinguagemJavaScript - A Linguagem
JavaScript - A LinguagemSérgio Souza Costa
2.8K views117 slides

Similar to O que você NÃO aprendeu sobre Programação Orientada a Objetos(20)

Qualidade de código - a qualidade que faz a diferença by Caelum
Qualidade de código - a qualidade que faz a diferençaQualidade de código - a qualidade que faz a diferença
Qualidade de código - a qualidade que faz a diferença
Caelum692 views
Programação Orientada a Testes by Gregorio Melo
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
Gregorio Melo1.5K views
"Se tornando um Desenvolvedor Java NINJA" - Semana Integrada da PUC Campinas ... by Cesar Augusto Nogueira
"Se tornando um Desenvolvedor Java NINJA" - Semana Integrada da PUC Campinas ..."Se tornando um Desenvolvedor Java NINJA" - Semana Integrada da PUC Campinas ...
"Se tornando um Desenvolvedor Java NINJA" - Semana Integrada da PUC Campinas ...
Domain Driven Design (DDD) - DevIsland, BH by Giovanni Bassi
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
Giovanni Bassi1.4K views
Introdução à Programação em Python by Rodrigo Hübner
Introdução à Programação em PythonIntrodução à Programação em Python
Introdução à Programação em Python
Rodrigo Hübner1.8K views
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O... by Ricardo Valeriano
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
Ricardo Valeriano676 views
Turbinando o desenvolvimento Android com Kotlin by Nelson Glauber Leal
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
Nelson Glauber Leal1.6K views
Desenvolvimento Agil Com Doctrine Orm by Guilherme Blanco
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
Guilherme Blanco10.7K views
Objetos Pythonicos - compacto by Luciano Ramalho
Objetos Pythonicos - compactoObjetos Pythonicos - compacto
Objetos Pythonicos - compacto
Luciano Ramalho2.6K views
Drupal 7 Direto das Trincheiras by Rafael Caceres
Drupal 7  Direto das TrincheirasDrupal 7  Direto das Trincheiras
Drupal 7 Direto das Trincheiras
Rafael Caceres374 views
Evolução e futuro do uso de paradigmas no JavaScript by Jean Carlo Emer
Evolução e futuro do uso de paradigmas no JavaScriptEvolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScript
Jean Carlo Emer2.9K views
Por que você deveria aprender python? by Felipe Volpone
Por que você deveria aprender python?Por que você deveria aprender python?
Por que você deveria aprender python?
Felipe Volpone545 views
Não tem teste ? Já nasceu legado. by GTS-CE
Não tem teste ? Já nasceu legado.Não tem teste ? Já nasceu legado.
Não tem teste ? Já nasceu legado.
GTS-CE398 views

More from Danilo Sato

Padrões de deploy para devops e entrega contínua - DevDay 2014 by
Padrões de deploy para devops e entrega contínua - DevDay 2014Padrões de deploy para devops e entrega contínua - DevDay 2014
Padrões de deploy para devops e entrega contínua - DevDay 2014Danilo Sato
2.5K views89 slides
Keynote RuPy Natal 2014 by
Keynote RuPy Natal 2014Keynote RuPy Natal 2014
Keynote RuPy Natal 2014Danilo Sato
1.4K views97 slides
Padrões de deploy para DevOps e Entrega Contínua by
Padrões de deploy para DevOps e Entrega ContínuaPadrões de deploy para DevOps e Entrega Contínua
Padrões de deploy para DevOps e Entrega ContínuaDanilo Sato
1K views87 slides
Padrões de deploy para DevOps e Entrega Contínua by
Padrões de deploy para DevOps e Entrega ContínuaPadrões de deploy para DevOps e Entrega Contínua
Padrões de deploy para DevOps e Entrega ContínuaDanilo Sato
1.8K views64 slides
Refactoring Strategies: Beyond the Basics by
Refactoring Strategies: Beyond the BasicsRefactoring Strategies: Beyond the Basics
Refactoring Strategies: Beyond the BasicsDanilo Sato
2.1K views40 slides
Revisitando as Práticas de Engenharia Ágil by
Revisitando as Práticas de Engenharia ÁgilRevisitando as Práticas de Engenharia Ágil
Revisitando as Práticas de Engenharia ÁgilDanilo Sato
1.7K views188 slides

More from Danilo Sato(14)

Padrões de deploy para devops e entrega contínua - DevDay 2014 by Danilo Sato
Padrões de deploy para devops e entrega contínua - DevDay 2014Padrões de deploy para devops e entrega contínua - DevDay 2014
Padrões de deploy para devops e entrega contínua - DevDay 2014
Danilo Sato2.5K views
Keynote RuPy Natal 2014 by Danilo Sato
Keynote RuPy Natal 2014Keynote RuPy Natal 2014
Keynote RuPy Natal 2014
Danilo Sato1.4K views
Padrões de deploy para DevOps e Entrega Contínua by Danilo Sato
Padrões de deploy para DevOps e Entrega ContínuaPadrões de deploy para DevOps e Entrega Contínua
Padrões de deploy para DevOps e Entrega Contínua
Danilo Sato1K views
Padrões de deploy para DevOps e Entrega Contínua by Danilo Sato
Padrões de deploy para DevOps e Entrega ContínuaPadrões de deploy para DevOps e Entrega Contínua
Padrões de deploy para DevOps e Entrega Contínua
Danilo Sato1.8K views
Refactoring Strategies: Beyond the Basics by Danilo Sato
Refactoring Strategies: Beyond the BasicsRefactoring Strategies: Beyond the Basics
Refactoring Strategies: Beyond the Basics
Danilo Sato2.1K views
Revisitando as Práticas de Engenharia Ágil by Danilo Sato
Revisitando as Práticas de Engenharia ÁgilRevisitando as Práticas de Engenharia Ágil
Revisitando as Práticas de Engenharia Ágil
Danilo Sato1.7K views
Princípios e Práticas para lidar com requisitos não-funcionais em desenvolvim... by Danilo Sato
Princípios e Práticas para lidar com requisitos não-funcionais em desenvolvim...Princípios e Práticas para lidar com requisitos não-funcionais em desenvolvim...
Princípios e Práticas para lidar com requisitos não-funcionais em desenvolvim...
Danilo Sato6.1K views
Estratégias de Refatoração: além do be-a-bá by Danilo Sato
Estratégias de Refatoração: além do be-a-báEstratégias de Refatoração: além do be-a-bá
Estratégias de Refatoração: além do be-a-bá
Danilo Sato1.1K views
Coding Dojo Introduction by Danilo Sato
Coding Dojo IntroductionCoding Dojo Introduction
Coding Dojo Introduction
Danilo Sato3.2K views
Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c... by Danilo Sato
Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...
Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...
Danilo Sato610 views
Refactoring at Large by Danilo Sato
Refactoring at LargeRefactoring at Large
Refactoring at Large
Danilo Sato8.1K views
Refatoração em Larga Escala by Danilo Sato
Refatoração em Larga EscalaRefatoração em Larga Escala
Refatoração em Larga Escala
Danilo Sato2.1K views
Managing your technical debt - AgileBrazil 2011 by Danilo Sato
Managing your technical debt - AgileBrazil 2011Managing your technical debt - AgileBrazil 2011
Managing your technical debt - AgileBrazil 2011
Danilo Sato1.3K views

O que você NÃO aprendeu sobre Programação Orientada a Objetos