Nunca diga nunca"
Eu não acho que seja necessariamente ruim, só é ruim se você fizer mal e abusar.
Todos nós precisamos de ferramentas e utilitários
Para começar, todos nós usamos algumas bibliotecas que às vezes são consideradas quase onipresentes e obrigatórias. Por exemplo, no mundo Java, no Google Guava ou em alguns Apache Commons ( Apache Commons Lang , Apache Commons Collections , etc ...).
Portanto, claramente há uma necessidade disso.
Evite erros de palavras duras, duplicação e introdução de erros
Se você pensar sobre estes são praticamente apenas um grande monte dessas Util
classes que você descrever, exceto que alguém passou por grandes distâncias para obtê-los (relativamente) bem, e eles têm sido tempo - testado e fortemente olho-enrolado por outros.
Então, eu diria que a primeira regra prática quando sentir vontade de escrever uma Util
classe é verificar se ela Util
realmente não existe.
O único contra-argumento que eu vi para isso é quando você deseja limitar suas dependências porque:
- você deseja limitar o espaço de memória de suas dependências,
- ou você deseja controlar rigidamente o que os desenvolvedores têm permissão para usar (acontece em equipes grandes obsessivas ou quando uma estrutura específica é conhecida por ter a classe super-ruim de evitar absolutamente em algum lugar).
Mas ambos podem ser resolvidos re-empacotando a lib usando o ProGuard ou equivalente, ou desmontando-a (para usuários do Maven , o maven-shade-plugin oferece alguns padrões de filtragem para integrar isso como parte de sua compilação).
Portanto, se estiver em uma biblioteca e corresponder ao seu caso de uso, e nenhum benchmark indicar o contrário, use-o. Se variar um pouco do que você, estenda-o (se possível) ou estenda-o ou, em último caso, reescreva-o.
Convenções de nomenclatura
No entanto, até agora nesta resposta eu os chamei de Util
s como você. Não os nomeie assim.
Dê-lhes nomes significativos. Tome o Google Guava como um (muito, muito) bom exemplo do que fazer e imagine que o com.google.guava
namespace seja realmente a sua util
raiz.
Ligue para o seu pacote util
, na pior das hipóteses, mas não para as aulas. Se lida com String
objetos e manipulação de construções de strings, chame-o de Strings
não StringUtils
(desculpe, Apache Commons Lang - eu ainda gosto e uso você!). Se fizer algo específico, escolha um nome de classe específico (como Splitter
ou Joiner
).
Teste de unidade
Se você precisar recorrer à gravação desses utilitários, faça um teste de unidade. O bom dos utilitários é que eles geralmente são componentes independentes, que recebem entradas específicas e retornam saídas específicas. Esse é o conceito. Portanto, não há desculpa para não testá-los unitariamente.
Além disso, o teste de unidade permitirá definir e documentar o contrato da API. Se os testes forem interrompidos, você alterou algo da maneira errada ou significa que está tentando alterar o contrato da sua API (ou que seus testes originais eram uma porcaria - aprenda com ele e não faça isso de novo) .
Design da API
As decisões de design que você tomará para essas APIs o seguirão por muito tempo, possivelmente. Portanto, embora não gaste horas escrevendo um Splitter
clone, tenha cuidado com a maneira como aborda o problema.
Faça a si mesmo algumas perguntas:
- Seu método utilitário justifica uma classe por si só ou é um método estático bom o suficiente, se faz sentido fazer parte de um grupo de métodos igualmente úteis?
- Você precisa de métodos de fábrica para criar objetos e tornar suas APIs mais legíveis?
- Falando em legibilidade, você precisa de uma API fluente , construtores , etc ...?
Você deseja que esses utilitários cubram uma grande variedade de casos de uso, sejam robustos, estáveis, bem documentados, seguindo o princípio da menor surpresa e sejam independentes. Idealmente, cada subpacote de seus utils, ou todo o seu pacote de utilitários, deve ser exportado para um pacote para facilitar a reutilização.
Como sempre, aprenda com os gigantes aqui:
Sim, muitos deles enfatizam coleções e estruturas de dados, mas não me diga que não é onde ou para quê você costuma implementar a maioria de seus utilitários, direta ou indiretamente.
Util
nos nomes das suas aulas. Problema resolvido.