DEV Community

Discussion on: Programação procedural orientada a classes - Parte 2

Collapse
raphaeldasilva profile image
Raphael da Silva • Edited on

Eu não conhecia o conceito de indireção, isso ajuda muito a identificar classes que são só wrappers que não adicionam nada.

Sobre os helpers genéricos, geralmente isso é algo que anda acompanhado com código estático, pois são funções agrupadas em classes. Escrevi um post sobre código estático e acoplamento e o exemplo que uso é uma dessas classes genéricas cheia de funções (sem estado).

Antes eu achava código estático algo sempre ruim (o que é uma postura bem inflexível), hoje vejo que depende do contexto, pois vejo que factorys estáticas adicionam legibilidade em construtores e tem seu valor para criar entidades e value objects.

Um lugar onde vejo uso de método estático é em value objects, pois dá para adicionar lebilidade com funções que ajudam (quase como helpers) só que dentro de um contexto que não é genérico, por exemplo:

<?php

namespace Domain\ValueObject;

/**
 *
 * @author Raphael da Silva
 *
 */
class Fullname
{

    private $firstName;
    private $lastName;

    public function __construct(
        string $firstName,
        string $lastName
    ){

        $this->firstName = $firstName;
        $this->lastName  = $lastName;

    }

    public static function upperCaseFirstChar(string $name): string
    {

        return ucfirst($name);

    }

    public function getFirstName(): string
    {

        return self::upperCaseFirstChar($this->firstName);

    }

    public function getLastName(): string
    {

        return self::upperCaseFirstChar($this->lastName);

    }

    public function getFullname(): string
    {

        return $this->getFirstName() . ' ' . $this->getLastName();

    }
}

Nesse caso o método estático que usei tem o propósito só de dar mais legibilidade e contexto a função usada pelo value object.

Collapse
cviniciussdias profile image
Vinicius Dias Author

Ótima contribuição, Raphael. Mas nesse seu caso eu teria uma classe Name que cuidaria de ter a primeira letra maiúscula. Isso vai de encontro com o estudo de "Obsessão por tipos primitivos". Talvez eu escreva um artigo ou faça um vídeo sobre isso no futuro.

Collapse
cviniciussdias profile image
Vinicius Dias Author • Edited on

Acabei de ver que sua classe já é a representação de um nome. No seu caso, concordo com sua implementação. Só deixaria esse método estático privado, talvez. Mas realmente, acredito que você tenha colocado o método no melhor lugar possível sim. :-D Ótimo exemplo!

Thread Thread
raphaeldasilva profile image
Raphael da Silva • Edited on

Obrigado pelo feedback, Vinicius. Eu já troquei uma ideia com você via e-mail sobre o uso de DTO's no qual eu tinha dúvidas sobre o propósito desse padrão.

Sobre o código estático, eu acabei vendo que não é problemático o uso de métodos estáticos em casos assim, o propósito é aqui foi dar contexto e legebilidade, pois o método em questão torna mais nítido (ou óbvio) o objetivo da função nativa ucfirst nesse contexto de nomes.

Pensei agora que o nome do método poderia até ser mais descritivo ainda (upperCaseFirstCharFromName, por exemplo) para reforçar isso. Essa abordagem fez sentido para mim em value objects como esse, achei válido compartilhar.

Valeu!