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.
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
@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).
Se me permite uma sugestão, de uma olhada na API Commons Lang da Apache, a classe StringUtils contém muitas automatizações, incluindo o método reverse. See http://commons.apache.org/lang/api-2.5/org/apache/commons/lang/StringUtils.html#reverse(java.lang.String)
Abraço.
Poderia fazer uso da StringBuilder, que trabalha com objetos mutáveis e possui o método para reverter String (reverse())