Oi, Você teria 1 minuto para falar de

Object Calisthenics

"Programe como eu Digo, mas não Como eu Faço"

Alguem Famoso

Alessandro Feitoza

Pusque ter boas práticas?

Pusque ter boas práticas?

Pra não viver perigosamente!

Pra saber o que tá fazendo!

Pra ter um código confiável

Pro código dar "serto"

Não ter um código sobrecarregado

Pra não ter que apagar incêndio

debaixo dágua

Então...

Object Calisthenics

Termo derivado do grego "Exercicio"

  • Dá pra ler

  • Pra testar

  • Dá tesão

8 regras

Regra 0

Somente 1 nível de endentação por método

Regra 0: Somente 1 nível de indentação por método

<?php
    
class Util
{
    public function menu ($role) 
    {
        
        if (isset( $this->options[$role] )) {
            foreach ($this->options[$role] as $key => $item {
                if ( is_array($item) ) {
                    foreach ($item as $sub_item) {
                        ...
                    }  
                } 
            }
        }
    }
}

Regra 0: Somente 1 nível de indentação por método

<?php
    
class Util
{
    public function menu ($role) 
    {
        
        if (isset( $this->options[$role] )) {
            foreach ($this->options[$role] as $key => $item {
                if ( is_array($item) ) {
                    foreach ($item as $sub_item) {
                        ...
                    }  
                }
            }
        }
    }
}

0

1

2

3

Regra 0: Somente 1 nível de indentação por método

<?php
    
class Util
{
    public function menu ($role) 
    {
        if ( !isset( $this->options[$role] )) {
            return false;
        }

        foreach ($this->options[$role] as $key => $item {
            if ( is_array($item) ) {
                foreach ($item as $sub_item) {
                    ...
                }  
            }
        }
    }
}

0

0

1

2

Regra 0: Somente 1 nível de indentação por método

<?php
    
class Util
{
    public function menu ($role) 
    {
        if ( !isset( $this->options[$role] )) {
            return false;
        }

        foreach ($this->options[$role] as $key => $item {
            if ( ! is_array($item) ) {
                ...
                continue;
            }            

            foreach ($item as $sub_item) {
                ...
            }  
        }
    }
}

0

0

1

1

Regra 1

Não use ELSE

Regra 1: Não use ELSE

<?php
    
class Auth
{
    public function login ($email, $password) 
    {
        if ($email == '') {
            return false;
        } else { 
            if ($password == '') {
                return false;
            } else {
                if ($log = $this->searchUserByEmail($email) {
                    if ($log->password == $password) {
                        ...
                    } else {
                        throw new Exception ('Senha Incorreta');
                    }
                } else {
                    throw new Exception ('Usuário não encontrado');
                }
            }
        }
    }
}

Regra 1: Não use ELSE

<?php
    
class Auth
{
    public function login ($email, $password) 
    {
        if ($email == '' && $password == '') {
            return false;
        } else { 
            if ($log = $this->searchUserByEmail($email) {
                if ($log->password == $password) {
                    ...
                } else {
                    throw new Exception ('Senha Incorreta');
                }
            } else {
                throw new Exception ('Usuário não encontrado');
            }
        }
    }
}

Regra 1: Não use ELSE

<?php
    
class Auth
{
    public function login ($email, $password) 
    {
        if ($email == '' && $password == '') {
            return false;
        }

        if ($log = $this->searchUserByEmail($email) {
            if ($log->password == $password) {
                ...
            } else {
                throw new Exception ('Senha Incorreta');
            }
        } else {
            throw new Exception ('Usuário não encontrado');
        }
    }
}

Regra 1: Não use ELSE

<?php
    
class Auth
{
    public function login ($email, $password) 
    {
        if ($email == '' && $password == '') {
            return false;
        }

        $log = $this->searchUserByEmail($email);
        
        if (! $log ) {
            throw new Exception ('Usuário não encontrado');
        }

        if ($log->password == $password) {
            ...
        } else {
            throw new Exception ('Senha Incorreta');
        }
    }
}

Regra 1: Não use ELSE

<?php
    
class Auth
{
    public function login ($email, $password) 
    {
        if ($email == '' && $password == '') {
            return false;
        }

        $log = $this->searchUserByEmail($email);
        
        if (! $log ) {
            throw new Exception ('Usuário não encontrado');
        }

        if ($log->password != $password) {
            throw new Exception ('Senha Incorreta');
        }
        
        ...
    }
}

Regra 2

Um único '->' por linha

Regra 2: Um único '->' por linha

<?php
    
class UserDAO
{
    public function searchUserByEmail ($email) 
    {
        $select = new Select('tb_user');
        $select->from(['email', 'name', 'password'])->where(['email' => $email])->limit(1);
    }
}

Regra 2: Um único '->' por linha

<?php
    
class UserDAO
{
    public function searchUserByEmail ($email) 
    {
        $select = new Select('tb_user');
        $select
            ->from(['email', 'name', 'password'])
            ->where(['email' => $email])
            ->limit(1);
    }
}

Regra 3

Não use nomes curtos.

Não Abrevie.

Regra 3: Não Abrevie

<?php
    
class User
{
    public function qtd () 
    {
        ...
    }

    public function delUs ()
    {
        ...
    }
}

Regra 3: Não Abrevie

<?php
    
class User
{
    public function totalUsers () 
    {
        ...
    }

    public function deleteUser ()
    {
        ...
    }
}

Regra 4

Métodos com apenas 1 responsabilidade

Regra 4: Métodos com apenas 1 responsabilidade

<?php
    
class User
{
    public function createUserAndAddToGroup (User $user) 
    {
        
    }
}

Regra 4: Métodos com apenas 1 responsabilidade

<?php
    
class User
{
    public function createUser (User $user) 
    {
        ...
    }

    public function addToGroup ($userId)
    {
        ...
    }
}

Regra 5

Limite o número de atributos de uma classe

Regra 5: Limite o número de atributos de uma classe

<?php
    
class UserLogged
{
    private $name;
    private $email;
    private $password;
    private $config;
    private $permission;
    private $menu;
}

Regra 5: Limite o número de atributos de uma classe

<?php
    
class UserLogged
{
    private $name;
    private $email;
    private $password;
}

Regra 6

Classes pequenas e objetivas

Regra 6: Classes pequenas e objetivas

  • Máximo de 200 linhas
  • 10 métodos
  • 20 linhas por método
  • 1 responsabilidade

Regra 7

Use set() concientemente

Regra 7: Use set() concientemente

<?php
    
class EmailSended
{
    private $numberClicks;

    public function setNumberClicks($newClicks)
    {
        $this->numberClicks = $newClicks;
    }

    public function getNumberClicks()
    {
        return $this->numberClicks;
    }
}
<?php
    
class EmailSended
{
    private $numberClicks;

    public function addClick()
    {
        $this->numberClicks++;
    }

    public function getNumberClicks()
    {
        return $this->numberClicks;
    }
}

Regra 7: Use set() concientemente

Referências

  • http://pt.slideshare.net/guilhermeblanco/php-para-adultos-clean-code-e-object-calisthenics
  • http://williamdurand.fr/2013/06/03/object-calisthenics/
  • https://github.com/object-calisthenics/phpcs-calisthenics-rules

Dúvidas?

O que mais estudar?

Padrões de Projeto

E padroes arquiteturais

DRY

Dont Repeat Yourself

KISS

Keep It Simple, Stupid

SOLID

  • Single Responsibility Principle
  • Open Closed Principle
  • Liskov Substitution Principle
  • Interface Segregation Principle
  • Dependency Inversion Principle

O Básico

  • SCRUM/Agilidade
  • HTML
  • CSS
  • SASS/SCSS
  • Git
  • Javascript
  • Lógica
  • ReactJS
  • NodeJS/ExpressJS
  • Banco de Dados
  • Testes Automatizados
  • Typescript
  • NextJS
  • outra linguagem de backend
  • DevOps
  • QA
  • DevSecOps

Valeu o boi!

eu@alessandrofeitoza.eu

slides.com/alessandrofeitoza

www.alessandrofeitoza.eu

phpcomrapadura.org

Você teria 1 minuto para falar de Object Calisthenics

By Alessandro Feitoza

Você teria 1 minuto para falar de Object Calisthenics

  • 2,183