Tiny Types

Enquanto eu resolvia o primeiro desafio de expressividade que postei no VidaGeek.net, me deparei com uma situação comum para programadores Java.

Eu precisava que a classe java.lang.String fosse capaz de fazer coisas (como inverter a string) que ela não é.

A solução mais comum seria criar uma classe Strings (seguindo o padrão da java.util.Collections) que conteria o comportamento.

Daí para usá-la, seria da seguinte forma:


Strings.inverte(suaString);

O problema é que isso espalha o comportamento que deveria pertencer à String (que não temos como alterar).

Ao invéz de solucionar o problema dessa forma, resolvi usar um Tiny Type para encapsular essa string (chamei de BinaryString).

Essa BinaryString é capaz de se inverter, além de eu poder dar os nomes que eu quiser para os métodos (deixando mais expressivo).

Mas a maior vantagem de ter usado esse Tiny Type é que ele me abriu possibilidades que não existiam no código sem ele e eu mudei completamente a solução que pretendia criar. A nova solução ficou (na minha opnião) mais elegante e expressiva.

Se tiverem maior interesse sobre Tiny Types, eu escrevi sobre o assunto aqui e tem um post do Darren Hobbs que é onde eu entrei em contato com o assunto.

Além disso, no nosso novo treinamento Scrum Developer Skills, vários assuntos relacionados à expressividade são abordados, incluindo Tiny Types.

jabreu

4 Comments

  1. Gostei da idéia.
    Não tem jeito. Se quisermos expressividade em java temos que apelar para este tipo de solução. Mas creio que isto é o último passo para quem busca expressividade. Na minha opinião, apenas com um bom refactory de nomes de classes e métodos já iríamos melhorar muito a expressividade de nossos sistemas.

    Muito bom o post.
    Abraços
    Marcelo

  2. @Marcelo

    Com certeza. Apenas pensar bem antes de dar os nomes já aumenta absurdamente a expressividade do código. Mas não sei se é o último passo. Muitas vezes ele pode ser um passo necessário para podermos dar nomes as coisas (ao invéz de passar strings de um lado para o outro).

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *