Upload
luis-cobucci
View
641
Download
0
Embed Size (px)
DESCRIPTION
O objetivo principal desta palestra é rever os conceitos básicos da Orientação à Objetos, buscando remover aquilo que foi deturpado com o tempo.
Citation preview
(Re)Pensando aOrientação a Objetos
(Re)Pensando aOrientação a Objetos
Luís Otávio Cobucci Oblonczyk
25 de Agosto de 2012
Luís Otávio Cobucci OblonczykLuí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?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?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 OOPHistó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 OOPLinguagens e OOP
● Funcionalidades OOP adicionadas como extensão
● Principalmente OOP
● Puramente OOP
Porque repensar a OOP?Porque repensar a OOP?
Porque repensar a OOP?Porque repensar a OOP?
Não, eu não sou pago porcolocar tirinhas do vida deprogramador nas minhaspalestas.
Bem que podia né? =P
Pontos negativos da OOPPontos 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 OOPPontos 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
ObjetoObjeto
● Representação computacional de algo concreto e existente no mundo real
● Possui características (atributos) e comportamentos (métodos)
Ciclo de vida de um objetoCiclo de vida de um objeto
ClasseClasse
● 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
<?phpnamespace Lcobucci\Examples;
class Person
{ private $name;
public function talk($message) { echo $message; } }
InstânciaInstância
● Concretização da existência de um objeto; criação do objeto, seguindo as regras definidas na classe (previamente construída)
<?phpnamespace Lcobucci\Examples;
class Person
{ private $name;
public function talk($message) { echo $message; } }
$luis = new Person();
VisibilidadeVisibilidade
● Existem coisas que nem todos precisam saber/ver...
● Define a acessibilidade dos dados (métodos, atributos) do objeto
● Tipos:● public● protected● private
HerançaHerança
● Aproveitamento de métodos e atributos entre objetos de um mesmo contexto
<?phpnamespace Lcobucci\Examples;
class Person
{ private $name;
public function talk($message) { echo $message; } }
class Programmer extends Person
{}
HerançaHerança
● Permite a alteração do comportamento dos métodos, caso necessário
<?phpnamespace Lcobucci\Examples;
class Person
{ private $name;
public function talk($message) { echo $message; } }
class Programmer extends Person
{ public function talk($message) { parent::talk(md5($message)); }}
AbstraçãoAbstraçã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çãoAbstraçã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
<?phpnamespace Lcobucci\Examples;
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çãoAbstraçã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
<?phpnamespace Lcobucci\Examples;
interface Flyer
{ public function fly();}
class Bird implements Flyer
{ public function fly() { }}
class Airplane implements Flyer
{ public function fly() { }}
PolimorfismoPolimorfismo
● 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
<?phpnamespace Lcobucci\Examples;
interface PaymentMethod
{ public function pay($ammount);}
class CreditCard implements PaymentMethod
{ public function pay($ammount) { }}
class Money implements PaymentMethod
{ public function pay($ammount) { }}
<?phpnamespace Lcobucci\Examples;
class Item
{ private $price;
public function sell( $quantity, PaymentMethod $paymentMethod ) { $paymentMethod->pay( $this->price * $quantity ); } }
Construtor e DestrutorConstrutor e Destrutor
● Métodos que inicializam e destroem o estado do objeto
<?phpnamespace Lcobucci\Examples;
class PersonList
{ private $list;
public function __construct() { $this->list = array(); }
public function __destruct() { $this->list = null; } }
Design PatternsDesign Patterns
Design patterns são soluções para necessidades específicas e devem ser utilizados quando necessário. Exemplos:
● Adapter● Façade● Factory● Proxy
● Strategy● Decorator● Singleton
Design PatternsDesign Patterns
Design patterns são soluções para necessidades específicas e devem ser utilizados quando necessário. Exemplos:
● Adapter● Façade● Factory● Proxy
● Strategy● Decorator● Singleton (você não vai precisar)
Prepare-se, cenas fortes!
Prepare-se, cenas fortes!Prepare-se, cenas fortes!
Problemas comuns...
Idioma do códigoIdioma 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)
<?phpnamespace Lcobucci\Examples;
class Pessoa
{ private $name; }
<?phpnamespace Lcobucci\Examples;
$luis = new Pessoa();$rex = new Cachorro();$graveto = new Galho();
$luis->jogar($graveto);$rex->pegar($graveto);
Isso não soa estranho??
Herança sem sentidoHerança sem sentido
● Herança não é apenas compartilhamento de comportamentos!
● O contexto das classes filhas não podem ser diferentes da classe pai
<?phpnamespace Lcobucci\Examples;
class Passaro{ public function voa() { }}
class Aviao extends Passaro{}
Avião também voa, mas nãoé um pássaro!!!
Causa raizCausa 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áriasTransferê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;
<?phpnamespace Lcobucci\Examples;
class ContaBancaria{ public $saldo;
public function __construct($saldo) { $this->saldo = $saldo; }
public function transfere( ContaBancaria $destino, $valor ) { $this->saldo -= $valor; $destino->saldo += $valor; }}
<?phpnamespace Lcobucci\Examples;
$contaSilvia = new ContaBancaria(200);$contaMaria = new ContaBancaria(30);
$contaSilvia->transfere($contaMaria, 100);
Mais informações? Onde??Mais informações? Onde??
● Head first Object-Oriented Analysis & Desinghttp://www.headfirstlabs.com/books/hfooad/
● Programando com Orientação a Objetoshttp://www.adianti.com.br/phpoo
● Domain Driven Designhttp://domaindrivendesign.org/books/evans_2003
● Clean Code: A Handbook of Agile Software Craftsmanshiphttp://goo.gl/Qyhmq
Obrigado!Obrigado!
Eu por aí: http://about.me/lcobucci
Slides: http://slideshare.net/lcobucci