Mai dire mai"
Non penso che sia necessariamente un male, è un male solo se lo fai male e lo abusi.
Tutti abbiamo bisogno di strumenti e utilità
Per cominciare, tutti usiamo alcune librerie che a volte sono considerate quasi onnipresenti e indispensabili. Ad esempio, nel mondo Java, Google Guava o alcuni degli Apache Commons ( Apache Commons Lang , Apache Commons Collections , ecc ...).
Quindi è chiaramente necessario per questi.
Evita errori di parola, duplicazione e presentazione di bug
Se si pensa a questi sono praticamente solo un grande mucchio di queste Util
classi che lei descrive, tranne qualcuno ha attraversato tutto per farli (relativamente) a destra, e sono stati tempo - testati e pesantemente eye-balled da altri.
Quindi direi che la prima regola empirica quando si sente il prurito di scrivere una Util
classe è controllare che la Util
classe in realtà non esiste già.
L'unico contro-argomento che ho visto è quando vuoi limitare le tue dipendenze perché:
- vuoi limitare il footprint di memoria delle tue dipendenze,
- o vuoi controllare attentamente ciò che gli sviluppatori possono usare (succede in grandi gruppi ossessivi, o quando un particolare framework è noto per avere la strana classe super schifosa da evitare assolutamente da qualche parte).
Ma entrambi questi possono essere affrontati reimballando la libreria usando ProGuard o un equivalente, o smontandolo da soli (per gli utenti di Maven , il plug-in maven-shade offre alcuni schemi di filtro per integrarlo come parte della build).
Quindi, se è in una lib e corrisponde al tuo caso d'uso e nessun benchmark ti dice diversamente, usalo. Se varia un po 'da quello che si è, estenderlo (se possibile) o estenderlo, o in ultima istanza riscriverlo.
Convenzioni di denominazione
Tuttavia, finora in questa risposta li ho chiamati Util
come te. Non chiamarli così.
Dai loro nomi significativi. Prendi Google Guava come (molto, molto) buon esempio di cosa fare e immagina che lo com.google.guava
spazio dei nomi sia in realtà la tua util
radice.
Chiama il tuo pacchetto util
, nel peggiore dei casi, ma non le classi. Se si tratta di String
oggetti e manipolazione di costrutti di stringa, chiamatelo Strings
, non StringUtils
(scusate, Apache Commons Lang - Mi piacciono ancora e vi uso!). Se fa qualcosa di specifico, scegli un nome di classe specifico (come Splitter
o Joiner
).
Unità-Test
Se devi ricorrere a scrivere queste utility, assicurati di testarle. La cosa positiva delle utility è che di solito sono componenti piuttosto autonomi, che accettano input specifici e restituiscono output specifici. Questo è il concetto. Quindi non ci sono scuse per non testarli.
Inoltre, i test unitari ti permetteranno di definire e documentare il contratto della loro API. Se i test falliscono, o hai cambiato qualcosa nel modo sbagliato, o significa che stai cercando di cambiare il contratto dell'API (o che i tuoi test originali erano una schifezza: impara da esso e non farlo di nuovo) .
Progettazione API
Le decisioni di progettazione che prenderai per queste API ti seguiranno a lungo, possibilmente. Quindi, mentre non trascorri ore a scrivere una Splitter
clone, fai attenzione a come affronti il problema.
Ponetevi alcune domande:
- Il tuo metodo di utilità garantisce una classe da solo o è abbastanza buono un metodo statico, se ha senso far parte di un gruppo di metodi altrettanto utili?
- Hai bisogno di metodi di fabbrica per creare oggetti e rendere più leggibili le tue API?
- A proposito di leggibilità, hai bisogno di un'API fluente , di costruttori , ecc ...?
Volete che questi programmi di utilità coprano un'ampia gamma di casi d'uso, che siano robusti, stabili, ben documentati, seguendo il principio della minima sorpresa e che siano autonomi. Idealmente, ogni sotto-pacchetto dei tuoi programmi di utilità, o almeno l'intero pacchetto di programmi di utilità, deve essere esportabile in un pacchetto per un facile riutilizzo.
Come al solito, impara dai giganti qui:
- Passa attraverso questi, quindi analizza e confronta, e torna spesso da loro per farlo di nuovo (nota che non sto dando alcun giudizio sul fatto che questi siano assolutamente o parzialmente buoni o cattivi, l'enfasi è sul bit di analisi e confronto ) :
- Guarda How to Design a Good API and Why Matters ( slide ) di Josh Bloch .
- Leggi e guarda del materiale Bloch aggiuntivo:
- Leggi le questioni di progettazione API .
Sì, molti di questi hanno un'enfasi su raccolte e strutture di dati, ma non dirmi che non è dove o cosa di solito è probabile che implementi la maggior parte dei tuoi programmi di utilità, direttamente o indirettamente.
Util
nei nomi delle tue classi. Problema risolto.