Quali sono le differenze tra le classi Helper e Utility?


116

Come determinare come chiamare una classe XHelper o XUtils?

Alla mia mente :

Classe di supporto , è una classe che può essere istanziata e svolgere un lavoro di lavoro

La classe Utils , è una classe statica che esegue operazioni piccole e ripetitive su una sorta di istanza (esempio di classi utils ArrayUtils o IOUtils da Apache)


5
"Lavoro aziendale" è la distinzione chiave qui. Trovo che sia una convenzione utile da utilizzare Utilsper una classe statica che potrebbe essere utilizzata ovunque nell'organizzazione o in un'altra organizzazione. Una Helperclasse ha un codice comune che può essere riutilizzato all'interno di un progetto e ha dipendenze all'interno del progetto. Ovviamente non esiste una regola generalmente accettata, ma la trovo utile.
Stephen Hosking

1
@StephenHosking La tua spiegazione è la più convincente per me e forse per tutti. Se possibile, pubblicheresti la tua spiegazione come risposta effettiva a questo post piuttosto che lasciare un commento.
Bigair

@Bigair. Grazie, ma il mio è solo un suggerimento, non una risposta. Sono contento che le persone lo abbiano trovato utile.
Stephen Hosking

Risposte:


102

Esistono molti stili di denominazione da utilizzare. Suggerirei Utils solo perché è più comune.

Si ritiene che una classe Utility abbia solo metodi statici ed è senza stato. Non creeresti un'istanza di tale classe.

Un Helper può essere una classe di utilità oppure può essere con stato o richiedere la creazione di un'istanza. Lo eviterei se possibile.

Se puoi rendere il nome più specifico. ad esempio, se ha metodi di ordinamento, rendilo XSorter

Per gli array puoi trovare classi helper come

Array
Arrays
ArrayUtil
ArrayUtils
ArrayHelper

A proposito, una mano breve per una classe di utilità è un'enumerazione senza istanze

enum XUtils {;
    static methods here
}

Se è necessario implementare un'interfaccia, utilizzerei un Singleton senza stato.

enum XHelper implements RequiredInterface {
   INSTANCE;
   // no instance fields.
}

Ho questo in questo post stackoverflow.com/a/2135797/787698 , che xutils è una classe statica senza dipendenze. A cosa stai pensando?
jakcam

@jakcam Punto interessante. Un helper potrebbe essere stateful e richiedere un'istanza. Se possibile, userei una classe di utilità senza stato e senza istanze.
Peter Lawrey

Cosa intendi per Xutils è una classe statica senza dipendenze ?
jakcam

Non riesco a trovare "xutils" o "no dependencies" in quel post.
Peter Lawrey

1
@ John In quel caso un metodo di utilità non è desiderabile poiché è più difficile da deridere a scopo di test.
Peter Lawrey

16

In generale? È del tutto arbitrario. Non ci sono regole per questo.


8

Un'utilità è una classe di "nodo foglia" di uso generale. Cioè, non ha dipendenze nel tuo progetto e può essere portato da progetto a progetto senza interruzioni o diventare inutili. Esempi: Vector3, RandomNumberGenerator, StringMatcher, ecc ...

Un "aiutante" sembra essere una classe il cui progetto è di aiutare un'altra classe. Questi possono o meno dipendere dal tuo progetto. Se stai creando una GameNetworkClientclasse, potresti dire che la GameNetworkConnectionclasse è un 'aiutante', perché "aiuta" il file GameNetworkClient.

Il modo in cui gli sviluppatori si riferiscono agli strumenti riflette l'uso comune di queste parole. Se riesci a ricordare gli strumenti acustici descritti come "utili" o "utili", uno strumento utile tende ad avere un certo contesto (la grattugia aiuta a grattugiare il formaggio, lo stripper del mais aiuta a spogliare il mais, lo speed loader aiuta a ricaricare un'arma da fuoco). Una "utility" dovrebbe funzionare in una varietà di contesti (WD-40, nastro adesivo, coltelli militari, colla, torcia elettrica, ecc ...).


5

Come ha detto Jesper, è del tutto arbitrario . Puoi pensare a ciò che funziona per la tua organizzazione e renderlo la convenzione.

Per me è qualcosa del genere:

utils - Classe statica, che può essere spostata e importata liberamente ovunque.

Esecuzione di attività generali che potrebbero essere utili in diversi moduli. Come ha detto Peter Lawrey, i nomi più specifici sono utili.

helper - Classe che aiuta un'altra classe o un modulo.

Attività che vengono utilizzate solo nel modulo in cui è posizionato e non hanno senso importarle altrove. Quindi il nome potrebbe essere più specifico: ModuleName Helper (ad esempio AdministrationHelper , LoginHelper )


2

Non c'è una risposta definitiva per questo. Trova uno schema di denominazione e seguilo. Assegnare un nome ai pacchetti e alle classi è una parte importante dell'architettura software e nessuno può portarti via questa decisione.

Personalmente mi piace di più XHelper, ma vedo XUtils più spesso in codice straniero.

Mi piace anche lo schema di denominazione "plurale" che troverai sia in JDK che in Guava :

se una classe si occupa di Collectionoggetti, si chiamaCollections

Serie
> Elenco matrici (jdk) > Liste (guava)
Mappa> Mappe (guava)

eccetera.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.