SlideShare uma empresa Scribd logo
SUBSTITUIR TYPE CODES “COM" CLASSE
@tonicospinelli
Substituir Type Codes "com" Classe
SUBSTITUIR TYPE CODES “COM" CLASSE
Type Code
Conjunto de caracteres/números que formam uma
lista de valores permitidos para alguma entidade.
Frequentemente nomeados através de constantes.
SUBSTITUIR TYPE CODES “COM" CLASSE
Enum VS Classe
+ Classe nos permite adicionar comportamento
SUBSTITUIR TYPE CODES “COM" CLASSE
Problema
Uma classe possui um atributo que é um
Type Code e não é utilizado em:
condições do operador
não afetam o comportamento do programa
SUBSTITUIR TYPE CODES “COM" CLASSE
Solução
Através de uma classe, usar seus objetos
ao invés dos Type Codes
Atribuições mais seguras!
SUBSTITUIR TYPE CODES “COM" CLASSE
Estrutura Ilustrativa
$status: string
STATUS_INITIAL: string
STATUS_WAITING: string
STATUS_PAID: string
STATUS_DELIVERED: string
Order
SUBSTITUIR TYPE CODES “COM" CLASSE
Proposta
Order
$status: Status
Status
INITIAL: string
WAITING: string
PAID: string
DELIVERED: string
SUBSTITUIR TYPE CODES “COM" CLASSE
AVISO
O código a seguir
não segue PSR-2
SUBSTITUIR TYPE CODES “COM" CLASSE
Código
class Order
{
const STATUS_INITIAL = 'initial';
const STATUS_WAITING = 'waiting';
const STATUS_PAID = 'paid';
const STATUS_DELIVERED = ‘delivered';
private $status;
public function getStatus() {
return $this->status;
}
public function setStatus($status) {
$this->status = $status;
return $this;
}
}
SUBSTITUIR TYPE CODES “COM" CLASSE
Refatorando
class Status
{
const INITIAL = 'initial';
const WAITING = 'waiting';
const PAID = 'paid';
const DELIVERED = 'delivered';
}
SUBSTITUIR TYPE CODES “COM" CLASSE
Refatorando
class Status
{
private $code;
private function __construct($code) {
$this->code = $code;
}
public static function initial() {
return new self(self::INITIAL);
}
public static function waiting() {
return new self(self::WAITING);
}
}
SUBSTITUIR TYPE CODES “COM" CLASSE
Refatorando
class Status
{
public static function __callStatic($name, $arguments = []) {
$constantName = sprintf('%s::%s', self::class, strtoupper($name));
if (!defined($constantName)) {
$constantName = sprintf('%s::%s', self::class, self::INITIAL);
}
return new self(constant($constantName));
}
}
SUBSTITUIR TYPE CODES “COM" CLASSE
Refatorando
class Status
{
public function __toString() {
return $this->code;
}
public function equals(Status $status) {
return $this->code === $status->code;
}
public static function fromString($status) {
$methodName = strtolower($status);
return new self::{$methodName}();
}
}
SUBSTITUIR TYPE CODES “COM" CLASSE
Refatorando sem quebrar compatibilidade
class Order
{
public function __construct() {
$this->status = Status::initial();
}
public function getStatus() {
return (string) $this->status;
}
public function setStatus($status) {
$this->status = Status::fromString($status);
return $this;
}
}
SUBSTITUIR TYPE CODES “COM" CLASSE
Refatorando quebrando compatibilidade
class Order
{
public function __construct() {
$this->status = Status::initial();
}
public function getStatus() {
return $this->status;
}
public function setStatus(Status $status) {
$this->status = $status;
return $this;
}
}
SUBSTITUIR TYPE CODES “COM" CLASSE
Desvantagem
Requer mais código do que usar tipo inseguro
Vantagens
Diminui programação defensiva
Protege contra atribuições inválidas e comparações
Obrigado!
@tonicospinelli

Mais conteúdo relacionado

PPTX
Introdução ao php - Tipos de Operadores
PPTX
Introdução ao php - Condicionais e Laços de repetição
PPTX
Introdução ao php - Tipos de variáveis
PDF
Tema 2 | Linguagem PHP Básico (I)
PDF
LabMM4 (T11 - 12/13) - PHP - Tipos de dados e variáveis
PPTX
BD I - Aula 10 A - Introducao a SQL
PPT
2ª aula php
Introdução ao php - Tipos de Operadores
Introdução ao php - Condicionais e Laços de repetição
Introdução ao php - Tipos de variáveis
Tema 2 | Linguagem PHP Básico (I)
LabMM4 (T11 - 12/13) - PHP - Tipos de dados e variáveis
BD I - Aula 10 A - Introducao a SQL
2ª aula php

Mais procurados (11)

PPT
Variáveis
PPT
Curso PHP: Básico JavaScript
PPTX
Funções PHP - Criação de sites II
PDF
Criando APIs usando o micro-framework Respect
PDF
Bons cheiros, como programar melhor ?
PDF
STRUCTured Type Codes
PPT
Aula 4 php
PPTX
Variáveis
Curso PHP: Básico JavaScript
Funções PHP - Criação de sites II
Criando APIs usando o micro-framework Respect
Bons cheiros, como programar melhor ?
STRUCTured Type Codes
Aula 4 php
Anúncio

Semelhante a Substituir Type Codes "com" Classe (20)

ODP
Prog web 06-php-oo
ODP
Php 08 Oo
ODP
Object Oriented Programming
PPTX
DevTalk Zoox 04/2016
PPSX
5 Maneiras de melhorar seu código PHP
PDF
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
PDF
Programação Orientada a Objetos (POO) com PHP - Parte 1
ODP
Orientação a Objetos em PHP
PDF
Programação Orientada a Objetos (POO) com PHP - Parte 2
PPT
Aula5
PDF
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PDF
Curso de PHP - Objetos
PDF
Php Conf08 Refactoring
PDF
TDC 2016 - PHP7
KEY
Desenvolvimento iOS - Aula 1
PDF
Curso PHP UNIFACS 2014.1 – 2ª aula
PDF
Php5 e a orientação a objetos
PPTX
Desenvolvimento Web com PHP - Aula 3
PDF
Utilizacao de meta modelos na representacao de informacao complexa
Prog web 06-php-oo
Php 08 Oo
Object Oriented Programming
DevTalk Zoox 04/2016
5 Maneiras de melhorar seu código PHP
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
Programação Orientada a Objetos (POO) com PHP - Parte 1
Orientação a Objetos em PHP
Programação Orientada a Objetos (POO) com PHP - Parte 2
Aula5
PHP Experience 2016 - [Palestra] Keynote: PHP-7
Curso de PHP - Objetos
Php Conf08 Refactoring
TDC 2016 - PHP7
Desenvolvimento iOS - Aula 1
Curso PHP UNIFACS 2014.1 – 2ª aula
Php5 e a orientação a objetos
Desenvolvimento Web com PHP - Aula 3
Utilizacao de meta modelos na representacao de informacao complexa
Anúncio

Último (7)

PPTX
Curso de Windows 11 resumido na prática.pptx
PDF
Evolução em código: algoritmos genéticos com PHP
PDF
apresentacao introducao computacao ead.pdf
DOC
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO
PPTX
Mapeamento de Objeto para Tabela Relacional
DOC
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
PDF
Dos requisitos ao código: como criar código rastreável em PHP
Curso de Windows 11 resumido na prática.pptx
Evolução em código: algoritmos genéticos com PHP
apresentacao introducao computacao ead.pdf
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO
Mapeamento de Objeto para Tabela Relacional
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
Dos requisitos ao código: como criar código rastreável em PHP

Substituir Type Codes "com" Classe

  • 1. SUBSTITUIR TYPE CODES “COM" CLASSE @tonicospinelli
  • 3. SUBSTITUIR TYPE CODES “COM" CLASSE Type Code Conjunto de caracteres/números que formam uma lista de valores permitidos para alguma entidade. Frequentemente nomeados através de constantes.
  • 4. SUBSTITUIR TYPE CODES “COM" CLASSE Enum VS Classe + Classe nos permite adicionar comportamento
  • 5. SUBSTITUIR TYPE CODES “COM" CLASSE Problema Uma classe possui um atributo que é um Type Code e não é utilizado em: condições do operador não afetam o comportamento do programa
  • 6. SUBSTITUIR TYPE CODES “COM" CLASSE Solução Através de uma classe, usar seus objetos ao invés dos Type Codes Atribuições mais seguras!
  • 7. SUBSTITUIR TYPE CODES “COM" CLASSE Estrutura Ilustrativa $status: string STATUS_INITIAL: string STATUS_WAITING: string STATUS_PAID: string STATUS_DELIVERED: string Order
  • 8. SUBSTITUIR TYPE CODES “COM" CLASSE Proposta Order $status: Status Status INITIAL: string WAITING: string PAID: string DELIVERED: string
  • 9. SUBSTITUIR TYPE CODES “COM" CLASSE AVISO O código a seguir não segue PSR-2
  • 10. SUBSTITUIR TYPE CODES “COM" CLASSE Código class Order { const STATUS_INITIAL = 'initial'; const STATUS_WAITING = 'waiting'; const STATUS_PAID = 'paid'; const STATUS_DELIVERED = ‘delivered'; private $status; public function getStatus() { return $this->status; } public function setStatus($status) { $this->status = $status; return $this; } }
  • 11. SUBSTITUIR TYPE CODES “COM" CLASSE Refatorando class Status { const INITIAL = 'initial'; const WAITING = 'waiting'; const PAID = 'paid'; const DELIVERED = 'delivered'; }
  • 12. SUBSTITUIR TYPE CODES “COM" CLASSE Refatorando class Status { private $code; private function __construct($code) { $this->code = $code; } public static function initial() { return new self(self::INITIAL); } public static function waiting() { return new self(self::WAITING); } }
  • 13. SUBSTITUIR TYPE CODES “COM" CLASSE Refatorando class Status { public static function __callStatic($name, $arguments = []) { $constantName = sprintf('%s::%s', self::class, strtoupper($name)); if (!defined($constantName)) { $constantName = sprintf('%s::%s', self::class, self::INITIAL); } return new self(constant($constantName)); } }
  • 14. SUBSTITUIR TYPE CODES “COM" CLASSE Refatorando class Status { public function __toString() { return $this->code; } public function equals(Status $status) { return $this->code === $status->code; } public static function fromString($status) { $methodName = strtolower($status); return new self::{$methodName}(); } }
  • 15. SUBSTITUIR TYPE CODES “COM" CLASSE Refatorando sem quebrar compatibilidade class Order { public function __construct() { $this->status = Status::initial(); } public function getStatus() { return (string) $this->status; } public function setStatus($status) { $this->status = Status::fromString($status); return $this; } }
  • 16. SUBSTITUIR TYPE CODES “COM" CLASSE Refatorando quebrando compatibilidade class Order { public function __construct() { $this->status = Status::initial(); } public function getStatus() { return $this->status; } public function setStatus(Status $status) { $this->status = $status; return $this; } }
  • 17. SUBSTITUIR TYPE CODES “COM" CLASSE Desvantagem Requer mais código do que usar tipo inseguro Vantagens Diminui programação defensiva Protege contra atribuições inválidas e comparações