Boas práticas de desenvolvimento 2
Autor: Pedro Ribeiro | Publicado: 2016-01-11T12:09:00-08:00



Olá pessoal.

Já faz um bom tempo que eu não escrevo por aqui, mas quem é vivo sem aparece.

Pretendo dar continuidade em um&nbsp;post&nbsp;antigo que falo sobre boas práticas no momento de escrever seu código.

Let's go!


1ª&nbsp;boa prática de hoje: Argumentos não mudam de estado.

Quando trabalhamos com funções ou métodos, é normal termos argumentos, como abaixo:


&lt;?php

function yourMethod($argument1) 
{
    // your code here
}




Nesse exemplo temos o método "yourMethod" que recebe o "$argument1" como argumento.

Dentro desse método não mude o valor/estado desse argumento. Dessa maneira não importa em que lugar dentro do método você está usando essa variável, ela sempre estará como o mesmo estado de entrada.
Com isso você não precisa se preocupar em saber se a variável foi alterada ou não dentro do método/função. Com essa abordagem garantimos a integridade.


2ª boa prática: Uma operação por linha

Ao fazer operações no seu código, não acumule operações na mesma linha, exemplo:


&lt;?php

$variable = function1(function2(function3()));





Isso complica muito a leitura e o entendimento. Uma melhor abordagem seria como abaixo:


&lt;?php

$variable1 = function1();
$variable2 = function2($variable1);
$variable3 = function3($variable2);





Como esse exemplo é hipotético as funções e variéveis estão como péssimos nomes, mas no seu código use nomes que melhor expresse a sua regra de negócio.



3ª boa prática: Métodos estáticos em contexto estático









Quando trabalhamos com orientação a objetos, normalmente criamos métodos, mas diversas vezes não usamos o contexto correto para eles. O de instância ou estático.

Quando criamos um método que não depende da instância, ele deve ser estático. Vamos ao exemplo que mostra exatamente essa falha:


&lt;?php

class Force
{
    private $hiddenPower;

    public function readMind()
    {
        $this-&gt;hiddenPower-&gt;read();
    }

    public function getDefinition()
    {
        return "Well, the Force is what gives a Jedi his power. ".
        "It's an energy field created ".
        "by all living things. It surrounds us and penetrates us; ".
        "it binds the galaxy together.";
    }
}

class Jedi
{
    /**
     * @var Force
     */
    private $force;

    /**
     * Jedi constructor.
     *
     * @param Force $force
     */
    public function __construct(Force $force)
    {
        $this-&gt;force = $force;
    }

    public function getTheForceDefinition()
    {
        return $this-&gt;force-&gt;getDefinition();
    }
}

$force = new Force();
$jedi = new Jedi($force);
$jedi-&gt;getTheForceDefinition();





A classe "Jedi" recebe no seu construtor uma instância de "Force" e tem um método chamado "getTheForceDefinition" que retorna uma explicação sobre A Força. Mas esse método usa a instância de "Force" para isso.

Se observarmos a classe "Force", podemos ver que ela tem um método "getDefinition". E aqui está o nosso GRANDE detalhe. Esse método não depende de nada da instância. Ele simplesmente retorna uma String que sempre é a mesma. Isso quer dizer que o resultado não muda de instância para instância.

Então concluímos que esse método deveria ser ESTÁTICO \o/.
A solução correta já com a alteração seria assim:


&lt;?php

class Force
{
    private $hiddenPower;

    public function readMind()
    {
        $this-&gt;hiddenPower-&gt;read();
    }

    public static function getDefinition()
    {
        return "Well, the Force is what gives a Jedi his power. ".
               "It's an energy field created ".
               "by all living things. It surrounds us and penetrates us; ".
               "it binds the galaxy together.";
    }
}

class Jedi
{
    /**
     * @var Force
     */
    private $force;

    /**
     * Jedi constructor.
     *
     * @param Force $force
     */
    public function __construct(Force $force)
    {
        $this-&gt;force = $force;
    }

    public function getTheForceDefinition()
    {
        return Force::getDefinition();
    }
}

$force = new Force();
$jedi = new Jedi($force);
$jedi-&gt;getTheForceDefinition();





Por enquanto é isso pessoal. Ainda tenho muitas outras boas prática para mostrar, mas esse post fica por aqui. Espero ter contribuído!

Abraço e até a próxima!