nom de package sémantiquement plus approprié que `util` les choses suivantes?

18

En tant que épouvantail considérer l'ensemble , java.utilil est un dépotoir pour les différentes catégories qui , dans la plupart des cas ne rien partager dans d' autres communes que la personne qui les placent était paresseux ou sans inspiration pour trouver un nom de package plus sémantiquement approprié pour leur classe.

Pour ne citer qu'un exemple, prenons la classe UUIDce qui aurait été un nom de package sémantiquement approprié pour cette classe?

Je travaille à la mise en œuvre ma UUIDclasse pour être plus léger. Je ne veux pas utiliser me.myproject.util.UUIDmon nom de package.

Je considérais , me.myproject.rfc4122.UUIDmais cela ne signifie pas la sémantique de l'utilisation UUID.

Je considérais aussi me.myproject.uuid.UUIDmais je ne aimez pas la tautologie que, même si elle est une approche populaire en Python pour placer une classe dans un module du même nom, et packagesen Java ne sont pas sémantiquement équivalents à modulesen Python.

J'ai aussi considéré puis me.myproject.UUIDrejeté parce que je ne veux pas polluer cette partie de l'espace de nom avec des choses qui ne sont pas liées. Cette juste déplace le problème d'un niveau.

Je également considéré , me.myproject.lib.UUIDmais cela n'a pas de sens plus sémantique que .utilet renomme juste le problème.

semantics: La branche de la linguistique et la logique concernées par un sens .


la source
Et alors me.myproject.UUID? Oume.UUID
Robert Harvey
Pour moi, quelque chose comme from me.myproject.uuid import UUID, GetUUIDInfoOK de regard. Il pourrait y avoir plus d'une chose exportée dans un module.
9 000
2
JXTA a un packages « d'identité » pour des choses à faire avec les identifiants.
greg-449
@ greg-449 - Je me penche vers identityou identifiersmettre votre proposition avec un peu plus d' explications en guise de réponse , il sera probablement été acceptées.

Réponses:

11

Le problème avec essayer de mettre chaque classe dans un package qui a un nom sémantiquement correct pour cette classe est que cela a tendance à conduire à des packages qui contiennent très peu de classes, ou parfois même une seule classe.

Garder les trucs fréquemment utilisés que vous savez toujours où les rassembler en un seul endroit les garde à l'écart et facilite donc la recherche des trucs les plus rarement utilisés. Ainsi, vous n'avez pas vraiment besoin de noms de packages sémantiquement corrects pour chacune des classes qu'ils contiennent, vous avez juste besoin de noms de packages qui ne sont pas sémantiquement incorrects. Évidemment, le nom du package 'util' a été choisi selon cette ligne de pensée: ce n'est pas le nom sémantiquement correct pour les classes qu'il contient, mais ce n'est pas non plus sémantiquement incorrect, et c'est assez bien.

Donc, si ce type UUID est à toi est destiné à être utilisé uniquement par cette demande spécifique, (comme le prouve le fait que vous envisagez de le mettre sous « myproject »), il est peut-être partie du « modèle » de votre projet. Vous devriez déjà avoir un package « modèle », contenant l'ensemble de toutes les classes qui correspondent à vos entités persistantes, dont beaucoup ont peut-être leurs relations, avec UUID étant peut-être le moyen de mettre en oeuvre ces relations. De plus, votre UUID peut-être Comment savent se persistent, non? Et aussi, votre UUID peut probablement trouver les membres de votre entités modèle, non? Ainsi, votre package modèle est peut-être le meilleur endroit pour elle.

Dans le cas contraire, si ce type UUID de la vôtre peut être utilisé dans d'autres projets aussi, il doit être considéré comme partie d'un cadre. Ainsi, il peut vivre dans le dossier source racine de ce framework, ou dans certains sous-packages 'types' comme l'a suggéré MainMa, ou même dans certains sous-packages de ce framework appelés 'util' ou 'misc'. Aucun problème avec ça.

Mike Nakis
la source
2
Veuillez essayer de limiter les commentaires dans les réponses qui n'ajoutent pas vraiment à l'utilité de la réponse. La section des commentaires est réservée à ces avis de non-responsabilité. Je vous remercie.
maple_shaft
1

Le but des packages est de regrouper les classes selon certains critères (package par type / couche vs package par fonctionnalité, etc.).

Je pense aussi que le nom de package « util » est pas totalement dénuée de sens - il seulement les groupes des classes par un critère de spécifiques - pour moi « util » moyen de classe qui ne fait pas partie du domaine de la demande, mais il est pas non plus une partie de la cadre (il n'a pas d'influence la structure de la demande). Il est fondamentalement juste une extension de la bibliothèque standard (non).

Dans ce cas, je ne voudrais pas avoir un problème avec mettre cette classe UUID dans « util » package. If there will be some other UUID-related utility classes (like separate class for generating UUIDs), it's easy to refactor and create "util.uuid" package for them (unless you're creating a library and UUID will be part of exposed interface , alors vous devez être un peu "avant-gardiste").

qbd
la source
1
Ceci est mon approche. Il n'a pas de sens pour créer un package qui n'a pas un objectif clair. Si une classe ne peut pas être facilement affectée à un ensemble significatif puis « util » est très bien et peut - être même préféré. En général ce qui se passe que vous allez le long est que les classes assez finissent dans util qui sont liées et elles sont faciles à factoriser de util (au moins au cours du développement) en lots significatifs.
trempent
@Dunk, qui est en fait un très bon point - avant maturité création de la structure de package assez artificielle vous empêcher de voir mieux, organisation plus naturel le long du chemin.
1

Oncle Bob a des directives sur la séparation de package.

Les trois principes de premier paquet sont sur la cohésion de package, ils nous disent ce qu'il faut placée à l'intérieur des paquets:

  1. Le granule de réutilisation est le granule de la libération
  2. Les classes qui changements ensemble font partis
  3. Les cours utilisés sont emballés ensemble

Alors, répondre à votre question, qui / ce qui va utiliser la classe UUID, ont comme un attribut ou invoquer des opérations en elle? Comment est votre graphe de dépendance ? UUID est utilisé avec ce que d' autres classes ?

En fonction de votre réponse, peut - être vous devriez appeler le me.myproject.identity package, le me.myproject.serialization package, me.myproject. DTO ou même quelque chose d' autre. Peut - être, la classe UUID doit être maintenu avec vos modèles et vous mettre dans un ensemble que vous avez déjà, comme me.myproject.models .

Hbas
la source
1
dtoest à peu près aussi inutile que sémantiquement libou utils, tout le dtoconcept est un anti-modèle naïf du milieu des années 90, modeltombe dans la même catégorie de généralisation inutile aussi bien
Nous ne connaissons pas assez votre projet pour vous donner des noms plus utiles
Hbas
-2

Tout d'abord, l'UUID (en majuscules) me semble être une très mauvaise idée pour le nom de package ou le nom de classe, de tous les styles appliqués d'une manière ou d'une autre, tous les noms en majuscules sont associés aux "constantes".

  • vous pouvez choisir de séparer les classes par leur valeur bussines, par exemple com.example.identifier;
  • ou par leur intérêt technique, par exemple com.example.uuid.

Garder les simples IT

Tiberiu C.
la source
2
Des exemples de classes AllCaps en Java: java.util.UUID, java.net.URL, java.util.zip.CRC32, etc.
scriptEntrée
@scriptin Ce ne serait pas plus facile pour un développeur s'il pouvait différencier simplement du style caps une classe de "constant", un membre d'un nom de package et ainsi de suite? Pourquoi pensez - vous que CRC32, UUID est un bon nom pour une classe, juste parce que Java a fait? Ou parce qu'il est un acronyme de « identificateur unique universel » ou « contrôle de redondance cyclique » ... mais attendez un peu! Qu'est - ce que cette java.util.zip.GZIPOutputStreamclasse? GZIPest synonyme de ... ? there is also a java.util.zip.ZipOutputStream`
Tiberiu C.
1
Les classes sont des types, les constantes sont des valeurs, il n'y a pas de confusion. Je ne pense pas que les noms sont bonnes ou mauvaises, je signale simplement que (codage) styles que vous évoquez n'imposent pas aux classes d'avoir des lettres minuscules. En Python UUIDest également en majuscules.
scriptin
Si vous voyez / code mantenir tous les jours, le style de ce qui fait la différence entre un « facile à lire » et « revenir en arrière et en avant » fiesta, isoler ici juste pour le style d'extrémité, je pense que c'est plus intéressant pour exprimer par les bouchons, le type de l'élément (classe, constant, colis, etc.) que le fait que est un acronyme.
Tiberiu C.
1
UUID sémantiquement n'est pas différent de Uuid, uuid, UuId, UuID, ou tout autre schéma de capitalisation arbitraire que vous pensez être "le meilleur".
Brandin