1
resposta

Decorators como helpers

Estou habituado a programar em PHP e é costume criar classes que chamamos de "Helpers" onde colocamos métodos que serão "auxiliares", que serão úteis em mais de um local e que não irão possuir um "dono" por assim dizer.

Como por exemplo, poderíamos criar um Helper retornoEmCaixaAlta() e chamá-lo dentro dos métodos passando o retorno. algo como: return Helper::retornoEmCaixaAlta(varRetorno);

vejo que como Decorator poderia atingir o mesmo objetivo.

Não sei se fui claro, mas minha duvida seria se a ideia do decorator seria essa mesma de servir como um helper.

1 resposta

Não sou desenvolvedora PHP e não sei vou conseguir ajudar esclarecer esse ponto, porém, até onde eu entendi os Decorators do TypeScript se referem não apenas a uma funcionalidade, mas também a uma forma de implementar o Padrão de Projeto Decorator.

Sobre o Padrão de Projeto Decorator temos, na Wikipedia:

Decorator, wrapper (ou em português Decorador), é um padrão de projeto de software que permite adicionar um comportamento a um objeto já existente em tempo de execução, ou seja, agrega dinamicamente responsabilidades adicionais a um objeto. Decorators oferecem uma alternativa flexível ao uso de herança para estender uma funcionalidade, com isso adiciona-se uma responsabilidade ao objeto e não à classe.

O que casa muito bem com que encontramos na documentação do TypeScript a respeito dessa funcionalidade:

With the introduction of Classes in TypeScript and ES6, there now exist certain scenarios that require additional features to support annotating or modifying classes and class members. Decorators provide a way to add both annotations and a meta-programming syntax for class declarations and members. [...] A Decorator is a special kind of declaration that can be attached to a class declaration, method, accessor, property, or parameter. Decorators use the form @expression, where expression must evaluate to a function that will be called at runtime with information about the decorated declaration.

Pensando nesses pontos e dando uma pesquisada, vi que o PHP implementa algo semelhante aos Decorators do TS, mas que tem o nome de Annotations. Segundo a documentação do PHP:

Annotation** is a form of syntactic metadata that can be added to source code. Annotations can be embedded in and read using reflection mechanism. Annotations are known from Java or so-called Attributes in C# and can be retained by VM at **run-time and read via reflection. Annotations can be placed in classes, methods, properties and functions. [...] Which can be used to annotate classes, properties, methods and functions. They look similar to new object instantiation but there is a wide range of inhibitions. Annotations can have named and/or unnamed parameters, they're name can be imported using use statement same way as class names but the place they're declared must use @ prefix. The same as instantiating new object parenthesis is not obligatory if there are no parameters to pass. Unnamed parameters must exist at the beginning of parameters list and they must meet constructor parameter requirements.

Acredito que o que temos de mais próximo de Helpers em JS/TS é Utils, onde ficam as funções ou métodos utilitários que podem ser utilizados em vários pontos do código. Não regra e já encontrei ambos em projetos.

Não sei ajudei ou se te deixei mais confusa, mas talvez o professor do curso possa esclarecer um pouco mais esse ponto para você. Vou deixar alguns links que possam te interessar e conhecer mais sobre o assunto:

  1. Padrão de Projeto Decorator
  2. TS - Decorators
  3. PHP Annotations - Mágica ou puramente código?
  4. Using the Decorator Design Pattern in PHP: esse ensina a implementar o padrão Decorator sem Annotations
  5. Documentação PHP - Annotations