J'ai lu le code propre d' Oncle Bob il y a quelques mois et cela a eu un impact profond sur la façon dont j'écris le code. Même s'il semblait qu'il répétait des choses que tout programmeur devrait savoir, les mettre ensemble et les mettre en pratique donne un code beaucoup plus propre. En particulier, j'ai trouvé que diviser de grandes fonctions en plusieurs petites fonctions et diviser de grandes classes en plusieurs petites classes était extrêmement utile.
Maintenant pour la question. Les exemples du livre sont tous en Java, alors que je travaille en C ++ depuis plusieurs années. Comment les idées de Clean Code pourraient-elles s'étendre à l'utilisation d'espaces de noms, qui n'existent pas en Java? (Oui, je connais les packages Java, mais ce n'est pas vraiment pareil.)
Est-il judicieux d'appliquer l'idée de créer de nombreuses petites entités, chacune avec une responsabilité clairement définie, aux espaces de noms? Un petit groupe de classes liées doit-il toujours être enveloppé dans un espace de noms? Est-ce le moyen de gérer la complexité d'avoir beaucoup de classes minuscules ou le coût de la gestion de nombreux espaces de noms serait-il prohibitif?
Edit: Cette entrée Wikipedia contient des réponses sur les principes de package .
Réponses:
(Je n'ai pas lu Clean Code et je ne connais pas beaucoup Java.)
Oui, comme pour le refactoring dans plusieurs classes et plusieurs fonctions.
Sans répondre réellement: oui, vous devriez au moins utiliser un espace de noms de premier niveau. Cela peut être basé sur le projet, l'organisation, ou ce que vous voulez, mais l'utilisation de quelques noms globaux réduira les conflits de noms. Un seul espace de noms pour regrouper tout le reste ne contient qu'un seul nom global. (Sauf les fonctions externes "C", mais cela est dû à l'interopérabilité du C et n'affecte que les autres fonctions externes "C".)
Un petit groupe de classes liées doit-il être enveloppé dans un espace de noms qui leur est dédié? Probablement. Surtout si vous utilisez un préfixe commun pour ces classes - FrobberThing, FrobberThang, FrobberDoohickey - vous devriez envisager un espace de noms - frobber :: Thing, etc. Ce serait toujours sous votre espace de noms racine ou un autre espace de noms s'ils font partie d'un projet plus grand.
En prenant l'exemple ci-dessus de noms préfixés, il n'est pas plus difficile de gérer frobber :: Thing que FrobberThing. Cela peut même être plus facile avec certains outils, tels que la documentation et la complétion de code. Il existe une différence avec ADL, mais cela peut jouer en votre faveur: moins de noms dans les espaces de noms associés rendent ADL plus facile à comprendre, et vous pouvez utiliser des déclarations pour injecter des noms spécifiques dans un ou plusieurs espaces de noms.
Les alias d'espaces de noms vous permettent d'utiliser un nom plus court pour un espace de noms plus long dans un contexte spécifique, ce qui facilite encore une utilisation:
Considérez Boost, qui ne possède qu'un seul espace de noms racine, boost, puis de nombreux espaces de sous-noms - boost :: asio, boost :: io, boost :: système de fichiers, boost :: tuples, etc. - pour différentes bibliothèques. Certains noms sont "promus" dans l'espace de noms racine:
La plus grande différence par rapport aux langues avec de "vrais" modules réside dans le fait qu’il est courant d’utiliser une structure plus plate, ce qui se produit principalement parce que c’est ainsi que cela fonctionne à moins que vous ne preniez un effort supplémentaire et spécifique pour définir des noms imbriqués.
la source
Vous devriez avoir un espace de noms principal pour tout votre code. Cela le distingue du code externe en ce qui concerne les espaces de noms.
Dans votre espace de noms principal, en fonction de la taille et de la complexité, vous pouvez ouvrir des sous-espaces de noms. C'est là que les noms signifient clairement quelque chose dans un contexte et que les mêmes noms peuvent être utilisés dans un contexte différent.
En particulier, si vous avez un nom générique, comme FileInfo, qui signifie quelque chose de particulier dans un contexte, placez-le dans un espace de noms.
Vous pouvez également utiliser une classe pour cela, bien qu'une classe ne soit pas extensible, vous ne pouvez donc pas ajouter de nouvelles déclarations à la classe sans modifier son en-tête.
la source
Les espaces de noms n'est pas un concept de module, je ne les utiliserais donc qu'en cas de conflit de noms.
la source
Java a des espaces de noms, ils ne s'appellent pas vraiment comme ça. In
javax.swing.*
javax
est un espace de noms etswing
est un sous-espace de noms. Je n'ai pas lu le livre pour savoir ce qu'il dit sur les paquets java, mais les mêmes principes s'appliqueraient assez directement aux espaces de noms dans toutes les langues.Une bonne heuristique consiste à utiliser un espace de noms lorsque vous souhaitez taper le même préfixe pour les classes, encore et encore. Par exemple, j'ai récemment écrit des classes appelées OmciAttribute, OmciAlarm, OmciMe, etc.
la source
J'aime les espaces de noms profonds (ce qui signifie généralement trois niveaux).
Selon la situation, il se peut que j'aie encore un niveau
la source