(Re)pensando a OOP - PHPDay Curitiba 2013

Preview:

DESCRIPTION

Nesta palestra temos o objetivo de rever os conceitos e origens da programação orientada a objetos

Citation preview

(Re)Pensando a Orientação a Objetos

Luís Otávio Cobucci Oblonczyk - @lcobucci

Luís Otávio Cobucci Oblonczyk@lcobucci

http://about.me/lcobucci

Evangelista PHPDesenvolvedor desde 2003

Porque repensar?

“ Trabalhar com orientação a objetos éfácil, só fazer tudo com classes! “

“ Orientação a objetos é a evoluçãoda programação procedural “

Definições

“Orientação a objetos é um paradigmade análise, projeto e programação de

sistemas de software baseado na composição e interação entre diversas

unidades de software chamadas deobjetos. “

http://pt.wikipedia.org/wiki/Orientação_a_objetos

Um paradigma é um modelo mentalque orienta a forma que será

estruturada uma solução

Um paradigma é um modelo mentalque orienta a forma que será

estruturada uma solução

Procedural

Um paradigma é um modelo mentalque orienta a forma que será

estruturada uma solução

Procedural

Funcional

Um paradigma é um modelo mentalque orienta a forma que será

estruturada uma solução

Procedural Orientado a aspectos

Funcional

Um paradigma é um modelo mentalque orienta a forma que será

estruturada uma solução

Procedural

FuncionalOrientado a objetos

Orientado a aspectos

A OOP busca tornar o mundo doscomputadores mais próximo da

realidade

Bora viajar

Um pouco de história...

Os termos objetos e instânciasforam utilizados por volta

das décadas de 50~60

O conceito formal foi introduzido(nos anos 60) na linguagem

de programação Simula 67

Na década de 70 foi lançadaa linguagem Smalltalk,

que até hoje é referência

Vantagens e desvantagens

Vantagens

Vantagens

Reutilização

Vantagens

Reutilização

Extensibilidade

Vantagens

Reutilização

Extensibilidade

Testabilidade

Vantagens

Reutilização

Extensibilidade

Testabilidade

Proximidade do negócio

Desvantagens

Desvantagens

Aprendizado

Desvantagens

Aprendizado

Utilização de recursos

Conceitos básicos

Objeto é a representaçãocomputacional de algo existente

Objeto é a representaçãocomputacional de algo existente

Características

Objeto é a representaçãocomputacional de algo existente

Características Comportamentos

Objeto é a representaçãocomputacional de algo existente

Características Comportamentos

Estado

Classe é a descrição do objetoseguindo as regras de sintaxe

das linguagens

Classe é a descrição do objetoseguindo as regras de sintaxe

das linguagens

Tipo

namespace Lcobucci\Examples;

class Person{ private $name;

public function talk($message) { echo $message; }}

Instância é a concretizaçãode um objeto (referência

à memória)

Instância é a concretizaçãode um objeto (referência

à memória)

$luis = new Person();

A visibilidade define a acessibilidadedos atributos e métodos

A visibilidade define a acessibilidadedos atributos e métodos

Public

A visibilidade define a acessibilidadedos atributos e métodos

Public Protected

A visibilidade define a acessibilidadedos atributos e métodos

Public PrivateProtected

A visibilidade define a acessibilidadedos atributos e métodos

Public PrivateProtected

Visibilidade != encapsulamento

Encapsulamento é a técnicade proteger métodos e atributos

Encapsulamento utiliza osmodificadores de visibilidade

Herança é o aproveitamentode métodos e atributos entre tipos

do mesmo contexto

Herança é o aproveitamentode métodos e atributos entre tipos

do mesmo contexto

Definição de sub-tipos

namespace Lcobucci\Examples;

class Person{ private $name;

public function talk($message) { echo $message; }}

namespace Lcobucci\Examples;

class Programmer extends Person {}

A herança permite a alteração decomportamentos

namespace Lcobucci\Examples;

class Programmer extends Person { public function talk($message) { parent::talk(md5($message)); }}

Abstração é a capacidadede definir comportamentos sem

sua implementação

Abstração é a capacidadede definir comportamentos sem

sua implementação

Classe abstrata

Abstração é a capacidadede definir comportamentos sem

sua implementação

Método abstratoClasse abstrata

Abstração é a capacidadede definir comportamentos sem

sua implementação

Método abstratoClasse abstrata Interface

Classes abstratas nunca podemser instanciadas diretamente,é necessário uma classe filha

Métodos abstratos devem serobrigatoriamente implementadospelas classes filhas (a não ser que

elas também sejam abstratas)

namespace Lcobucci\Examples;

abstract class Person{ private $name;

abstract public function talk($message);}

namespace Lcobucci\Examples;

class CommonPerson extends Person{ public function talk($message) { echo $message; }}

namespace Lcobucci\Examples;

class Programmer extends Person{ public function talk($message) { echo sha1($message); }}

Interfaces são estruturas que definem quais comportamentos os

objetos terão que implementar

Interfaces são estruturas que definem quais comportamentos os

objetos terão que implementar

Sempre públicos

namespace Lcobucci\Examples;

interface PaymentMethod{ public function pay($value);}

namespace Lcobucci\Examples;

class CreditCard implements PaymentMethod{ public function pay($value) { // paga usando cartão de crédito }}

namespace Lcobucci\Examples;

class Money implements PaymentMethod{ public function pay($value) { // paga usando dinheiro }}

Polimorfismo é a possibilidade deum método ter comportamentos

diferentes

Possibilitado através da abstração

namespace Lcobucci\Examples;

class Item{ private $price;

public function sell($quantity, PaymentMethod $paymentMethod) { $paymentMethod->pay( $this->price * $quantity ); }}

namespace Lcobucci\Examples;

class Item{ private $price;

public function sell($quantity, PaymentMethod $paymentMethod) { $paymentMethod->pay( $this->price * $quantity ); }}

Construtores são responsáveispor definir as regras de criação

de um objeto

Destrutores são responsáveispor definir as regras de destruição

de um objeto

namespace Lcobucci\Examples;

class PersonList{ private $list;

public function __construct() { $this->list = array(); } }

$list = new PersonList();

namespace Lcobucci\Examples;

class PersonList{ private $list;

public function __destruct() { $this->list = null; } }

$list = new PersonList();$list = null;

Erros comuns

namespace Lcobucci\Examples;

class Pessoa{ private $name;}

Mistura de idiomas

namespace Lcobucci\Examples;

class Pessoa{ private $nome;}

Devs felizes : )

namespace Lcobucci\Examples;

class Passaro{ public function voa() { }}

class Aviao extends Passaro{}

Avião voa, mas não é um pássaro...

O que posso estudar no futuro?

Orientação a objetos

Orientação a objetos

Gerenciamento de exceptions

Orientação a objetos

Single responsability

Gerenciamento de exceptions

Orientação a objetos

Gerenciamento de exceptions

Single responsability

Open/closed

Orientação a objetos

Gerenciamento de exceptions

Liskov substitution

Single responsability

Open/closed

Orientação a objetos

Gerenciamento de exceptions

Liskov substitution

Single responsability

Open/closed

Interface segragation

Orientação a objetos

Gerenciamento de exceptions

Liskov substitution

Single responsability

Open/closed

Interface segragation

Dependency inversion

Orientação a objetos

Gerenciamento de exceptions

Liskov substitution

Single responsability

Open/closed

Interface segragation

Dependency inversion

Design Patterns

Orientação a objetos

Gerenciamento de exceptions

Liskov substitution

Single responsability

Open/closed

Interface segragation

Dependency inversion

Design Patterns

Domain driven design

Luís Otávio Cobucci Oblonczyk

@lcobucci

http://about.me/lcobucci

Obrigado!

http://slideshare.net/lcobucci

Recommended