151 votes

Convention de dénomination des classes utilitaires en Java

Lors de l'écriture de classes utilitaires en Java, quelles sont les bonnes directives à suivre ?

Les paquets doivent-ils être "util" ou "utils" ? Est-ce que c'est ClassUtil ou ClassUtils ? Quand une classe est-elle un "Helper" ou un "Utility" ? Utility ou Utilities ? Ou bien utilisez-vous un mélange des deux ?

La bibliothèque standard de Java utilise à la fois Utils et Utilities :

  • javax.swing.Utilities
  • javax.print.attribute.AttributeSetUtilities
  • javax.swing.plaf.basic.BasicGraphicsUtils

Apache utilise une variété d'utilitaires et d'utilitaires, mais surtout des utilitaires :

  • org.apache.commons.modeler.util.DomUtil
  • org.apache.commons.modeler.util.IntrospectionUtils
  • org.apache.commons.io.FileSystemUtils
  • org.apache.lucene.wordnet.AnalyzerUtil
  • org.apache.lucene.util.ArrayUtil
  • org.apache.lucene.xmlparser.DOMUtils

Spring utilise beaucoup de classes Helper et Utils :

  • org.springframework.web.util.UrlPathHelper
  • org.springframework.core.ReflectiveVisitorHelper
  • org.springframework.core.NestedExceptionUtils
  • org.springframework.util.NumberUtils

Alors, comment nommer vos classes d'utilité ?

120voto

Jay Points 14781

Comme pour beaucoup de conventions de ce type, l'important n'est pas tant de savoir quelle convention vous utilisez que de l'utiliser de manière cohérente. Par exemple, si vous avez trois classes d'utilitaires et que vous les appelez CustomerUtil, ProductUtils et StoreUtility, les autres personnes qui essaient d'utiliser vos classes vont constamment s'embrouiller et taper CustomerUtils par erreur, devoir le chercher, vous maudire plusieurs fois, etc. (J'ai entendu une fois une conférence sur la cohérence où l'orateur avait mis une diapositive montrant un plan de son discours avec trois points principaux, étiquetés "1", "2nd" et "C").

Ne faites jamais, au grand jamais, deux noms qui ne diffèrent que par une subtilité orthographique, comme avoir un CustomerUtil et un CustomerUtility. S'il y avait une bonne raison de créer deux classes, alors il doit y avoir quelque chose de différent à leur sujet, et le nom devrait au moins nous donner un indice de cette différence. Si l'une contient des fonctions utilitaires liées au nom et à l'adresse et l'autre des fonctions utilitaires liées aux commandes, alors appelez-les CustomerNameAndAddressUtil et CustomerOrderUtil ou quelque chose comme ça. Je deviens régulièrement fou lorsque je vois des différences subtiles et insignifiantes dans les noms. Par exemple, hier encore, je travaillais sur un programme qui comportait trois champs pour les frais de transport, nommés "freight", "freightcost" et "frght". J'ai dû étudier le code pour comprendre quelle était la différence entre les trois.

15 votes

Et IV pour le numéro 4 :-) -- Mais quoi était la différence entre fret , coût du fret y peur ?

8 votes

@KayMagnus Ce post date d'il y a plus d'un an, mais si je me souviens bien, l'un d'eux était le coût de fret actuel sur l'enregistrement, avant de modifier le contenu de la commande et donc potentiellement le coût de fret ; un autre était le coût de fret standard tiré d'un tableau ; et le troisième était un coût calculé utilisé dans certains cas particuliers, comme les expéditions à l'étranger. Pourquoi n'ont-ils pas pu au moins les appeler, disons, "currFreight", "stdFreight" et "calcFreight". Cela aurait au moins donné une idée.

1 votes

Ok, merci pour l'explication :-) Un exemple intéressant de code bizarre, je pense

41voto

ring bearer Points 8369

Il n'y a pas de règle/convention standard dans le monde Java pour cela. Cependant, je préfère ajouter "s" à la fin du nom de la classe comme @colinD l'a mentionné.

Cela semble assez standard pour ce qui Josh Bloch, maître concepteur d'API java, fait ( collection java ainsi que collection google)

En ce qui concerne les Helper et les Util, j'appellerai quelque chose un Helper lorsqu'il possède des API qui aident à réaliser une fonctionnalité spécifique d'un paquet (en considérant un paquet comme l'implémentation d'un module) ; alors qu'un Util peut être appelé dans n'importe quel contexte.

Par exemple, dans une application liée aux comptes bancaires, toutes les API statiques utilitaires spécifiques à un numéro seraient placées sur le site suivant org.mycompany.util.Numbers

Toutes les API d'aide à l'application des règles commerciales spécifiques aux "comptes" seraient destinées à l'adresse suivante

org.mycompany.account.AccountHelper

Après tout, il s'agit de fournir une meilleure documentation et un code plus propre.

5 votes

Cela semble raisonnable, que Helper soit plus spécifique que Utils.

1 votes

Oui, j'aime cette approche, c'est plus logique.

3 votes

Le lien est cassé. J'ai trouvé un autre .

27voto

ColinD Points 48573

J'aime la convention qui consiste à ajouter "s" au nom du type lorsque celui-ci est une interface ou une classe que vous ne contrôlez pas. Voici quelques exemples de cette convention dans le JDK Collections y Executors . C'est également la convention utilisée dans Google Collections.

Quand vous avez affaire à un classe dont vous avez le contrôle, je dirais que les méthodes utilitaires appartiennent à la classe elle-même en général.

2 votes

Google Guava utilise également ce modèle

13voto

Aito Points 3311

Je pense que "utils" devrait être le nom du paquet. Les noms des classes devraient spécifier le but de la logique qu'elles contiennent. Ajouter le sufix -util(s) est redondant.

3 votes

Ce ne serait pas la bonne chose à faire dans un paquet par caractéristique approche.

1 votes

@jpangamarca L'article que vous avez cité contient un paquet "util" dans l'exemple de "paquet par fonctionnalité". Je pense qu'en pratique, une sorte de fonctionnalité/couche util ne peut souvent pas être évitée.

1 votes

@kapex Un oubli de l'auteur je suppose. A tld.organization.app.util ne devraient pas exister (pourraient, mais ne devraient pas), un nombre quelconque de tld.organization.app.feature.util sont parfaits.

3voto

KSwift87 Points 194

Je suis presque sûr que les mots "aides" et "utilitaires" sont utilisés de manière interchangeable. Quoi qu'il en soit, à en juger par les exemples que vous avez fournis, je dirais que si votre nom de classe est une abréviation (ou contient des abréviations comme "DomUtil"), alors appelez votre paquet "whatever.WhateverUtil" (ou Utils s'il y a plus d'un utilitaire dans votre paquet). Sinon, s'il a un nom complet au lieu d'une abréviation, alors appelez-le "whatever.WhateverUtilities".

C'est à vous de voir, mais tant que les codeurs savent de quoi vous parlez, vous pouvez y aller. Cependant, si vous faites ce travail professionnellement pour quelqu'un, demandez-lui quelles sont ses normes de codage avant de suivre mon conseil. Respectez toujours les normes du magasin, quoi qu'il arrive, car cela vous aidera à conserver votre emploi :-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X