O documento apresenta uma série de slides de uma palestra sobre boas práticas de programação PHP. Os principais tópicos abordados incluem: Clean Code, princípios SOLID, Object Calisthenics e UML. O objetivo é ensinar técnicas para produzir código PHP mais legível, manutenível e testável.
15. Guilherme
Blanco
PHP4Adults !
interface Bird!
{!
public function setLocation($longitude, $latitude);!
!
public function draw($altitude);!
}!
!
interface FlightfulBird extends Bird!
{!
! public function setAltitude($altitude);!
}!
50. Guilherme
Blanco
PHP4Adults !
class Item !
{!
final public static function find($id)!
{!
if (is_string($id) && trim($id) != '') {!
// do find ...!
}!
!
throw new InvalidArgumentException('$id must be a non-empty string');!
}!
!
final public static function create($id, array $data)!
{!
if ( ! is_string($id)) {!
throw new InvalidArgumentException('$id must be a string');!
}!
!
if (empty(trim($id))) {!
throw new InvalidArgumentException('$id must be a non-empty string');!
}!
!
// do create ...!
}!
}
51. Guilherme
Blanco
PHP4Adults !
class Item !
{!
final public static function find($id)!
{!
if ( ! is_string($id) || trim($id) === '') {!
throw new InvalidArgumentException('$id must be a non-empty string');!
}!
!
// do find ...!
}!
!
final public static function create($id, array $data)!
{!
if ( ! is_string($id) || trim($id) === '') {!
throw new InvalidArgumentException('$id must be a non-empty string');!
}!
!
// do create ...!
}!
}
52. Guilherme
Blanco
PHP4Adults !
class Item !
{!
final public static function find($id)!
{!
if ( ! is_string($id) || trim($id) === '') {!
throw new InvalidArgumentException('$id must be a non-empty string');!
}!
!
// do find ...!
}!
!
final public static function create($id, array $data)!
{!
if ( ! is_string($id) || trim($id) === '') {!
throw new InvalidArgumentException('$id must be a non-empty string');!
}!
!
// do create ...!
}!
}
53. Guilherme
Blanco
PHP4Adults !
final class Id!
{!
private $value;!
!
public function __construct($value)!
{!
if ( ! is_string($value) || trim($value) === '') {!
throw new InvalidArgumentException(!
sprintf('%s must be a non-empty string', $value)!
);!
}!
!
$this->value = $value;!
}!
!
public function getValue()!
{!
return $this->value;!
}!
}!
54. Guilherme
Blanco
PHP4Adults !
class Item !
{!
final public static function find(Id $id)!
{!
// do find ...!
}!
!
final public static function create(Id $id, array $data)!
{!
// do create ...!
}!
}
59. Guilherme
Blanco
PHP4Adults !
final class NullObject!
{!
! public function __get($property)!
! {!
! return new self;!
! }!
!
! public function __set($property, $value)!
! {!
! return new self;!
! }!
!
! public function __call($method, array $arguments)!
! {!
! ! return new self;!
! }!
!
! public function __callStatic($method, array $arguments)!
! {!
! return new self;!
! }!
!
! public function __toString()!
! {!
! return 'null';!
! }!
}
60. Guilherme
Blanco
PHP4Adults
Por que é ruim?
• Esconde um problema de encapsulamento
• Difícil de debugar e tratar exceções
• Código deve ser todo estruturado para
utilizar NullObject
• Difícil de ler e entender
65. Guilherme
Blanco
PHP4Adults
– Tim Bray (mencionando Phil Karlton)
“Há apenas 2 problemas difíceis na
computação: invalidação de cache,
nomear coisas e errar por 1.”
69. Guilherme
Blanco
PHP4Adults
public function getPage($data) { ... }!
!
!
!
public function startProcess() { ... }!
!
!
!
$trx->process('site.login');
Obter de onde?
Que p. é essa? $extendedTranslator
fork, create, begin, open
renderHomePage()
83. Guilherme
Blanco
PHP4Adults !
class AlbumList extends Collection!
{!
public function getPublic()!
{!
$filteredAlbumList = array();!
!
foreach ($this->value as $album) {!
if ($album->getPrivacy() === AlbumPrivacy::PUBLIC) {!
$filteredAlbumList[] = $album;!
}!
}!
!
return $filteredAlbumList;!
}!
}!
!
class User!
{!
private $name;!
private $albumList = new AlbumList();!
!
// ...!
}!
!
// Exemplo:!
$publicAlbumList = $user->getAlbumList()->getPublic();
84. Guilherme
Blanco
PHP4Adults !
class AlbumList extends Collection!
{!
public function getPublic()!
{!
return new ArrayCollection(!
array_filter(!
$this->value,!
function ($album)!
{!
return $album->isPublic();!
}!
)!
);!
}!
}!
!
class User!
{!
private $name;!
private $albumList = new AlbumList();!
!
// ...!
}!
!
// Exemplo:!
$publicAlbumList = $user->getAlbumList()->getPublic();
85. Guilherme
Blanco
PHP4Adults
Benefícios
• Single Responsibility Principle
• Implementação de operações sobre
coleções nas coleções
• Usar classes de SPL
• Facilidade em agrupar coleções sem se
preocupar com o comportamento dos
membros dela
• Filtragem, ordenação, mapeamento,
combinação são bons exemplos de métodos