Question

Quel est le nombre idéal de classes par espace de nommage " branche " ;? À quel moment déciderait-on de diviser un espace de noms en plusieurs? Ne discutons pas du groupement logique des classes (supposons qu'elles soient correctement groupées logiquement), je suis, à ce stade, concentré sur le nombre de classes maintenables ou non maintenables.

Était-ce utile?

La solution

" 42? Non, ça ne marche pas ... "

Ok, mettons nos prouesses en matière de programmation au travail et voyons l'opinion de Microsoft:

# IronPython
import System
exported_types = [
  (t.Namespace, t.Name)
  for t in System.Int32().GetType().Assembly.GetExportedTypes()]

import itertools
get_ns = lambda (ns, typename): ns
sorted_exported_types = sorted(exported_types, key=get_ns)
counts_per_ns = dict(
  (ns, len(list(typenames)))
  for ns, typenames
  in itertools.groupby(sorted_exported_types, get_ns))
counts = sorted(counts_per_ns.values())

print 'Min:', counts[0]
print 'Max:', counts[-1]
print 'Avg:', sum(counts) / len(counts)
print 'Med:',
if len(counts) % 2:
  print counts[len(counts) / 2]
else: # ignoring len == 1 case
  print (counts[len(counts) / 2 - 1] + counts[len(counts) / 2]) / 2

Et cela nous donne les statistiques suivantes sur le nombre de types par espace de noms:

C:\tools\nspop>ipy nspop.py
Min: 1
Max: 173
Avg: 27
Med: 15

Autres conseils

Avec les IDE modernes et d'autres outils de développement, je dirais que si toutes les classes appartiennent à un espace de noms, il n'y a pas de nombre arbitraire sur lequel vous devez diviser un espace de noms uniquement pour des raisons de maintenabilité.

Je pense qu'un espace de noms devrait être aussi grand que nécessaire. S'il existe une raison logique de créer un espace de noms frère ou un espace de noms enfant, faites-le. La principale raison pour laquelle je vois la division en espaces de noms est pour faciliter le développement, ce qui permet aux développeurs de naviguer plus facilement dans la hiérarchie des espaces de noms pour trouver ce dont ils ont besoin.

Si vous avez un seul espace de noms avec beaucoup de types et que vous pensez qu'il est difficile d'en trouver certains, envisagez de les déplacer vers un autre espace de noms. J'utiliserais un espace de noms enfant si les types sont spécialisés dans les types d'espace de noms parent, et un espace de noms frère si les types peuvent être utilisés sans les types d'espace de noms d'origine ou ont un objectif différent. Bien sûr, tout dépend de ce que vous créez et du public cible.

Si un espace de noms comporte moins de 20 types, il est peu probable que le fractionnement vaille la peine. Cependant, vous devez envisager l'affectation d'espaces de noms lors de la conception afin de savoir à l'avance, lors du développement, quels types vont dans quels espaces de noms. Si vous attribuez des espaces de noms au cours du développement, attendez-vous à beaucoup de refactoring afin de déterminer ce qui doit aller où. "

Une chose qui n’est pas couverte ici, bien qu’elle soit liée au point de Chris, est que l’instructibilité d’un espace de noms n’est pas uniquement liée au nombre d’éléments.

(Incidemment, cela s'applique à "l'espace de noms" au sens le plus large - une classe elle-même est un espace de noms au sens général, en ce sens qu'elle contient certains noms qui signifient une chose différente de ce qu'ils pourraient être dans un autre, une enum est un espace de noms dans ce sens aussi).

Supposons que je rencontre un espace de noms lié à XML avec une classe Element . J'apprends un peu à ce sujet et lorsque je regarde la classe Attribute , je vois une similitude. Lorsque je vois alors une classe ProcessingInstruction , je peux deviner de façon raisonnable son fonctionnement (et c'est probablement un défaut de conception si je suppose que c'est complètement faux, au mieux, les différences n'ont pas seulement besoin d'être documentées, mais expliquées ). Je peux deviner qu’il existe une classe Commentaire avant même de la voir. Je vais chercher votre classe TextNode et me demander si tous héritent de Node plutôt que de devoir en apprendre davantage à partir de la documentation. Je me demande quelle approche raisonnable vous avez adoptée avec votre classe Lang plutôt que de vous demander si elle existe déjà.

Parce que tout cela concerne un domaine que je connais déjà bien, le concept conceptuel "coût" de ces sept classes est beaucoup, beaucoup moins que si les sept classes étaient appelées Sheep , Télévision , FallOfSaigon , Enuii , AmandaPalmersSoloWork , ForArtsSakeQuotient et DueProcess .

Cela se rapporte au point soulevé par Chirs, car il dit que nous sommes avisés, par souci de convivialité, de limiter le nombre de choix. Cependant, si nous avons le choix des pays par ordre alphabétique, nous dressons immédiatement la liste complète et sélectionnons celui dont nous avons besoin immédiatement. Par conséquent, il est déconseillé de limiter les choix (en fait, plusieurs options à la fois peuvent être à la fois moins utile et potentiellement insultant).

Si votre espace de noms compte 200 noms, mais que vous devez seulement vraiment en apprendre une demi-douzaine pour comprendre le lot, il sera alors beaucoup plus facile de parler que d'avoir une douzaine de noms peu liés à les uns les autres.

Je sais que vous ne voulez pas parler de groupement logique, mais pour faire une scission, vous devez pouvoir grouper les deux espaces de noms différents. Je commencerais par envisager un nouvel espace de noms pour environ 30 classes; Cependant, je ne considérerais pas cela comme une préoccupation majeure.

Je dois dire que je trouve tout ce qui précède très surprenant.

Les experts en convivialité nous conseillent de limiter le nombre de choix dans un menu afin de pouvoir visualiser immédiatement tous les choix. Il en va de même pour la manière dont vous organisez votre travail.

Je m'attendrais généralement à 4-10 types dans un espace de noms. Permet d’économiser beaucoup de ronds de chasse et de défilement. C'est tellement rapide et facile de déplacer des choses en utilisant resharper que je ne vois aucune raison de ne pas le faire.

Une autre chose à noter est qu'il est souvent utile de placer une classe contenant des méthodes d'extension dans son propre espace de noms, de sorte que vous puissiez activer ou désactiver ces méthodes d'extension avec une directive à l'aide de . Donc, si l'élément de l'espace de noms est une classe statique contenant des méthodes d'extension, la réponse est 1.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top