SUBSTITUIR TYPE CODES “COM" CLASSE
@tonicospinelli
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

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
  • 18.