RORO Pattern

26/03/2019 • Raphael Kieling Tondin

beer

Logo que comecei a trabalhar na empresa (em 2018) que estou hoje utilizando PHP, eu via um tanto de funções assim:

// Anything file.php
$this->save(false);
$this->getAll(false);
Person->getName(true, false);

Agora vai a pergunta de um milhão de dólares. Que porra é esse false e true que tá sendo passado por parâmetro, o que elas fazem? Vamos melhorar isto logo em seguida.

Sumário

Pré-requisitos

Entender o que é o destructuring. Não vou reinventar.

O que é?

RORO ou Receive an object, return an object sendo traduzido para Receba um objeto, retorne um objeto. É um pattern que se utiliza de algo MUITO legal no javascript, o destructuring. Este artigo foi baseado em um artigo em inglês do Bill Sourour que achei muito foda e deixei ali nas referências caso queira dar uma olhada.

    // No
    let save = (person, returnSaved) => {
        // logic to save, generated pessoaSaved
        if(returnSaved) return pessoaSaved;
    }

    save(personInstance, false);

    // Yeah!
    let save = ({ person, returnSaved=true }) => {
        // logic to save, generated pessoaSaved
        if(returnSaved) return pessoaSaved;
    }

    save({ 
        person: personInstance,
        returnSaved: true
    });

Caramba, muito mais claro não acha? Isso traz algumas vantagens como:

  • Parâmetros nomeados
  • Parâmetros default mais limpos
  • Valores retornados mais ricos
  • Facil pra fazer composição de funções (será abordado em outro artigo sobre composição)

Parâmetros nomeados

    // No
    function getAll(active, role, withJob){...}
    getAll(true, false, true); // Ai complica... que tal

    // Yeah!
    function getAll({ active, role, withJob }){...}
    getAll({ 
        active: true,
        withJob: false
    }); // Ai ficou show!!

Pera ai. Tu viu que eu esqueci de passar withJob na ultima função? Brincadeira, isso ai foi gancho pro outro tópico hehe

Parâmetros Defaults

O destructuring nos da possibilidade de passar o que a gente quiser! Isto porque ele vai tentar encaixar o que ele tá mandando com o que a função está pedindo, melhor ainda ele também vai colocar valores defaults caso tu não mande alguns parâmetros necessários como:

    let save = ({ person, active = true }) => {...}
    save({ person: new Person() })

Então já que mandamos só person o parâmetro active já vai iniciar como true!

Valores mais ricos

Auto explicativo:

    // No
    let save = ({ person, active }) =>{
        return true;
    }

    // Yeah!
    let save = ({ person, active }) =>{
        // logic to save in database
        return {
            operation: 'INSERT',
            saved: personSavedReturn,
            success: true 
        }
    }

Finalizando

O pattern é muito útil, acho meio óbvio mas vou reforçar... ele é um pattern pra te ajudar a resolver problemas, não é preciso fazer isto em TODO lugar a TODO momento em TODO caso. Exemplo:

    let isNumber = ({ value }) => ...

Precisa mesmo passar um { value: 2 }?, acho que não.

Até a próxima

Referências