Je construis des bibliothèques avec diverses petites fonctions utilitaires en C # et j'essaie de décider d'un espace de noms et d'une convention de dénomination de classe. Mon organisation actuelle est comme ceci:
Company
Company.TextUtils
public class TextUtils {...}
Company.MathsUtils
public class MathsUtils {...}
public class ArbitraryPrecisionNumber {...}
public class MathsNotation {...}
Company.SIUnits
public enum SISuffixes {...}
public class SIUnits {...}
Est-ce un bon moyen d'organiser l'espace de noms et les classes, ou existe-t-il un meilleur moyen? En particulier, il semble que le fait d'avoir le même nom dans l'espace de noms et le nom de classe (par exemple, l' Company.TextUtils
espace de noms et la TextUtils
classe) n'est qu'une duplication et suggère que le schéma pourrait être meilleur.
SISuffix
au lieu deSISuffixes
), et je pense que le singulier se lit mieux.Suffix.A
se lit comme "suffixe A". De plus, j'évite généralement de répéter les noms d'un niveau supérieur dans la hiérarchie. Autrement dit, au lieu deCompany.SIUnits.SISuffixes
, je me pencherais versCompany.SI.Suffix
etCompany.SI.Unit
Réponses:
Il est très difficile de déterminer l'efficacité de votre stratégie de nommage indépendamment du reste de votre code.
L'espace de noms devrait donner une idée de sa place dans la structure générale de votre base de code, et le nom de classe décrirait généralement le type de fonctionnalité ou de concept qu'il représente dans cette zone.
Mis à part les mises en garde, dans votre exemple spécifique, si vous êtes susceptible d'avoir beaucoup plus de classes de type «Util», j'envisagerais de les placer sous
Company.Utils.Maths
etc. un endroit naturel pour cela.la source
Il y a un bon document qui contient beaucoup de règles que vous devez suivre pour être en conformité avec Microsoft: Framework Design Guidelines .
Une chose que vous devez changer: ne nommez pas les classes comme leur espace de noms. Cela conduira à des mélanges de compilateurs. Mais ne le fais pas. Trouvez un meilleur nom pour la classe de l'espace de noms.
la source
Cela fait un moment que je n'ai pas travaillé avec C # ou l'écosystème .NET, donc je ne peux pas dire quelles sont les meilleures pratiques recommandées. Je recommanderais une modification de vos noms comme ceci:
Ce que j'ai fait ici, c'est supprimer "Utils" des noms d'espace de noms. Je pense que "Util" ne devrait pas être dans un espace de noms, car l'
Company.Text
espace de noms pourrait un jour contenir des classes qui ne sont pas des classes utilitaires de texte. L'Company.Math
espace de noms contient déjàArbitraryPrecisionNumber
ce qui ne semble pas être un "utilitaire".La suppression de "Util" de l'espace de noms élimine également toute confusion qui pourrait survenir en ayant deux choses avec le même nom (comme mentionné dans la réponse de Robert: /software//a/340440/13156 )
Une autre façon dont vous auriez pu organiser le code:
Dans ce cas, toutes les classes d'utilitaires résident dans le même espace de noms. Il n'y a plus d'
Company.Text
espace de noms puisque la seule chose qu'il y avait une classe d'utilité.Personnellement, je trouve la première option un peu plus claire.
la source
L'utilisation du même nom pour l'espace de noms et la classe à l'intérieur est problématique.
Si l'espace de noms contient plusieurs classes, pourquoi y aurait-il d'autres classes? cela ne semble pas correct, car le but du nom de l'espace de noms est de décrire toutes les classes qu'il contient , pas seulement une. Par exemple, si vous avez
JsonSerialization
,BinarySerialization
et desXmlSerialization
classes dans un espace de noms, serait - il judicieux de nommer votre espaceXmlSerialization
?Ce qui se produit généralement, c'est qu'en raison d'une extraction d'une classe à partir d'un espace de noms existant, ou d'une fusion entre plusieurs classes ou d'une autre réorganisation, vous vous retrouvez avec un espace de noms contenant une classe principale ; progressivement, des classes mineures y sont mises car elles sont légèrement liées à la classe d'origine. Par exemple, un espace de noms
LogParser
peut contenir une seule classeLogParser
, puis quelqu'un le placeLogConverter
, car il est assez lié à l'analyseur, alorsLogSearcher
, etc. Le problème ici est que le nom de l'espace de noms n'a pas été changé: dès qu'il aLogConverter
été ajouté, le le nom aurait dû être changéLogsProcessing
ou, tout simplement,Logs
.Si l'espace de noms ne contient qu'une seule classe, cela peut être le signe d'un problème au sein de l'organisation du code.
Bien que j'ai vu à quelques reprises les situations où une seule classe avec des principes SOLID appropriés était très différente de toute autre chose dans la base de code et était donc placée dans un espace de noms dédié, de tels cas sont rares. Le plus souvent, cela indique un problème. De même, rien ne vous empêche d'avoir une classe contenant une seule méthode, mais le plus souvent, ces classes indiquent un problème.
Même si votre espace de noms ne contient qu'une seule classe, il existe généralement un moyen d'être plus précis lors du nommage de la classe et plus général lors du nommage de l'espace de noms. Imaginez une application qui, entre autres, devrait à un moment donné convertir des fichiers écrits au format ABC au format DEF. La conversion ne nécessite aucune désérialisation / sérialisation vers / depuis les objets métier, et se fait en appliquant un tas d'expressions régulières suffisamment courtes pour être placées dans la classe de conversion elle-même appelée
AbcToDefConverter
. Toute la logique de conversion prend environ 80 LLOC dans une dizaine de méthodes interdépendantes - semble être une situation où il n'est absolument pas nécessaire de diviser la classe existante, ni de créer des classes supplémentaires. Étant donné que la partie restante de l'application n'a rien à voir avec les conversions, la classe ne peut pas être regroupée avec d'autres classes dans des espaces de noms existants. On crée donc un espace de noms appeléAbcToDefConverter
. Bien qu'il n'y ait rien de fondamentalement mauvais à cela, on pourrait également utiliser un nom plus générique, tel queConverters
. Dans des langages tels que Python, où des noms plus courts sont préférés et où la répétition est lancée, cela peut même devenirconverters.Abc_To_Def
.Par conséquent, utilisez des noms différents pour les espaces de noms et pour les classes qu'ils contiennent. Le nom d'une classe doit indiquer ce que fait la classe, tandis que le nom de l'espace de noms doit mettre en évidence ce qui est commun à toutes les classes qu'il contient.
Soit dit en passant, les classes d'utilité sont fausses par nature: au lieu de contenir quelque chose de spécifique, comme l'arithmétique de précision arbitraire, elles contiennent plutôt tout ce qui n'a pas trouvé son chemin dans d'autres classes . C'est tout simplement une mauvaise appellation, tout comme un
Miscellaneous
répertoire sur un ordinateur de bureau - quelque chose qui indique le manque d'organisation.La dénomination existe pour une raison: pour vous faciliter la vie lorsque vous avez besoin de trouver des choses plus tard. Vous savez que si vous avez besoin de dessiner un graphique, vous pouvez essayer de rechercher «graphique» ou «tracé». Lorsque vous devez modifier la façon dont une application génère des factures, vous recherchez «facture [e / ing]» ou «facture». De même, essayez d'imaginer un cas où vous vous direz: "hm, cette fonctionnalité devrait probablement se trouver dans misc". Je ne peux pas.
Regardez .NET Framework. La plupart de ces classes ne sont-elles pas des classes utilitaires? Je veux dire, ils ont peu de choses à voir avec le domaine des affaires. Si je travaille sur une application financière, sur un site Web de commerce électronique ou sur la plate-forme de formation de prochaine génération, sérialiser XML ou lire des fichiers ou effectuer des requêtes SQL ou effectuer des transactions est tout ce qui est utile. Cependant, ils ne sont pas appelés
UtilitySerialization
ouUtilityTransaction
et ils ne se trouvent pas dans l'Utility
espace de noms. Ils ont des noms propres, ce qui permet (et facile, merci aux développeurs .NET!) De les trouver quand j'en ai besoin.Il en va de même pour vos cours que vous réutilisez couramment dans vos applications. Ce ne sont pas des classes d'utilité. Ce sont des classes qui font certaines choses, et les choses qu'elles font devraient en fait être les noms des classes.
Imaginez que vous avez créé du code qui traite des unités et de la conversion des unités. Vous pouvez le nommer
Utility
et être détesté par vos collègues; ou vous pouvez le nommerUnits
etUnitsConversion
.la source
Math
? Je ne vois pas comment l'ajout d'unUtility
suffixe à tout nous faciliterait la vie. Lorsque vous utilisez laSystem.Math.Min()
méthode de .NET , préférez-vous vraiment écrire à laSystemUtility.MathUtility.Min()
place? Dans tous les cas, j'ai fortement modifié ma réponse, donc ça devrait être plus clair maintenant.