Php

Interfaces Fluentes no PHP

Como criar Interfaces Fluentes em PHP, possibilitando um código fácil de ser entendido, mantido e modificado por outras pessoas?

Background Image

Esses dias estava conversando com um grande colega programador sobre a carência do comando With no PHP e pensei: como criar essa função usando Interfaces Fluentes.

Ontem, em mais uma das minhas noites de insônia, tive a idéia de simular o comando With com umas das melhores práticas de legibilidade de código: Fluents Interfaces, ou Interfaces Fluentes.

O que são interfaces Fluentes?

asphalt balance blur close up
Photo by Pixabay on Pexels.com

Interfaces Fluentes são interfaces de programação (ou conjunto de métodos) que usam uma sintaxe “fluent” para permitir a chamada de vários métodos de forma encadeada. Isso é feito para tornar a programação mais clara e legível, além de aumentar a expressividade do código.

Por exemplo, em vez de chamar vários métodos de forma encadeada:

obj.setName("John");
obj.setAge(30);
obj.setAddress("123 Main St");

Você pode chamá-los usando uma sintaxe fluente:

obj.setName("John").setAge(30).setAddress("123 Main St");

Isso é especialmente útil em casos em que os métodos estão relacionados de alguma forma e então precisam ser chamados em uma ordem específica.

Alguns exemplos de biblioteca que utilizam interfaces fluentes são :

  • Apache commons-configuration
  • Google Guava
  • Java 8, com o pacote java.util.stream

Esse conceito é usado em várias linguagens de programação como Java, C#, Python, etc.

Primeiro Passo: Falando de Interface Fluentes e PHP

Acredito que para muitos o termo “Interfaces Fluentes” não é novidade alguma. Mas, para quem não conhece, trata-se de uma maneira mais intuitiva de construir suas classes.

Como a implementação de POO no PHP4 era deficiente (leia-se precária) não era possível a prática de Interfaces Fluentes graças à seguinte limitação: no PHP4 você não consegue criar uma referência direta ao objeto através do retorno dos seus próprios métodos.

Mas no PHP5 e sua OO totalmente reescrita, eis que tudo (ou quase) se fez novo. Agora, como a deficiência acima foi suprida, podemos facilmente fazer referencia direta ao objeto retornado por um dos seus próprios métodos.

Só para exemplificar:

// Classe que retorna a própria referencia em todos os métodos
class escreveONomeCompletoUsandoInterfaceFluente {

   public function escreveNome( $str ) {
      // Escreve um nome qualquer
      echo( $str );

      // Retorna a referencia do próprio objeto
      return $this;
   }

   public function escreveSobreNome( $str ) {
      // Escreve um sobrenome qualquer
      echo( $str );

      // Retorna referencia ao próprio objeto
      return $this;
   }

}

Ao ler a classe de exemplo acima, você notará que eu sempre retorno o próprio objeto. Pois bem imaginemos uma possível utilização NORMAL da classe acima:

$escreveNomeCompleto = new escreveONomeCompletoUsandoInterfaceFluente();
$escreveNomeCompleto->escreveNome('Pedro');
$escreveNomeCompleto->escreveSobreNome('Mendes');

Porém, como eu estou retornando o próprio objeto nos métodos da classe criada, a implementação Fluente do código seria a seguinte:

$escreveNomeCompleto = new escreveONomeCompletoUsandoInterfaceFluente();
$escreveNomeCompleto->escreveNome('Pedro')->escreveSobreNome('Mendes');

Desta forma, esta criada uma implementação simples das Fluents Interfaces no PHP. Como você pode perceber, a idéia central é você encadear a chamada dos seus métodos da seguinte forma: $objeto->metodo1()->metodo2()->metodo3()->…->metodofinal(); ao invés de ficar chamando o objeto a cada vez que você queira chamar um método.

Segundo Passo: Aplicando o conceito de Interfaces Fluentes para alcançar o conceito de With

Em algumas linguagens você tem o comando With, que funcionada da seguinte forma:

With instanciaDoObjeto

metodoUm();
metodoDois();
metodoTres();

End With;

Com isso, você fornece a instância do objeto e simplesmente trabalha com seus atributos e/ou métodos dentro do bloco criado, diminuindo o código a ser escrito e deixando-o mais limpo.

No PHP eu não achei nada que criasse o With diretamente, mas com o conceito de Interfaces Fluentes, o mesmo código acima poderia ficar da seguinte forma:

$instanciaDoObjeto
->metodoUm();
->metodoDois();
->metodoTres();

Pronto! Esta criado o conceito do With com uma estrutura mais aprimorada.

A importância da legibilidade de código

woman sitting while operating macbook pro
Photo by Christina Morillo on Pexels.com

A programação de códigos legíveis é importante porque torna o código mais fácil de entender, manter e modificar por outras pessoas.

Isso pode incluir outros desenvolvedores que trabalham no mesmo projeto, ou pessoas que precisam dar manutenção no código no futuro.

Códigos legíveis também são mais fáceis de depurar e testar, o que pode ajudar a evitar erros e problemas no futuro. Além disso, códigos legíveis podem ajudar a melhorar a colaboração e a comunicação entre os membros de um time de desenvolvimento.