SOBRE SOLID:
É um objetivo muito ousado
Exige muitos conceitos de OOP
Envolve muita experiência em abstração
Exige um time muito "Maduro "
Slide 12
Slide 12 text
SOLID não é um processo
SOLID é o objetivo final...
...de um processo muito longo
Slide 13
Slide 13 text
COMO COMEÇAR O PROCESSO?
Slide 14
Slide 14 text
É impossível aplicar SOLID em uma classe "gorda"
Slide 15
Slide 15 text
No content
Slide 16
Slide 16 text
Sua classe precisa de uma dieta
Slide 17
Slide 17 text
OBJECT CALISTHENICS
❤
Slide 18
Slide 18 text
Jeff Bay, 2008
The Thoughtworks Anthology
Slide 19
Slide 19 text
9 REGRAS/EXERCÍCIOS
para deixar seus objetos em forma
Slide 20
Slide 20 text
ATENÇÃO
Não se engane
Algumas regras são bem difíceis
Aplique com cautela
Não seja um extremista
Invista tempo em cada regra
Algumas regras são dependentes
private function response(Request $request): Response
{
$response = $this>buildFromRequest($request);
return $this>formatResponse($response);
}
private function buildFromRequest(Request $request): Response
{
if ($request>expectsJson()) {
return $this>createJsonResponse();
}
return $this>createHtmlResponse();
}
Slide 31
Slide 31 text
REGRA 3
Envolva seus tipos primitivos
Slide 32
Slide 32 text
MOTIVOS
Tipos primitivos são muito permissivos
Não possuem nenhum significado/comportamento
Encapsulamento
Value Objects em DDD
Slide 33
Slide 33 text
public function charge(int $amount, string $currency): string
{
$this>paymentProvider>chargeUser(
$this>user>id(), $amount, $currency
);
return $this>paymentProvider
>confirmationNumber();
}
Slide 34
Slide 34 text
class Money
{
private int $amount;
private Currency $currency;
public function __construct(int $amount, string $currency)
{
$this>amount = $amount;
$this>currency = new Currency($currency);
}
public function amount(): int
{
return $this>amount;
}
public function currencyAbbreviation(): string
{
return $this>currency
>abbreviation();
}
}
Slide 35
Slide 35 text
class Currency
{
private string $abbreviation;
public function __construct(string $abbreviation)
{
if (!$this>abbreviationIsValid($abbreviation)) {
throw new InvalidCurrencyAbbreviationException;
}
$this>abbreviation = strtoupper($abbreviation);
}
public function abbreviation(): string
{
return $this>abbreviation;
}
// Code
}
Slide 36
Slide 36 text
public function charge(Money $price): string
{
$this>paymentProvider>chargeUser(
$this>user>id(),
$price>amount(),
$price>currencyAbbreviation(),
);
return $this>paymentProvider
>confirmationNumber();
}
Slide 37
Slide 37 text
REGRA 4
Envolva suas collections em classes
Slide 38
Slide 38 text
MOTIVOS
Te força a usar SRP
Agrupa ações semelhantes na mesma classe
Slide 39
Slide 39 text
CONCEITO
Manipular objectos similares em um só lugar
Somente uma propriedade por classe collection
Métodos realizam ações no conjunto de objectos
Slide 40
Slide 40 text
class ActiveUsersCollection implement Iterator
{
private array $users = [];
public function __construct(array $users)
{
$this>users = $users;
}
public function filterByActivationProcess(): self
{
// Code
}
}
Slide 41
Slide 41 text
REGRA 5
Use apenas um ponto (>) por linha
Slide 42
Slide 42 text
MOTIVOS
Facilita a leitura
Lei de Demeter (fale com amigos)
Reforça o Open-close principle
DICA MAROTA TRILEGAL
Nomes estão ficando muito grandes?
Reveja SRP!
Sua classe/método pode estar fazendo coisa demais
Slide 52
Slide 52 text
REGRA 7
Mantenha todas as classes pequenas
Slide 53
Slide 53 text
MOTIVOS
Mais fáceis de manter
SRP
Porque classe grande é uma merda
Slide 54
Slide 54 text
REGRINHAS
Classes com até 50 linhas 150 linhas (PHP)
Pacotes com no máximo 10 arquivos
Slide 55
Slide 55 text
REGRA 8
Não tenha mais que duas variáveis de instância em
sua classe
Slide 56
Slide 56 text
No content
Slide 57
Slide 57 text
MOTIVOS
SRP
Porque classe grande é uma merda
Slide 58
Slide 58 text
No content
Slide 59
Slide 59 text
class Customer
{
private Name $name;
private int $customerId;
}
class Name
{
private string $firstName;
private string $lastName;
}
Slide 60
Slide 60 text
Não seja um extremista!
para lógica de domínio
para representação de dados (Entity)
Slide 61
Slide 61 text
REGRA 9
Não use getters ou setters
A galera de Java pira
Slide 62
Slide 62 text
No content
Slide 63
Slide 63 text
MOTIVOS
Podem ferir SRP / Encapsulamento
Regra: Tell, don't ask!
Não possuem significado algum
"Immutable classes"
pra accessors (sem tomada de decisão)
Slide 64
Slide 64 text
class Company
{
private EmployeesCollection $employees;
public function setEmployees(EmployeesCollection $employees): void
{
$this>employees = $employees;
}
}
Slide 65
Slide 65 text
class Company
{
private EmployeesCollection $employees;
public function hireEmployee(Employee $employee): void
{
$this>employees>add($employee)
}
}
Slide 66
Slide 66 text
class Exam
{
private int $total;
public function setTotal(int $total): void
{
$this>total = $total;
}
}
Slide 67
Slide 67 text
class Exam
{
private int $total;
public function addCorrectQuestion(Question $question): void
{
$this>total += $question>total();
}
}