Quelles sont les différences entre les classes Helper et Utility?

116

Comment déterminer comment appeler une classe XHelper ou XUtils?

À mon avis :

La classe d'assistance , est une classe qui peut être instanciée et effectuer un travail professionnel

La classe Utils , est une classe statique qui effectue des opérations petites et répétitives sur un type d'instance (exemple de classes utils ArrayUtils ou IOUtils d'Apache)

jakcam
la source
5
«Travail commercial» est la principale distinction ici. Je trouve que c'est une convention utile à utiliser Utilspour une classe statique qui pourrait être utilisée n'importe où dans l'organisation, ou dans une autre organisation. Une Helperclasse a un code commun qui peut être réutilisé dans un projet et a des dépendances dans le projet. Bien sûr, il n'y a pas de règle généralement acceptée, mais je trouve cela utile.
Stephen Hosking
1
@StephenHosking Votre explication est la plus convaincante pour moi et peut-être pour tout le monde. Si possible, poseriez-vous votre explication en tant que réponse réelle à ce message plutôt que de simplement laisser un commentaire.
Bigair
@Bigair. Merci, mais la mienne n'est qu'une suggestion, pas une réponse. Je suis heureux que les gens l'aient trouvé utile.
Stephen Hosking

Réponses:

102

Il existe de nombreux styles de dénomination à utiliser. Je suggérerais Utils simplement parce que c'est plus courant.

Une classe Utility est censée avoir uniquement des méthodes statiques et être sans état. Vous ne créeriez pas une instance d'une telle classe.

Un Helper peut être une classe utilitaire ou il peut être avec état ou exiger la création d'une instance. J'éviterais cela si possible.

Si vous pouvez rendre le nom plus précis. par exemple, s'il a des méthodes de tri, faites-le XSorter

Pour les tableaux, vous pouvez trouver des classes d'assistance comme

Array
Arrays
ArrayUtil
ArrayUtils
ArrayHelper

BTW un raccourci pour une classe utilitaire est une énumération sans instances

enum XUtils {;
    static methods here
}

Si vous avez besoin d'implémenter une interface, j'utiliserais un Singleton sans état.

enum XHelper implements RequiredInterface {
   INSTANCE;
   // no instance fields.
}
Peter Lawrey
la source
Je ceci dans ce post stackoverflow.com/a/2135797/787698 , que Xutils est une classe statique sans dépendances. Que pensez-vous de ça?
jakcam
@jakcam Point intéressant. Un assistant peut être avec état et nécessiter une instance. J'utiliserais une classe d'utilité sans état et sans instance si possible.
Peter Lawrey
Qu'est-ce que vous comprenez par Xutils est une classe statique sans dépendances ?
jakcam
Je ne trouve pas "xutils" ou "pas de dépendances" dans ce post.
Peter Lawrey
1
@John Dans ce cas, une méthode utilitaire n'est pas souhaitable car il est plus difficile de se moquer à des fins de test.
Peter Lawrey
16

En général? C'est entièrement arbitraire. Il n'y a pas de règles pour cela.

Jesper
la source
8

Un utilitaire est une classe "nœud feuille" d'usage général. Autrement dit, il n'a aucune dépendance dans votre projet et peut être porté de projet en projet sans se casser ni devenir inutile. Exemples: Vector3, RandomNumberGenerator, StringMatcher, etc ...

Un "assistant" semble être n'importe quelle classe dont la conception est d'aider une autre classe. Celles-ci peuvent dépendre ou non de votre projet. Si vous créez une GameNetworkClientclasse, vous pouvez dire que la GameNetworkConnectionclasse est une "aide", car elle "aide" le GameNetworkClient.

La façon dont les développeurs se réfèrent aux outils reflète l'usage courant de ces mots. Si vous vous souvenez des outils auditifs décrits comme «utiles» ou «utiles», un outil utile a tendance à avoir un certain contexte (la râpe à fromage aide à râper le fromage, le décapant à maïs aide à décaper le maïs, le chargeur rapide aide à recharger une arme à feu). On s'attend à ce qu'un "utilitaire" fonctionne dans une variété de contextes (WD-40, ruban adhésif, couteaux de l'armée, colle, lampe de poche, etc.).

James M. Lay
la source
5

Comme l'a dit Jesper, c'est entièrement arbitraire . Vous pouvez penser à ce qui fonctionne pour votre organisation et en faire la convention.

Pour moi, c'est quelque chose comme ça:

utils - Classe statique, qui peut être librement déplacée et importée n'importe où.

Faire des tâches générales qui pourraient être utiles dans différents modules. Comme l'a dit Peter Lawrey, des noms plus spécifiques sont utiles.

helper - Classe aidant une autre classe ou un module.

Les tâches qui ne sont utilisées que dans le module dans lequel il est placé et qui n'auront pas de sens d'être importées ailleurs. D'où le nom pourrait être plus spécifique - ModuleName Helper (par exemple AdministrationHelper , LoginHelper )

typhon04
la source
2

Il n'y a pas de réponse ultime à cela. Trouvez un schéma de dénomination et respectez-le. Nommer vos packages et vos classes est une partie importante de l'architecture logicielle, et personne ne peut vous retirer cette décision.

Personnellement, j'aime mieux XHelper, mais je vois XUtils plus souvent en code étranger.

J'aime aussi le schéma de dénomination "pluriel" que vous trouverez à la fois dans le JDK et dans Guava :

si une classe traite des Collectionobjets, elle est appeléeCollections

Array> Arrays (jdk)
List> Lists (goyave)
Map> Maps (goyave)

etc.

Sean Patrick Floyd
la source