J'y ai pensé il y a un moment et cela a récemment refait surface alors que ma boutique fait sa première vraie application Web Java.
En guise d'introduction, je vois deux stratégies principales de dénomination des packages. (Pour être clair, je ne fais pas référence à toute la partie 'domain.company.project', je parle de la convention de package en dessous.) Quoi qu'il en soit, les conventions de dénomination de package que je vois sont les suivantes:
Fonctionnel: Nommer vos packages en fonction de leur fonction architecturale plutôt que de leur identité en fonction du domaine métier. Un autre terme pour cela pourrait être la dénomination selon «couche». Ainsi, vous auriez un package * .ui et un package * .domain et un package * .orm. Vos emballages sont des tranches horizontales plutôt que verticales.
C'est beaucoup plus courant que la dénomination logique. En fait, je ne crois pas avoir jamais vu ou entendu parler d'un projet qui fait cela. Cela me rend bien sûr méfiant (un peu comme si vous pensiez que vous avez trouvé une solution à un problème de NP) car je ne suis pas très intelligent et je suppose que tout le monde doit avoir de bonnes raisons de le faire comme il le fait. D'un autre côté, je ne suis pas opposé au fait que les gens manquent simplement l'éléphant dans la pièce et je n'ai jamais entendu d'argument réel pour nommer les paquets de cette façon. Cela semble être la norme de facto.
Logique: Nommez vos packages en fonction de leur identité de domaine professionnel et placez chaque classe liée à cette tranche verticale de fonctionnalités dans ce package.
Je n'ai jamais vu ou entendu parler de cela, comme je l'ai déjà mentionné, mais cela a beaucoup de sens pour moi.
J'ai tendance à aborder les systèmes verticalement plutôt qu'horizontalement. Je veux entrer et développer le système de traitement des commandes, pas la couche d'accès aux données. Évidemment, il y a de bonnes chances que je touche à la couche d'accès aux données dans le développement de ce système, mais le fait est que je ne pense pas de cette façon. Ce que cela signifie, bien sûr, c'est que lorsque je reçois un ordre de modification ou que je veux implémenter une nouvelle fonctionnalité, ce serait bien de ne pas avoir à pêcher dans un tas de packages afin de trouver toutes les classes associées. Au lieu de cela, je regarde juste dans le package X parce que ce que je fais a à voir avec X.
Du point de vue du développement, je vois comme une victoire majeure que vos packages documentent votre domaine d'activité plutôt que votre architecture. J'ai l'impression que le domaine est presque toujours la partie du système qui est la plus difficile à gérer, car l'architecture du système, en particulier à ce stade, devient presque banale dans sa mise en œuvre. Le fait que je puisse arriver à un système avec ce type de convention de dénomination et instantanément à partir de la dénomination des paquets sache qu'il traite des commandes, des clients, des entreprises, des produits, etc. semble sacrément pratique.
Il semble que cela vous permettrait de tirer un bien meilleur parti des modificateurs d'accès de Java. Cela vous permet de définir beaucoup plus clairement les interfaces en sous-systèmes plutôt qu'en couches du système. Donc, si vous avez un sous-système de commandes que vous voulez être persistant de manière transparente, vous pourriez en théorie ne jamais laisser rien d'autre savoir qu'il est persistant en n'ayant pas à créer d'interfaces publiques vers ses classes de persistance dans la couche dao et à la place de conditionner la classe dao dans avec seulement les classes dont il s'occupe. Évidemment, si vous souhaitez exposer cette fonctionnalité, vous pouvez lui fournir une interface ou la rendre publique. Il semble que vous en perdiez beaucoup en ayant une tranche verticale des fonctionnalités de votre système réparties sur plusieurs packages.
Je suppose qu'un inconvénient que je peux voir est que cela rend l'extraction des couches un peu plus difficile. Au lieu de simplement supprimer ou renommer un package, puis d'en déposer un nouveau avec une technologie alternative, vous devez entrer et modifier toutes les classes de tous les packages. Cependant, je ne vois pas que ce soit un gros problème. Cela peut être dû à un manque d'expérience, mais je dois imaginer que le nombre de fois où vous échangez des technologies est pâle par rapport au nombre de fois que vous entrez et modifiez des tranches de fonctionnalités verticales dans votre système.
Donc, je suppose que la question vous serait posée, comment nommez-vous vos colis et pourquoi? Veuillez comprendre que je ne pense pas nécessairement que je suis tombé sur l'oie d'or ou quelque chose ici. Je suis assez nouveau dans tout cela avec une expérience principalement académique. Cependant, je ne peux pas repérer les trous dans mon raisonnement alors j'espère que vous le pourrez tous pour que je puisse passer à autre chose.