Kilderson Sena
Cearense arretado e amante da programação. Full Stack Dev, Pai do Kauan Lucas, viciado em café, futebol e Rock'n Roll
Kilderson Sena
@derson_sena
- PHP Software Engineer
- Graduado em Análise e Desenv. Sistemas
- Movido a café e rockn'roll
- Programador há mais de 10 anos
- Pai do Kauan Lucas
fb.com/kilderson.sena
@derson_sena
@derson_sena
youtube.com/yiiacademybr
yiiacademy.com.br
yiiacademy.com.br/8-motivos-para-usar-o-yii-2
devtube.com.br/ebook-oo1.html
A
E
H
P
A
E
H
P
A
E
H
P
class TV
{
public $ligado = false;
}
class ControleRemoto
{
public $tv;
public function __construct(TV $tv)
{
$this->tv = $tv;
}
public function ligar()
{
$this->tv->ligado = true;
}
public function desligar()
{
$this->tv->ligado = false;
}
}
$tv = new TV();
$controleRemoto = new ControleRemotoTV($tv);
if ($tv->ligado) {
$controleRemoto->desligar();
} else {
$controleRemoto->ligar();
}
class TV
{
public $ligado = false;
}
class ControleRemoto
{
public $tv;
public function __construct(TV $tv)
{
$this->tv = $tv;
}
public function ligar()
{
$this->tv->ligado = true;
}
public function desligar()
{
$this->tv->ligado = false;
}
}
$tv = new TV();
$controleRemoto = new ControleRemotoTV($tv);
if ($tv->ligado) {
$controleRemoto->desligar();
} else {
$controleRemoto->ligar();
}
class TV
{
public $ligado = false;
}
class ControleRemoto
{
public $tv;
public function __construct(TV $tv)
{
$this->tv = $tv;
}
public function ligar()
{
$this->tv->ligado = true;
}
public function desligar()
{
$this->tv->ligado = false;
}
}
$tv = new TV();
$controleRemoto = new ControleRemotoTV($tv);
if ($tv->ligado) {
$controleRemoto->desligar();
} else {
$controleRemoto->ligar();
}
class TV
{
public $ligado = false;
}
class ControleRemoto
{
public $tv;
public function __construct(TV $tv)
{
$this->tv = $tv;
}
public function ligar()
{
$this->tv->ligado = true;
}
public function desligar()
{
$this->tv->ligado = false;
}
}
$tv = new TV();
$controleRemoto = new ControleRemotoTV($tv);
if ($tv->ligado) {
$controleRemoto->desligar();
} else {
$controleRemoto->ligar();
}
class TV
{
private $ligado = false;
public function ligar()
{
if ($this->ligado === true) {
return;
}
$this->ligado = true;
}
public function desligar()
{
if ($this->ligado === false) {
return;
}
$this->ligado = false;
}
}
class TV
{
private $ligado = false;
public function ligar()
{
if ($this->ligado === true) {
return;
}
$this->ligado = true;
}
public function desligar()
{
if ($this->ligado === false) {
return;
}
$this->ligado = false;
}
}
class TV
{
private $ligado = false;
public function ligar()
{
if ($this->ligado === true) {
return;
}
$this->ligado = true;
}
public function desligar()
{
if ($this->ligado === false) {
return;
}
$this->ligado = false;
}
}
class TV
{
private $ligado = false;
public function ligar()
{
if ($this->ligado === true) {
return;
}
$this->ligado = true;
}
public function desligar()
{
if ($this->ligado === false) {
return;
}
$this->ligado = false;
}
}
class ControleRemoto
{
private $tv;
public function __construct(TV $tv)
{
$this->tv = $tv;
}
public function ligar()
{
$this->tv->ligar();
}
public function desligar()
{
$this->tv->desligar();
}
}
class ControleRemoto
{
private $tv;
public function __construct(TV $tv)
{
$this->tv = $tv;
}
public function ligar()
{
$this->tv->ligar();
}
public function desligar()
{
$this->tv->desligar();
}
}
class ControleRemoto
{
private $tv;
public function __construct(TV $tv)
{
$this->tv = $tv;
}
public function ligar()
{
$this->tv->ligar();
}
public function desligar()
{
$this->tv->desligar();
}
}
// Antes
$tv = new TV();
$controleRemoto = new ControleRemotoTV($tv);
if ($tv->ligado) {
$controleRemoto->desligar();
} else {
$controleRemoto->ligar();
}
// Depois
$tv = new TV();
$controleRemoto = new ControleRemotoTV($tv);
$controleRemoto->ligar();
$controleRemoto->desligar();
A
E
H
P
abstract class Person
{
private $name;
public function __construct(string $nome)
{
$this->nome = $nome;
}
public function getNome(): string
{
return $this->nome;
}
}
class IndividualPerson extends Person
{
}
class LegalPerson extends Person
{
}
$individualPerson = new IndividualPerson('Kilderson Sena');
$legalPerson = new LegalPerson('Tembo Social');
echo $individualPerson->getNome();
echo $legalPerson->getNome();
abstract class Person
{
private $name;
public function __construct(string $nome)
{
$this->nome = $nome;
}
public function getNome(): string
{
return $this->nome;
}
}
class IndividualPerson extends Person
{
}
class LegalPerson extends Person
{
}
$individualPerson = new IndividualPerson('Kilderson Sena');
$legalPerson = new LegalPerson('Tembo Social');
echo $individualPerson->getNome();
echo $legalPerson->getNome();
abstract class Person
{
private $name;
public function __construct(string $nome)
{
$this->nome = $nome;
}
public function getNome(): string
{
return $this->nome;
}
}
class IndividualPerson extends Person
{
}
class LegalPerson extends Person
{
}
$individualPerson = new IndividualPerson('Kilderson Sena');
$legalPerson = new LegalPerson('Tembo Social');
echo $individualPerson->getNome();
echo $legalPerson->getNome();
A
E
H
P
class Vehicle
{
public function turnOn(string $param1, int $param2): bool
{
// ... implementation
}
}
class Motocicle extends Vehicle
{
public function turnOn(string $param1, int $param2): bool
{
// ... override with a new behavior
}
}
class Vehicle
{
public function turnOn(string $param1, int $param2): bool
{
// ... implementation
}
}
class Motocicle extends Vehicle
{
public function turnOn(string $param1, int $param2): bool
{
// ... override with a new behavior
}
}
public class DataHelper {
private int dia;
private String mes;
private int ano;
public DataHelper() {
this.dia = "19";
this.mes = "10";
this.ano = "2019";
}
public DataHelper(int dia) {
this.dia = dia;
this.mes = "10";
this.ano = "2019";
}
public DataHelper(int dia, String mes) {
this.dia = dia;
this.mes = mes;
this.ano = "2019";
}
}
public class DataHelper {
private int dia;
private String mes;
private int ano;
public DataHelper() {
this.dia = "19";
this.mes = "10";
this.ano = "2019";
}
public DataHelper(int dia) {
this.dia = dia;
this.mes = "10";
this.ano = "2019";
}
public DataHelper(int dia, String mes) {
this.dia = dia;
this.mes = mes;
this.ano = "2019";
}
}
A
E
H
P
Códigos com
mau cheiro
(Code Smell)
(Fragilidade)
class TV
{
private $ligado = false;
public function ligar()
{
if ($this->ligado === true) {
return;
}
$this->ligado = true;
}
public function desligar()
{
if ($this->ligado === false) {
return;
}
$this->ligado = false;
}
}
class TV
{
private $ligado = false;
public function ligar()
{
if ($this->ligado === true) {
return;
}
$this->ligado = true;
}
public function desligar()
{
if ($this->ligado === false) {
return;
}
$this->ligado = false;
}
}
class TV
{
private $ligado = false;
public function ligarDesligar(bool $ligar)
{
if ($this->ligado === true && $ligar === true) {
return;
}
if ($this->ligado === false && $ligar === false) {
return;
}
$this->ligado = $ligar;
}
}
class DespachanteMercadoria
{
public function despacharCeara(array $itens)
{
$transportadora = new Transportadora();
$transportadora->setItens($itens);
return $transportadora->enviar('CE');
}
public function despacharAlagoas(array $itens)
{
$transportadora = new Transportadora();
$transportadora->setItens($itens);
return $transportadora->enviar('AL');
}
}
class DespachanteMercadoria
{
public function despacharCeara(array $itens)
{
$transportadora = new Transportadora();
$transportadora->setItens($itens);
return $transportadora->enviar('CE');
}
public function despacharAlagoas(array $itens)
{
$transportadora = new Transportadora();
$transportadora->setItens($itens);
return $transportadora->enviar('AL');
}
}
class DespachanteMercadoria
{
public function despachar(string $uf, array $itens)
{
$transportadora = new Transportadora();
$transportadora->setItens($itens);
return $transportadora->enviar($uf);
}
}
Princípios e
Boas Práticas
Robert C. Martin
Vulgo: Uncle Bob
(Princípio da Responsabilidade Única)
class Vendedor
{
private $nome;
private $salario;
public function calcularSalario()
{
$combustivel = 100;
$alimentacao = 250;
$comissao = 0.2;
return $this->salario +
($this->salario * $comissao) +
$alimentacao +
$combustivel;
}
public function imprimirContraCheque()
{
// logica complexa de impressao
}
}
class Vendedor
{
private $nome;
private $salario;
public function calcularSalario()
{
$combustivel = 100;
$alimentacao = 250;
$comissao = 0.2;
return $this->salario +
($this->salario * $comissao) +
$alimentacao +
$combustivel;
}
public function imprimirContraCheque()
{
// logica complexa de impressao
}
}
class CalculadoraSalario
{
public function calcularSalario()
{
// implementacao
}
}
class ImpressoraContraCheque
{
public function imprimir()
{
// implementacao
}
}
class Vendedor
{
private $nome;
private $salario;
}
(Princípio do Aberto-Fechado)
(Princípio da Inversão de Dependência)
class A
{
// .. Implementation
}
class B
{
private $a;
public function __construct()
{
$this->a = new A();
}
}
class A
{
// .. Implementation
}
class B
{
private $a;
public function __construct()
{
$this->a = new A();
}
}
interface AInterface
{
// Implementation
}
class A implements AInterface
{
// .. Implementation
}
class B
{
private $a;
public function __construct(AInterface $a)
{
$this->a = $a;
}
}
$nf = new NotaFiscal();
$item1 = new NotaFiscalItem('Notebook', 1500);
$item2 = new NotaFiscalItem('Monitor', 800);
$nf->itens[] = $item1;
$nf->itens[] = $item2;
$nf->total = $item1->getPreco() + $item2->getPreco();
foreach ($nf->itens as $item) {
echo "
{$item->getDescricao()} |
Preço: {$item->getPreco()}
";
}
$nf = new NotaFiscal();
$item1 = new NotaFiscalItem('Notebook', 1500);
$item2 = new NotaFiscalItem('Monitor', 800);
$nf->itens[] = $item1;
$nf->itens[] = $item2;
$nf->total = $item1->getPreco() + $item2->getPreco();
foreach ($nf->itens as $item) {
echo "
{$item->getDescricao()} |
Preço: {$item->getPreco()}
";
}
$nf = new NotaFiscal();
$item1 = new NotaFiscalItem('Notebook', 1500);
$item2 = new NotaFiscalItem('Monitor', 800);
$nf->itens[] = $item1;
$nf->itens[] = $item2;
$nf->total = $item1->getPreco() + $item2->getPreco();
foreach ($nf->itens as $item) {
echo "
{$item->getDescricao()} |
Preço: {$item->getPreco()}
";
}
$nf = new NotaFiscal();
$item1 = new NotaFiscalItem('Notebook', 1500);
$item2 = new NotaFiscalItem('Monitor', 800);
$nf->itens[] = $item1;
$nf->itens[] = $item2;
$nf->total = $item1->getPreco() + $item2->getPreco();
foreach ($nf->itens as $item) {
echo "
{$item->getDescricao()} |
Preço: {$item->getPreco()}
";
}
$nf = new NotaFiscal();
$item1 = new NotaFiscalItem('Notebook', 1500);
$item2 = new NotaFiscalItem('Monitor', 800);
$nf->adicionarItem($item1);
$nf->adicionarItem($item2);
echo $nf->relatorio();
// PHP
$obj->rotina1()
->rotina2()
->rotina3()
->rotina4()
->rotinaN();
// JAVA
obj.rotina1()
.rotina2()
.rotina3()
.rotina4()
.rotinaN();
$funcionario = new Funcionario();
$funcionario->setNome("Kilderson")
->setSobrenome("Sena")
->setEmail("dersonsena@gmail.com")
->setCidade("Fortaleza")
->setUF("CE");
public static function formatDate($date)
{
$format = DateTime::ATOM;
if ($date instanceof DateTime) {
$d = $date->format($format);
} elseif (is_numeric($date)) {
$d = date($format, $date);
} else {
$d = (string) $date;
}
return $d;
}
public static function formatDate($date)
{
$format = DateTime::ATOM;
if ($date instanceof DateTime) {
$d = $date->format($format);
} elseif (is_numeric($date)) {
$d = date($format, $date);
} else {
$d = (string) $date;
}
return $d;
}
public static function formatDate($date)
{
$format = DateTime::ATOM;
if ($date instanceof DateTime) {
return $date->format($format);
}
if (is_numeric($date)) {
return date($format, $date);
}
return (string) $date;
}
class EmailService
{
public function __construct(string $email)
{
if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
throw new InvalidEmailException("Invalid E-mail");
}
return $this->send($email);
}
}
class Email
{
private $email;
public function __construct(string $email)
{
if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
throw new InvalidEmailException("Invalid Email");
}
$this->email = $email;
}
}
class EmailService
{
public function __construct(Email $email)
{
return $this->send($email);
}
}
class TabPrcCons
{
private $srvs;
private $vgc;
private $ttl;
public function calc()
{
// ... Implementation
}
}
class TabelaPrecosConsumidor
{
private $servicos;
private $vigencia;
private $total;
public function calcular()
{
// ... Implementation
}
}
class Buyer
{
private $name;
private $purchases;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
public function getPurchases()
{
return $this->purchases;
}
public function setPurchases($purchases)
{
$this->purchases = $purchases;
}
}
class Buyer
{
private $name;
private $purchases;
public function __construct(string $name)
{
$this->name = $name;
}
public function getNome()
{
return $this->name;
}
public function addNewPurchase($purchase)
{
$this->purchases[] = $purchase;
}
}
Marcel dos Santos - PHPSP - @marcelgsantos
Marcel dos Santos - PHPSP - @marcelgsantos
bit.ly/Learning-OOP-in-PHO
Marcos Felipe - @omarkdev
https://www.devtube.com.br
PHPWOMEN40%OFF
fb.com/kilderson.sena
@derson_sena
@derson_sena
dersonsena
By Kilderson Sena
Cearense arretado e amante da programação. Full Stack Dev, Pai do Kauan Lucas, viciado em café, futebol e Rock'n Roll