O Curso Full Cycle é uma formação completa para fazer com que pessoas desenvolvedoras sejam capazes de trabalhar em projetos expressivos sendo capazes de desenvolver aplicações de grande porte utilizando de boas práticas de desenvolvimento.
https://github.com/alcir-junior-caju/study-full-cycle-3-0
Para quem quiser visualizar o projeto na IDE clique no teclado a tecla ponto
, esse recurso do GitHub é bem bacana
- SOLID é um acrônimo que consolida 5 itens que são considerados como boas práticas no mundo do desenvolvimento orientado a objetos.
- SRP - Single Responsibility Principle;
- OCP - Open-closed Principle;
- LSP - Liskov Substitution Principle;
- ISP - Interface Segregation Principle;
- DIP - Dependency Inversion Principle;
- Uma classe ela deve ter apenas uma responsabilidade, deve ter um e apenas um motivo para mudar;
- Exemplo de quebra desse princípio:
<?php
class Course
{
private $name;
private $category;
private $description;
public function connection ()
{
$pdo = new PDO();
return $pdo;
}
public function createCategory()
{
$this->connection()->insert($this->category);
}
public function createCourse()
{
$this->connection()->insert($this->course);
}
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
return $this;
}
public function getCategory()
{
return $this->category;
}
public function setCategory($category)
{
$this->category = $category;
return $this;
}
}
- Como resolver com uma solução simples?
- Essa classe deveria ser uma entidade anêmica de
Course
apenas comgetters
esetters
. - Criar um outra entidade para
Category
; - E um
repository
para o banco de dados;
- Essa classe deveria ser uma entidade anêmica de
- Toda classe deve ser aberta para extensão mas fechada para modificação.
- Exemplo de quebra desse princípio:
<?php
class Video
{
private $type;
public function calculateInterest()
{
if ($this->type === "Movie") {
// calcula interesse baseado em filme
} elseif ($this->type === "TVShow") {
// calcula interesse baseado em serie
}
}
}
- Como resolver com uma solução simples?
<?php
abstract class Video
{
abstract public function calculateInterest();
}
class Movie extends Video
{
public function calculateInterest()
{
// calcula interesse baseado em filme
}
}
class TVShow extends Video
{
public function calculateInterest()
{
// calcula interesse baseado em serie
}
}
- Subclasses podem ser substituidas por suas classes pai;
- Exemplo de quebra desse princípio:
<?php
class Movie
{
public function play()
{
// play no video
}
public function increaseVolume()
{
// increase volume
}
}
class TheLionKing extends Movie
{
}
// Filme sem som
class ModernTimes extends Movie
{
public function increaseVolume()
{
// deu ruim
}
}
- Uma classe não é obrigada a implementar interfaces que ela não utilizará;
- Exemplo de quebra desse princípio:
<?php
interface Movie
{
public function play();
public function increaseVolume();
}
class TheLionKing implements Movie
{
public function play()
{
// play no video
}
public function increaseVolume()
{
// increase volume
}
}
class ModernTimes implements Movie
{
public function play()
{
// play no video
}
public function increaseVolume()
{
// esse metodo não será utilizado, porém terá de ser implementado
}
}
- Como resolver com uma solução simples?
<?php
interface Movie
{
public function play();
}
interface AudioControl
{
public function increaseVolume();
}
class TheLionKing implements Movie, AudioControl
{
public function play()
{
// play no video
}
public function increaseVolume()
{
// increase volume
}
}
class ModernTimes implements Movie
{
public function play()
{
// play no video
}
}
- Dependa de abstrações e não de implemantações;
- Inverter as dependências;
- Exemplo de quebra desse princípio:
<?php
class DramaCategory
{
}
class Movie
{
private $name;
private $category;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
public function getCategory()
{
return $this->category;
}
public function setCategory(DramaCategory $category)
{
$this->category = $category;
}
}
- Exemplo de quebra desse princípio:
<?php
class DramaCategory
{
}
class Movie
{
private $name;
private $category;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
public function getCategory()
{
return new DramaCategory();
}
}
- Como resolver com uma solução simples?
<?php
interface Category
{
}
class DramaCategory implements Category
{
}
class Movie
{
public function __construct($name, Category $category)
{
$this->name = $name;
$this->category = $category;
}
private $name;
private $category;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
public function getCategory()
{
return $this->category;
}
public function setCategory($category)
{
$this->category = $category;
}
}
$movie = new Movie("name", new Category());