15. • Princípio da responsabilidade única
• Princípio Abrir-Fechar
• Princípio Liskov da substituição
• Princípio de Segregação de Interface
• Princípio Inversão de Dependência
SOLID
17. Deve existir um e
somente UM MOTIVO
para que uma CLASSE
ou MÉTODO exista.
Princípio da responsabilidade única
18. <?php
class Produto {
private $descricao;
private $valor;
public function calcularValorDesconto(){}
public function salvar(){}
public function verificarSeTemNoEstoque(){}
}
?>
Princípio da responsabilidade única
20. <?php
class Produto {
private $descricao;
private $valor;
public function calcularValorDesconto(){}
public function salvar(){}
public function verificarSeTemNoEstoque(){}
}
?>
Princípio da responsabilidade única
21. <?php
Será que tem mais de
class Produto { uma responsabilidade?
private $descricao; Realiza
private $valor; Calculo
public function calcularValorDesconto(){} Salva
public function salvar(){} na base
public function verificarSeTemNoEstoque(){}
}
Verifica
na base
?>
Princípio da responsabilidade única
22. <?php
class CalculadoraDesconto{
public function calcularValorDesconto($produto){}
}
?>
Princípio da responsabilidade única
23. <?php
class ProdutoDAO{
public function salvar($produto){}
public function verificarSeTemNoEstoque($produto){}
}
?>
Princípio da responsabilidade única
26. <?php
class CalculadoraDesconto{
public function calcularValorDesconto($produto){
if($produto->regiao == 'SUL'){
//codigo para executar calculo para a região sul
}else{
//codigo p/executar calculo demais regiões
}
}}
?>
Princípio da responsabilidade única
28. <?php
class CalculadoraDesconto{
public function calcularValorDesconto($produto){
if($produto->regiao == 'SUL'){
//codigo para executar calculo para a região sul
}else{
//codigo p/executar calculo demais regiões
}
}}
?>
Princípio da responsabilidade única
29. Mais de Uma
<?php
responsabilidade
class CalculadoraDesconto{
public function calcularValorDesconto($produto){
if($produto->regiao == 'SUL'){
//codigo para executar calculo para a região sul
}else{
//codigo p/executar calculo demais regiões
}
}} Isso não é
reaproveitamento
?>
Princípio da responsabilidade única
30. <?php
class CalculadoraDesconto{
public function calcularDescontoRegiaoSul($produto){}
public function calcularDescontoDemaisRegioes($produto){}
}
?>
Princípio da responsabilidade única
39. abstract class TipoPessoa{ Bem mais
public function realizarCompra($compra); flexível
}
class PessoaJuridica extends TipoPessoa{
public function realizarCompra($compra){
//código para efetuar compra
}
}
class PessoaFisica extends TipoPessoa{
public function realizarCompra($compra){
//código para efetuar compra
}
}
Princípio Aberto-fechado
40. Sem impacto no cliente
Cliente TipoPessoa quando eu alterar.
PessoaFisica PessoJuridica
Princípio Aberto-fechado
41. “Se q(x) é uma propriedade
demonstrável dos objetos X de
tipo T . Então deve ser verdadeiro
para objetos Y de tipo S
onde S é um subtipo de T.”
Princípio da substituição de Liskov
44. <?php
class CalculadoraDesconto{
public function valorDesconto(TipoPessoa $tipoPessoa){
$desconto = $tipoPessoa->precentualDesconto();
// codigo restante para o calculo
}
}
?>
Princípio da substituição de Liskov
45. Muito mais robusto
<?php
$calculadoraDesconto = new CalculadoraDesconto();
$PessoaFisica = new PessoaFisica();
$calculadoraDesconto->valorDesconto($PessoaFisica);
$PessoaJuridica = new PessoaJuridica();
$calculadoraDesconto->valorDesconto($PessoaJuridica);
?>
Princípio da substituição de Liskov
46. “Os clientes não devem ser
forçados a depender de
interfaces que eles não
utilizam
Princípio da Segregação de Interface
47. <?php
Interface DAO{
public function buscar($id);
public function salvar($objeto);
public function alterar(($objeto);
}
?>
48. Todas classes que implementarem essa
interface agora vão ter esses métodos. Mas
será que todas as DAOs vão precisar desses
métodos?
49. Grande Acoplamento! Vou dividir
essa Interface.
<?php
Interface DAO{
public function buscar($id);
public function salvar($objeto);
public function alterar(($objeto);
}
?>
50. Grande Coesão!
Projeto mais flexível.
Interface BuscaDAO{
public function buscar($id);
}
Interface AlterarDAO{
public function alterar($id);
}
Interface SalvarDAO{
public function salvar($id);
}
51. “Dependa de
abstrações e não de
classes concretas”
Princípio da Inversão de Dependência
52.
53.
54. Acho que vou mexer em
vários locais do projeto?
Como posso melhorar?