(Re)Pensando a
     Orientação a Objetos
      Luís Otávio Cobucci Oblonczyk




25 de Agosto de 2012
Luís Otávio Cobucci Oblonczyk
●
    Evangelista (doido por) PHP
●
    Desenvolvedor na Softnex Tecnologia (SC)
●
    Membro do PHPSC
●
    ZCE PHP 5.3
●
    Perfeccionista ao extremo =P


    @lcobucci
    http://about.me/lcobucci
Orientação a Objetos muda nossa vida?
O que é OOP?
“Orientação a objetos é um paradigma de
análise, projeto e programação de sistemas de
software baseado na composição e interação
entre diversas unidades de software chamadas de
objetos.”

http://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objetos
O que é OOP?
●
    Paradigma = Padrão a ser seguido; Pressuposto
    filosófico
●
    Busca tornar o mundo das linguagens que os
    computadores entendem mais próximo da
    realidade
A mudança principal é como pensamos!
Pequeno exercício mental...
História da OOP
●
    Os termos “objetos” e “instâncias” foram
    utilizados por volta da década de 60
●
    O conceito formal foi introduzido (também nos
    anos 60) na linguagem de programação Simula
    67
●
    Na década de 70 foi lançada, na Xerox PARC, a
    linguagem Smalltalk, que teve influências de
    conceitos da Simula 67
Linguagens e OOP
●
    Funcionalidades OOP adicionadas como
    extensão

●
    Principalmente OOP

●
    Puramente OOP
Porque repensar a OOP?
Porque repensar a OOP?



Não, eu não sou pago por
colocar tirinhas do vida de
programador nas minhas
palestas.

Bem que podia né? =P
Pontos negativos da OOP
●
    Aprendizado mais complexo (deve-se aprender
    o conceito e a sintaxe para cada linguagem)
●
    Maior utilização de recursos do servidor
    (quando comparado à outros paradigmas que o
    PHP suporta)
Pontos positivos da OOP
●
    Reutilização de código
●
    Extensibilidade
●
    Código facilmente testável (depende do
    desenvolvedor, claro =P)
●
    Desenvolvimento mais próximo do negócio
Conceitos básicos da OOP
Objeto
●
    Representação computacional de algo concreto
    e existente no mundo real
●
    Possui   características    (atributos)    e
    comportamentos (métodos)
Ciclo de vida de um objeto
Classe
●
    Descrição detalhada de um objeto e suas
    relações
●
    Segue as regras sintáticas da linguagem de
    programação para definir os atributos e
    comportamentos
<?php
namespace LcobucciExamples;

class Person
{
    private $name;

    public function talk($message)
    {
        echo $message;
    }
}
Instância
●
    Concretização da existência de um objeto;
    criação do objeto, seguindo as regras definidas
    na classe (previamente construída)
<?php
namespace LcobucciExamples;

class Person
{
    private $name;

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

$luis = new Person();
Visibilidade
●
    Existem coisas que nem todos precisam
    saber/ver...
●
    Define a acessibilidade dos dados (métodos,
    atributos) do objeto
●
    Tipos:
    ●
        public
    ●
        protected
    ●
        private
Herança
●
    Aproveitamento de métodos e atributos entre
    objetos de um mesmo contexto
<?php
namespace LcobucciExamples;

class Person
{
    private $name;

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

class Programmer extends Person
{
}
Herança
●
    Permite a alteração do comportamento dos
    métodos, caso necessário
<?php
namespace LcobucciExamples;
class Person
{
    private $name;
    public function talk($message)
    {
        echo $message;
    }
}

class Programmer extends Person
{
    public function talk($message)
    {
        parent::talk(md5($message));
    }
}
Abstração
●
    Definição “parcial” dos comportamentos dos
    objetos
●
    É definido que o comportamento existe, mas
    não é implementado, ou seja não tem
    necessidade da classe pai saber como o objeto
    age naquela ação
Abstração
●
    Podem ser definidas classes      abstratas,
    métodos abstratos e interfaces
●
    Classes abstratas não PODEM nunca ser
    instanciadas diretamente, é necessária uma
    classe filha
●
    Métodos abstratos são aqueles que devem ser
    implementados nas classes filhas
<?php
namespace LcobucciExamples;
abstract class Person
{
    private $name;
    public abstract function talk($message);
}

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

class Programmer extends Person
{
    public function talk($message)
    {
        echo md5($message);
    }
}
Abstração
●
    Interfaces são estruturas que possuem apenas
    a definição dos comportamentos dos objetos
●
    Todos os comportamentos definidos em uma
    interface são SEMPRE acessíveis publicamente
●
    São utilizadas quando o contexto dos objetos
    são     diferentes,  porém     compartilham
    comportamentos
<?php
namespace LcobucciExamples;
interface Flyer
{
    public function fly();
}

class Bird implements Flyer
{
    public function fly()
    {
    }
}

class Airplane implements Flyer
{
    public function fly()
    {
    }
}
Polimorfismo
●
    A palavra polimorfismo tem origem grega,
    significa “muitas formas”
●
    Dentro da OOP, é a capacidade de um método
    agir de formas diferentes
●
    É possibilitado pela existência da abstração
    (herança ou implementação de interface), onde
    as classes implementam um mesmo método
    abstrato de formas diferentes
<?php
namespace LcobucciExamples;
interface PaymentMethod
{
    public function pay($ammount);
}

class CreditCard implements PaymentMethod
{
    public function pay($ammount)
    {
    }
}

class Money implements PaymentMethod
{
    public function pay($ammount)
    {
    }
}
<?php
namespace LcobucciExamples;

class Item
{
    private $price;

    public function sell(
        $quantity,
        PaymentMethod $paymentMethod
    ) {
        $paymentMethod->pay(
            $this->price * $quantity
        );
    }
}
Construtor e Destrutor
●
    Métodos que inicializam e destroem o estado
    do objeto
<?php
namespace LcobucciExamples;

class PersonList
{
    private $list;

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

    public function __destruct()
    {
        $this->list = null;
    }
}
Design Patterns
Design patterns são soluções para necessidades
específicas e devem ser utilizados quando
necessário. Exemplos:

●
  Adapter              ●
                         Strategy
●
  Façade               ●
                         Decorator
●
  Factory              ●
                         Singleton
●
  Proxy
Design Patterns
Design patterns são soluções para necessidades
específicas e devem ser utilizados quando
necessário. Exemplos:

●
  Adapter              ●
                         Strategy
●
  Façade               ●
                         Decorator
●
  Factory              ●
                         Singleton (você não vai precisar)
●
  Proxy
Prepare-se, cenas fortes!
Prepare-se, cenas fortes!




                            Problemas comuns...
Idioma do código
●
    Mistura de idiomas dentro do código fonte
●
    Tradução dos nomes de forma equivocada
    (esquece-se que, principalmente, os métodos
    são ordens)
<?php
namespace LcobucciExamples;

class Pessoa
{
    private $name;
}
<?php
namespace LcobucciExamples;

$luis = new Pessoa();
$rex = new Cachorro();
$graveto = new Galho();

$luis->jogar($graveto);
$rex->pegar($graveto);




             Isso não soa estranho??
Herança sem sentido
●
    Herança não é apenas compartilhamento de
    comportamentos!
●
    O contexto das classes filhas não podem ser
    diferentes da classe pai
<?php
namespace LcobucciExamples;

class Passaro
{
    public function voa()
    {
    }
}

class Aviao extends Passaro
{
}
             Avião também voa, mas não
                   é um pássaro!!!
Causa raiz
●
    O maior problema do desenvolvimento por si
    só é a falta de planejamento, na orientação a
    objetos essa falta pode causar problemas muito
    sérios, tornando a manutenção do software
    extramente exaustiva e trabalhosa.
Implementação e comparação...
Transferência entre contas
bancárias
●
    O saldo da conta da Sílvia possui R$ 200,00
●
    O saldo da conta da Maria possui R$ 30,00
●
    Maria está com dificuldades financeiras, e pede
    à Sílvia um empréstimo de R$ 100,00
<?php
$saldoContaSilvia = 200;
$saldoContaMaria = 30;

$saldoContaSilvia -= 100;
$saldoContaMaria += 100;
<?php
namespace LcobucciExamples;

class ContaBancaria
{
    public $saldo;

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

    public function transfere(
        ContaBancaria $destino,
        $valor
    ) {
        $this->saldo -= $valor;
        $destino->saldo += $valor;
    }
}
<?php
namespace LcobucciExamples;

$contaSilvia = new ContaBancaria(200);
$contaMaria = new ContaBancaria(30);

$contaSilvia->transfere($contaMaria, 100);
Mais informações? Onde??
●
    Head first Object-Oriented Analysis & Desing
    http://www.headfirstlabs.com/books/hfooad/
●
    Programando com Orientação a Objetos
    http://www.adianti.com.br/phpoo
●
    Domain Driven Design
    http://domaindrivendesign.org/books/evans_2003
●
    Clean Code: A Handbook of Agile Software
    Craftsmanship
    http://goo.gl/Qyhmq
Obrigado!

Eu por aí: http://about.me/lcobucci
Slides: http://slideshare.net/lcobucci

(Re)pensando a OOP - TDC 2012

  • 1.
    (Re)Pensando a Orientação a Objetos Luís Otávio Cobucci Oblonczyk 25 de Agosto de 2012
  • 2.
    Luís Otávio CobucciOblonczyk ● Evangelista (doido por) PHP ● Desenvolvedor na Softnex Tecnologia (SC) ● Membro do PHPSC ● ZCE PHP 5.3 ● Perfeccionista ao extremo =P @lcobucci http://about.me/lcobucci
  • 3.
    Orientação a Objetosmuda nossa vida?
  • 4.
    O que éOOP? “Orientação a objetos é um paradigma de análise, projeto e programação de sistemas de software baseado na composição e interação entre diversas unidades de software chamadas de objetos.” http://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objetos
  • 5.
    O que éOOP? ● Paradigma = Padrão a ser seguido; Pressuposto filosófico ● Busca tornar o mundo das linguagens que os computadores entendem mais próximo da realidade
  • 6.
    A mudança principalé como pensamos!
  • 7.
  • 8.
    História da OOP ● Os termos “objetos” e “instâncias” foram utilizados por volta da década de 60 ● O conceito formal foi introduzido (também nos anos 60) na linguagem de programação Simula 67 ● Na década de 70 foi lançada, na Xerox PARC, a linguagem Smalltalk, que teve influências de conceitos da Simula 67
  • 9.
    Linguagens e OOP ● Funcionalidades OOP adicionadas como extensão ● Principalmente OOP ● Puramente OOP
  • 10.
  • 11.
    Porque repensar aOOP? Não, eu não sou pago por colocar tirinhas do vida de programador nas minhas palestas. Bem que podia né? =P
  • 12.
    Pontos negativos daOOP ● Aprendizado mais complexo (deve-se aprender o conceito e a sintaxe para cada linguagem) ● Maior utilização de recursos do servidor (quando comparado à outros paradigmas que o PHP suporta)
  • 13.
    Pontos positivos daOOP ● Reutilização de código ● Extensibilidade ● Código facilmente testável (depende do desenvolvedor, claro =P) ● Desenvolvimento mais próximo do negócio
  • 14.
  • 15.
    Objeto ● Representação computacional de algo concreto e existente no mundo real ● Possui características (atributos) e comportamentos (métodos)
  • 16.
    Ciclo de vidade um objeto
  • 17.
    Classe ● Descrição detalhada de um objeto e suas relações ● Segue as regras sintáticas da linguagem de programação para definir os atributos e comportamentos
  • 18.
    <?php namespace LcobucciExamples; class Person { private $name; public function talk($message) { echo $message; } }
  • 19.
    Instância ● Concretização da existência de um objeto; criação do objeto, seguindo as regras definidas na classe (previamente construída)
  • 20.
    <?php namespace LcobucciExamples; class Person { private $name; public function talk($message) { echo $message; } } $luis = new Person();
  • 21.
    Visibilidade ● Existem coisas que nem todos precisam saber/ver... ● Define a acessibilidade dos dados (métodos, atributos) do objeto ● Tipos: ● public ● protected ● private
  • 22.
    Herança ● Aproveitamento de métodos e atributos entre objetos de um mesmo contexto
  • 23.
    <?php namespace LcobucciExamples; class Person { private $name; public function talk($message) { echo $message; } } class Programmer extends Person { }
  • 24.
    Herança ● Permite a alteração do comportamento dos métodos, caso necessário
  • 25.
    <?php namespace LcobucciExamples; class Person { private $name; public function talk($message) { echo $message; } } class Programmer extends Person { public function talk($message) { parent::talk(md5($message)); } }
  • 26.
    Abstração ● Definição “parcial” dos comportamentos dos objetos ● É definido que o comportamento existe, mas não é implementado, ou seja não tem necessidade da classe pai saber como o objeto age naquela ação
  • 27.
    Abstração ● Podem ser definidas classes abstratas, métodos abstratos e interfaces ● Classes abstratas não PODEM nunca ser instanciadas diretamente, é necessária uma classe filha ● Métodos abstratos são aqueles que devem ser implementados nas classes filhas
  • 28.
    <?php namespace LcobucciExamples; abstract classPerson { private $name; public abstract function talk($message); } class Professor extends Person { public function talk($message) { echo $message; } } class Programmer extends Person { public function talk($message) { echo md5($message); } }
  • 29.
    Abstração ● Interfaces são estruturas que possuem apenas a definição dos comportamentos dos objetos ● Todos os comportamentos definidos em uma interface são SEMPRE acessíveis publicamente ● São utilizadas quando o contexto dos objetos são diferentes, porém compartilham comportamentos
  • 30.
    <?php namespace LcobucciExamples; interface Flyer { public function fly(); } class Bird implements Flyer { public function fly() { } } class Airplane implements Flyer { public function fly() { } }
  • 31.
    Polimorfismo ● A palavra polimorfismo tem origem grega, significa “muitas formas” ● Dentro da OOP, é a capacidade de um método agir de formas diferentes ● É possibilitado pela existência da abstração (herança ou implementação de interface), onde as classes implementam um mesmo método abstrato de formas diferentes
  • 32.
    <?php namespace LcobucciExamples; interface PaymentMethod { public function pay($ammount); } class CreditCard implements PaymentMethod { public function pay($ammount) { } } class Money implements PaymentMethod { public function pay($ammount) { } }
  • 33.
    <?php namespace LcobucciExamples; class Item { private $price; public function sell( $quantity, PaymentMethod $paymentMethod ) { $paymentMethod->pay( $this->price * $quantity ); } }
  • 34.
    Construtor e Destrutor ● Métodos que inicializam e destroem o estado do objeto
  • 35.
    <?php namespace LcobucciExamples; class PersonList { private $list; public function __construct() { $this->list = array(); } public function __destruct() { $this->list = null; } }
  • 36.
    Design Patterns Design patternssão soluções para necessidades específicas e devem ser utilizados quando necessário. Exemplos: ● Adapter ● Strategy ● Façade ● Decorator ● Factory ● Singleton ● Proxy
  • 37.
    Design Patterns Design patternssão soluções para necessidades específicas e devem ser utilizados quando necessário. Exemplos: ● Adapter ● Strategy ● Façade ● Decorator ● Factory ● Singleton (você não vai precisar) ● Proxy
  • 38.
  • 39.
    Prepare-se, cenas fortes! Problemas comuns...
  • 40.
    Idioma do código ● Mistura de idiomas dentro do código fonte ● Tradução dos nomes de forma equivocada (esquece-se que, principalmente, os métodos são ordens)
  • 41.
  • 42.
    <?php namespace LcobucciExamples; $luis =new Pessoa(); $rex = new Cachorro(); $graveto = new Galho(); $luis->jogar($graveto); $rex->pegar($graveto); Isso não soa estranho??
  • 43.
    Herança sem sentido ● Herança não é apenas compartilhamento de comportamentos! ● O contexto das classes filhas não podem ser diferentes da classe pai
  • 44.
    <?php namespace LcobucciExamples; class Passaro { public function voa() { } } class Aviao extends Passaro { } Avião também voa, mas não é um pássaro!!!
  • 45.
    Causa raiz ● O maior problema do desenvolvimento por si só é a falta de planejamento, na orientação a objetos essa falta pode causar problemas muito sérios, tornando a manutenção do software extramente exaustiva e trabalhosa.
  • 46.
  • 47.
    Transferência entre contas bancárias ● O saldo da conta da Sílvia possui R$ 200,00 ● O saldo da conta da Maria possui R$ 30,00 ● Maria está com dificuldades financeiras, e pede à Sílvia um empréstimo de R$ 100,00
  • 48.
    <?php $saldoContaSilvia = 200; $saldoContaMaria= 30; $saldoContaSilvia -= 100; $saldoContaMaria += 100;
  • 49.
    <?php namespace LcobucciExamples; class ContaBancaria { public $saldo; public function __construct($saldo) { $this->saldo = $saldo; } public function transfere( ContaBancaria $destino, $valor ) { $this->saldo -= $valor; $destino->saldo += $valor; } }
  • 50.
    <?php namespace LcobucciExamples; $contaSilvia =new ContaBancaria(200); $contaMaria = new ContaBancaria(30); $contaSilvia->transfere($contaMaria, 100);
  • 51.
    Mais informações? Onde?? ● Head first Object-Oriented Analysis & Desing http://www.headfirstlabs.com/books/hfooad/ ● Programando com Orientação a Objetos http://www.adianti.com.br/phpoo ● Domain Driven Design http://domaindrivendesign.org/books/evans_2003 ● Clean Code: A Handbook of Agile Software Craftsmanship http://goo.gl/Qyhmq
  • 52.
    Obrigado! Eu por aí:http://about.me/lcobucci Slides: http://slideshare.net/lcobucci