¿Cuáles son las diferencias entre las clases Helper y Utility?

116

¿Cómo determinar cómo llamar a una clase XHelper o XUtils?

En mi mente:

Helper class , es una clase que se puede instanciar y hacer algunos trabajos comerciales

La clase Utils , es una clase estática que realiza operaciones pequeñas y repetitivas en una especie de instancia (ejemplo de clases de utils ArrayUtils o IOUtils de Apache)

jakcam
fuente
5
El "trabajo comercial" es la distinción clave aquí. Me parece una convención útil Utilspara una clase estática que podría utilizarse en cualquier lugar de la organización o en otra organización. Una Helperclase tiene un código común que se puede reutilizar dentro de un proyecto y tiene dependencias dentro del proyecto. Por supuesto, no existe una regla generalmente aceptada, pero me parece útil.
Stephen Hosking
1
@StephenHosking Tu explicación es la más persuasiva para mí y quizás para todos. Si es posible, publicaría su explicación como una respuesta real a esta publicación en lugar de simplemente dejar un comentario.
Bigair
@Bigair. Gracias, pero la mía es solo una sugerencia, no una respuesta. Me alegro de que la gente lo haya encontrado útil.
Stephen Hosking

Respuestas:

102

Hay muchos estilos de nombres para usar. Sugeriría Utils solo porque es más común.

Se entiende que una clase de utilidad solo tiene métodos estáticos y no tiene estado. No crearía una instancia de tal clase.

Un ayudante puede ser una clase de utilidad o puede tener estado o requerir la creación de una instancia. Evitaría esto si fuera posible.

Si puede hacer el nombre más específico. por ejemplo, si tiene métodos de clasificación, conviértalo en XSorter

Para matrices, puede encontrar clases auxiliares como

Array
Arrays
ArrayUtil
ArrayUtils
ArrayHelper

Por cierto, una mano corta para una clase de utilidad es una enumeración sin instancias

enum XUtils {;
    static methods here
}

Si necesita implementar una interfaz, usaría un Singleton sin estado.

enum XHelper implements RequiredInterface {
   INSTANCE;
   // no instance fields.
}
Peter Lawrey
fuente
En esta publicación , stackoverflow.com/a/2135797/787698 , que Xutils es una clase estática sin dependencias. ¿Qué estás pensando en eso?
jakcam
@jakcam Punto interesante. Un ayudante podría tener estado y requerir una instancia. Usaría una clase de utilidad sin estado y sin instancia si es posible.
Peter Lawrey
¿Qué entiende por Xutils que es una clase estática sin dependencias ?
jakcam
No puedo encontrar "xutils" o "no dependencias" en esa publicación.
Peter Lawrey
1
@John En ese caso, un método de utilidad no es deseable ya que es más difícil simularlo con fines de prueba.
Peter Lawrey
16

¿En general? Es completamente arbitrario. No hay reglas para esto.

Jesper
fuente
8

Una utilidad es una clase de "nodo hoja" de uso general. Es decir, no tiene ninguna dependencia en su proyecto y se puede portar de un proyecto a otro sin romperse o volverse inútil. Ejemplos: Vector3, RandomNumberGenerator, StringMatcher, etc ...

Un "ayudante" parece ser cualquier clase cuyo diseño es ayudar a otra clase. Estos pueden o no depender de su proyecto. Si está creando una GameNetworkClientclase, podría decir que la GameNetworkConnectionclase es un 'ayudante', porque "ayuda" al GameNetworkClient.

La forma en que los desarrolladores se refieren a las herramientas refleja el uso común de estas palabras. Si puede recordar las herramientas auditivas descritas como "útiles" frente a "útiles", una herramienta útil tiende a tener algún contexto (el rallador de queso ayuda a rallar el queso, el pelador de maíz ayuda a pelar el maíz, el cargador rápido ayuda a recargar un arma de fuego). Se espera que una "utilidad" funcione en una variedad de contextos (WD-40, cinta adhesiva, navajas, pegamento, linterna, etc.).

James M. Lay
fuente
5

Como dijo Jesper, es completamente arbitrario . Puede pensar en lo que funciona para su organización y convertirlo en convención.

Para mí, es algo como esto:

utils : clase estática, que se puede mover e importar libremente a cualquier lugar.

Realización de tareas generales que puedan ser de utilidad en diferentes módulos. Como dijo Peter Lawrey, los nombres más específicos son útiles.

helper - Clase que ayuda a otra clase o módulo.

Tareas que solo se utilizan en el módulo en el que se encuentra y no tienen sentido importarlas en otro lugar. Por lo tanto, el nombre podría ser más específico: ModuleName Helper (por ejemplo , AdministrationHelper , LoginHelper )

typhon04
fuente
2

No hay una respuesta definitiva para esto. Encuentra un esquema de nomenclatura y cúmplelo. Nombrar sus paquetes y clases es una parte importante de la arquitectura del software, y nadie puede quitarle esa decisión.

Personalmente, me gusta más XHelper, pero veo XUtils con más frecuencia en código extranjero.

También me gusta el esquema de nomenclatura en "plural" que encontrarás tanto en el JDK como en Guava :

si una clase trata con Collectionobjetos, se llamaCollections

Array> Arrays (jdk)
Lista> Listas (guava)
Mapa> Mapas (guava)

etc.

Sean Patrick Floyd
fuente