Palestra realizada no Meetup Total PHP sobre Clean Code e Object Calisthenics aplicados no PHP.
Nesta palestra são apresentados conceitos importantes para manter seu código limpo e aplicar técnicas de refactoring para manter seu código organizado e performatico.
Essa apresentação fala um pouco sobre o que é, quando e porque aplicar Refatoração em seu código.
Além de mostrar algumas técnicas que Martin Fowler mostra em seu livro.
- Apresentar o conceito de Injeção de Dependências
- Explorar a visão sobre os artefatos relacionados à Injeção de Dependências
- Promover a reflexão sobre as boas práticas de uso de Injeção de Dependências
Essa apresentação fala um pouco sobre o que é, quando e porque aplicar Refatoração em seu código.
Além de mostrar algumas técnicas que Martin Fowler mostra em seu livro.
- Apresentar o conceito de Injeção de Dependências
- Explorar a visão sobre os artefatos relacionados à Injeção de Dependências
- Promover a reflexão sobre as boas práticas de uso de Injeção de Dependências
Palestra sobre utilização de design patterns em PHP. Exemplos práticos com Singleton, Facade, Adapter, Front Controller, Template View, Table Data Gateway e Active Record.
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Pablo Dall'Oglio
Nesta apresentação serão apresentados diferentes aspectos relacionados à design, manutenção segurança e performance, que influenciam a construção de ERP's com PHP. Boas práticas, Design Patterns, Facade, Adapter, Modelagem, DDD, Acoplamento, Sessões, Cache de objetos.
Projetos novos ou legados exigem da equipe muita disciplina para manter todo o código limpo e conciso. Mesmo seguindo várias técnicas e padrões, devido a nossa condição humana, estamos sujeitos a cometer falhas o que nos leva a escrever código complexo e de difícil entendimento. Há várias práticas que ajudam a amenizar e corrigir estas falhas. Fazer testes, saber como e quando fazer um refactoring são essenciais para garantir a satisfação do cliente. Esta palestra aborda pontos que ajudam a criar ou manter um projeto através de testes, boas práticas de codificação, refactoring e design evolutivo.
TDC Florianópolis 2018 - Bolovo 2.0: Indo do EJB 2.0 ao Domain Driven DesignAlexandre Rodrigues
Em 2007 Phillip Calçado e Paulo Silveira apresentaram o termo Bolovo no evento JustJava para especificar a arquitetura que utilizava as classes BusinessObject (BO), LayerObject (LO), ValueObject (VO) oriundas do EJB 2.0, muito conhecido como design anêmico e que já não se vazia necessária com o JaveEE5. Onze anos se passaram e muita coisa mudou, contudo ainda encontramos a arquitetura Bolovo em novos projetos. O que estamos fazendo de errado? Como mudar?
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
Nesta palestra são abordados alguns desafios a serem enfrentados na criação de um Framework PHP open-source e também os obstáculos a serem superados para que o mesmo evolua tecnologicamente, mantendo a retrocompatibilidade e uma base de usuários ativa, fazendo o uso correto de seus conceitos.
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworksPablo Dall'Oglio
Nesta apresentação é demonstrada a evolução na maneira de programar entre as linguagens Clipper (procedural, modo texto), Delphi (Orientada a Objetos, focada em componentes, Desktop), até as linguagens Ruby e PHP, com exemplos que demonstram o uso de frameworks MVC.
Escrever código de fácil manutenção, compreensão e alto índice de testabilidade é o desafio de qualquer programador. Object Calisthenics é uma série de boas práticas que se aplicadas diariamente permitem atingir estes objetivos.
Palestra sobre utilização de design patterns em PHP. Exemplos práticos com Singleton, Facade, Adapter, Front Controller, Template View, Table Data Gateway e Active Record.
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Pablo Dall'Oglio
Nesta apresentação serão apresentados diferentes aspectos relacionados à design, manutenção segurança e performance, que influenciam a construção de ERP's com PHP. Boas práticas, Design Patterns, Facade, Adapter, Modelagem, DDD, Acoplamento, Sessões, Cache de objetos.
Projetos novos ou legados exigem da equipe muita disciplina para manter todo o código limpo e conciso. Mesmo seguindo várias técnicas e padrões, devido a nossa condição humana, estamos sujeitos a cometer falhas o que nos leva a escrever código complexo e de difícil entendimento. Há várias práticas que ajudam a amenizar e corrigir estas falhas. Fazer testes, saber como e quando fazer um refactoring são essenciais para garantir a satisfação do cliente. Esta palestra aborda pontos que ajudam a criar ou manter um projeto através de testes, boas práticas de codificação, refactoring e design evolutivo.
TDC Florianópolis 2018 - Bolovo 2.0: Indo do EJB 2.0 ao Domain Driven DesignAlexandre Rodrigues
Em 2007 Phillip Calçado e Paulo Silveira apresentaram o termo Bolovo no evento JustJava para especificar a arquitetura que utilizava as classes BusinessObject (BO), LayerObject (LO), ValueObject (VO) oriundas do EJB 2.0, muito conhecido como design anêmico e que já não se vazia necessária com o JaveEE5. Onze anos se passaram e muita coisa mudou, contudo ainda encontramos a arquitetura Bolovo em novos projetos. O que estamos fazendo de errado? Como mudar?
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
Nesta palestra são abordados alguns desafios a serem enfrentados na criação de um Framework PHP open-source e também os obstáculos a serem superados para que o mesmo evolua tecnologicamente, mantendo a retrocompatibilidade e uma base de usuários ativa, fazendo o uso correto de seus conceitos.
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworksPablo Dall'Oglio
Nesta apresentação é demonstrada a evolução na maneira de programar entre as linguagens Clipper (procedural, modo texto), Delphi (Orientada a Objetos, focada em componentes, Desktop), até as linguagens Ruby e PHP, com exemplos que demonstram o uso de frameworks MVC.
Escrever código de fácil manutenção, compreensão e alto índice de testabilidade é o desafio de qualquer programador. Object Calisthenics é uma série de boas práticas que se aplicadas diariamente permitem atingir estes objetivos.
A criação de uma loja virtual não é uma tarefa realizada apenas por desenvolvedores experientes e com um currículo extenso. Michael, que desenvolve, junto com o UOL, pacotes e soluções para a plataforma de pagamento digital PagSeguro vai mostrar isso ao vivo e a cores.
Palestra gratuita: E-commerce: mais fácil do que parece
Dia 12 de junho, das 10h às 13h
Local: Faculdade Impacta
Slides da palestra apresentada no TDC 2012 na trilha de Arquitetura - A robustez é a capacidade do sistema funcionar mesmo em condições anormais. Esta palestra prentende demonstrar algumas técnicas que podem ser usadas no desenvolvimento de software com intuito de auxiliar o desenvolvedor a produzir sistemas robustos.
Código sujo, código ruim, código feio, código mal-feito, código não orientado a objetos, código rebuscado, espaguete de código. Em duas simples palavras: código legado. Algumas dicas simples de como melhorar o seu dia-a-dia e como ganhar a confiança do seu chefe para tomar decisões nos projetos.
Como conectar programas em linguagem java a bases de dadosHenrique Fernandes
Estarei tratando aqui, como podemos utilizar a linguagem java, para acessar bancos de
dados. Os conceitos aqui discutidos, podem ser usados para criar aplicações, que acessem
diferentes base de dados, desde banco de dados relacionais, banco de dados orientados a
objetos ou até arquivos em textos plano. Utilizaremos os padrões de projeto Factory com
DAO(Data Access Object).
Palestra introdutória sobre Clean Code, ministrada na Universidade Estadual do Ceará como palestra do mês de Novembro do ciclo de palestras mensais organizadas pelo grupo PET Computação UECE.
Semelhante a Clean Code e Object Calisthenics - Aplicados no PHP (20)
10. class Report {
public function getTitle() {
return 'Report Title';
}
public function getDate() {
return '2018-01-22';
}
pulic function getContents() {
return [ 'title' => $this->getTitle(), 'date' => $this->getDate(), ];
}
public function formatJson() {
return json_encode($this->getContents());
}
}
11. class Report {
public function getTitle() {
return 'Report Title';
}
public function getDate() {
return '2018-01-22';
}
public function getContents() {
return [ 'title' => $this->getTitle(), 'date' => $this->getDate(), ];
}
}
class JsonReportFormatter {
public function format(Report $report) {
return json_encode($report->getContents());
}
14. class Logger {
public function writeTxt($message)
{
//lógica
}
public function writeCsv($message)
{
//lógica
}
}
15. class Logger {
private $writer;
public function __construct(Writer $writer) {
$this->writer = $writer;
}
public function write($message) {
$this->writer->write($message);
}
}
interface Writer {
public function write($message);
}
class Txt implements Writer {
public function write($message) { //lógica }
}
class Csv implements Writer {
public function write($message) { //lógica }
}
17. “
“Se q(x) é uma propriedade
demonstrável dos objetos x de tipo
T. Então q(y) deve ser verdadeiro
para objetos y de tipo S onde S é um
subtipo de T.”
Barbara Liskov
17
18. “
“Funções que usam ponteiros ou
referências a classes-base devem ser
capazes de usar objetos de classes
derivadas sem o saber.”
Robert C. Martin (Uncle Bob)
18
20. class T { … }
class S extends T { … }
$o1 = new T();
$o2 = new S();
function write(T $message) {
return “Ok”;
}
write($o1); // “Ok”
write($o2); // “Ok”
36. const SAQUE_TETO = 1000;
if ($saqueLimite == self::SAQUE_TETO) {
// Do Something
}
37. Métodos pequenos
▸ Devem ser pequenos e concisos
▸ “Fazer UMA e APENAS UMA coisa. Eles devem
fazer isso bem e apenas isso.”
▸ “Menor do que pequeno”
37
41. Comentários
▸ Envelhecem e mentem
▸ Não comentem código. Deixe que o GIT resolva para você!
▸ O único comentário bom é aquele que você não precisa escrever.
41
42. // Verifica se o funcionário tem direito a todos
benefícios
if (
($employee->getFlag() && self::HOURLY_FLAG)
&& ($employee->getAge() > 65)
)
51. Somente um nível de
indentação por método
Use Extract Method Pattern
51
52. public function getPromoCode(string $promoName)
{
if ($this->promoCode) {
if (false === $this->promoCodeExpired()) {
if ($this->promoName == $promoname) {
return $this->promoCode;
} else {
throw new Exception('Promoção não existe mais');
}
} else {
throw new Exception('Promoção Expirada');
}
} else {
throw new Exception('Cliente sem código de promoção');
}
}
53. public function getPromoCode(string $promoName)
{
// 1
if ($this->promoCode) {
if (false === $this->promoCodeExpired()) {
if ($this->promoName == $promoname) {
return $this->promoCode;
} else {
throw new Exception('Promoção não existe mais');
}
} else {
throw new Exception('Promoção Expirada');
}
} else {
throw new Exception('Cliente sem código de promoção');
}
}
54. public function getPromoCode(string $promoName)
{
// 1
if ($this->promoCode) {
// 2
if (false === $this->promoCodeExpired()) {
if ($this->promoName == $promoname) {
return $this->promoCode;
} else {
throw new Exception('Promoção não existe mais');
}
} else {
throw new Exception('Promoção Expirada');
}
} else {
throw new Exception('Cliente sem código de promoção');
}
}
55. public function getPromoCode(string $promoName)
{
// 1
if ($this->promoCode) {
// 2
if (false === $this->promoCodeExpired()) {
// 3
if ($this->promoName == $promoname) {
return $this->promoCode;
} else {
throw new Exception('Promoção não existe mais');
}
} else {
throw new Exception('Promoção Expirada');
}
} else {
throw new Exception('Cliente sem código de promoção');
}
}
56. public function getPromoCode(string $promoName)
{
// 1
if ($this->promoCode) {
// 2
if (false === $this->promoCodeExpired()) {
// 3
if ($this->promoName == $promoname) {
return $this->promoCode;
} else {
throw new Exception('Promoção não existe mais');
}
} else {
throw new Exception('Promoção Expirada');
}
} else {
throw new Exception('Cliente sem código de promoção');
}
}
57. public function getPromoCode(string $promoName)
{
// 1
if ($this->promoCode) {
// 2
if (false === $this->promoCodeExpired()) {
$this->getPromoExists($promoName);
} else {
throw new Exception('Promoção Expirada');
}
} else {
throw new Exception('Cliente sem código de promoção');
}
}
protected function getPromoExists(string $promoName)
{
if ($this->promoName == $promoName) {
return $this->promoCode;
} else {
throw new Exception('Promoção não existe mais');
}
}
58. public function getPromoCode(string $promoName)
{
// 1
if ($this->promoCode) {
// 2
if (false === $this->promoCodeExpired()) {
$this->getPromoExists($promoName);
} else {
throw new Exception('Promoção Expirada');
}
} else {
throw new Exception('Cliente sem código de promoção');
}
}
protected function getPromoExists(string $promoName)
{
if ($this->promoName == $promoName) {
return $this->promoCode;
} else {
throw new Exception('Promoção não existe mais');
}
}
59. public function getPromoCode(string $promoName) {
// 1
if ($this->promoCode) {
$this->getValidPromoCode($promoName)
} else {
throw new Exception('Cliente sem código de promoção');
}
}
protected function getValidPromoCode(string $promoName) {
if (false === $this->promoCodeExpired()) {
return $this->getPromoExists($promoName);
} else {
throw new Exception('Promoção Expirada');
}
}
protected function getPromoExists(string $promoName) {
if ($this->promoName == $promoName) {
return $this->promoCode;
} else {
throw new Exception('Promoção não existe mais');
}
}
60. Benefícios:
▸ S de Single Responsibility Principle
▸ Favorece reusabilidade
60
61. Não use a palavra “else”
Use early returns!
61
62. public function getPromoCode(string $promoName) {
if ($this->promoCode) {
$this->getValidPromoCode($promoName)
} else {
throw new Exception('Cliente sem código de promoção');
}
}
protected function getValidPromoCode(string $promoName) {
if (false === $this->promoCodeExpired()) {
return $this->getPromoExists($promoName);
} else {
throw new Exception('Promoção Expirada');
}
}
protected function getPromoExists(string $promoName) {
if ($this->promoName == $promoName) {
return $this->promoCode;
} else {
throw new Exception('Promoção não existe mais');
}
}
63. public function getPromoCode(string $promoName) {
if (!$this->promoCode) {
throw new Exception('Cliente sem código de promoção');
}
return $this->getValidPromoCode($promoName);
}
protected function getValidPromoCode(string $promoName) {
if ($this->promoCodeExpired()) {
throw new Exception('Promoção Expirada');
}
return $this->getPromoExists($promoName);
}
protected function getPromoExists(string $promoName) {
if ($this->promoName != $promoName) {
throw new Exception('Promoção não existe mais');
}
return $this->promoCode;
}
64. public function getPromoCode(string $promoName)
{
if ($this->promoCode) {
if (false === $this->promoCodeExpired()) {
if ($this->promoName == $promoname) {
return $this->promoCode;
} else {
throw new Exception('Promoção não existe mais');
}
} else {
throw new Exception('Promoção Expirada');
}
} else {
throw new Exception('Cliente sem código de promoção');
}
}
65. public function getPromoCode(string $promoName) {
if (!$this->promoCode) {
throw new Exception('Cliente sem código de promoção');
}
return $this->getValidPromoCode($promoName);
}
protected function getValidPromoCode(string $promoName) {
if ($this->promoCodeExpired()) {
throw new Exception('Promoção Expirada');
}
return $this->getPromoExists($promoName);
}
protected function getPromoExists(string $promoName) {
if ($this->promoName != $promoName) {
throw new Exception('Promoção não existe mais');
}
return $this->promoCode;
}
68. class Customer
{
protected $name;
protected $birthday;
public function __construct(string $name, string $birthday)
{
// Validar aqui???
$this->name = $name;
$this->birthday = $birthday;
}
}
69. // Programador que conhece a classe
$customer = new Customer('John Doe', '1983-02-10');
// Programador que não conhece a classe
// pode gerar um 0000-00-00 no Database
$customer = new Customer('John Doe', '10/02/1983');
70. class Customer
{
protected $name;
protected $birthday;
public function __construct(
CustomerName $name,
CustomerBirthday $birthday
){
$this->name = $name;
$this->birthday = $birthday;
}
}
71. // Programador que conhece a classe
$customer = new Customer(
new CustomerName('John Doe'),
new CustomerBirthday('1983-02-10')
);
// A data será formatada internamente
$customer = new Customer(
new CustomerName('John Doe'),
new CustomerBirthday('10/02/1983')
);
72. Benefícios:
▸ Type hinting
▸ Encapsulamento do código
▸ Auxilia na prevenção de código duplicado
▸ Implementação de Values Object do DDD
72
75. class Bucket {
/** @var ProductCollection */
protected $products;
// many other things...
}
class ProductCollection implements Iterator { // ... }
76. Benefícios:
▸ Single Responsible Principle
▸ Usar classes SPL
▸ Facilita agrupar em coleções sem se preocupar com o comportamento
delas
▸ Filtragem, ordenação, mapeamento são exemplos de métodos.
76
77. Um único operador de
método por linha
Com excessão de interfaces fluentes.
77
88. Mantenha suas classes
pequenas
▸ Métodos devem possuir até 20 linhas
▸ Não crie namespaces com mais de 15 arquivos
▸ Não crie classe com mais de 200 linhas
88
90. Não tenha classes com mais
de duas variáveis de instância
A comunidade PHP adota à CINCO variáveis de
instância por adaptabilidade da linguagem.
90
91. Benefícios:
▸ Alta coesão
▸ Baixo acoplamento
▸ Encapsulamento
▸ Lista de dependências mais curtas
▸ Manutenabilidade
91
92. Não use GETTERS/SETTERS
▸ Regra parcialmente relacionada ao DDD
▸ Não aplicável ao PHP devido a natureza da linguagem
92
96. Valide Object Calisthenics no
seu código
https://github.com/object-calisthenics/phpcs-calisthenics-rules
96
97. 97
“Qualquer um pode escrever um código que o
computador entenda.
Bons programadores escrevem códigos que os
humanos entendem”
Perguntas??
▸ @rafaelneris
▸ rafael.neris@totalexpress.com.br