web-dev-qa-db-fra.com

Plusieurs classes dans un seul fichier .cs - bon ou mauvais?

Est-il conseillé de créer plusieurs classes dans un fichier .cs ou chaque fichier .cs doit-il avoir une classe individuelle?

Par exemple:

public class Items
{
    public class Animal
    {
    }

    public class Person
    {
    }

    public class Object
    {
    }
}

En esquivant une minute que c'est un mauvais exemple de bonne architecture, avoir plus d'une seule classe dans un fichier .cs a-t-il une odeur de code?

29
Sergio

L'exemple que vous avez donné est en fait très bien à mon avis. Vous déclarez classes internes, il est donc parfaitement judicieux de les conserver dans le même fichier. Le seul moyen de contourner ce problème serait de faire de votre classe Items une classe partielle et de la diviser en plusieurs fichiers. Je considérerais cette mauvaise pratique. Ma politique générale pour les classes imbriquées est qu'elles doivent être petites et privées. Il y a deux exceptions à cela:

  • vous concevez un cluster de classes (plus courant dans l'objectif-c), il peut donc être judicieux d'utiliser l'approche de classe partielle
  • vous avez besoin d'une énumération qui n'est utilisée qu'avec l'API publique de la classe parente. Dans ce cas, je préfère avoir une énumération publique déclarée dans la classe parent au lieu de polluer mon espace de noms. L'énumération étant une "énumération intérieure", elle donne effectivement une portée bien définie.

Si vous formulez la question un peu différemment et demandez "Dois-je mettre chaque espace de noms - classe de niveau dans son propre fichier" alors ma réponse serait "oui ".

Lors de la conception des classes, nous respectons le principe de responsabilité unique. La lecture du code devient beaucoup plus facile si sa forme suit sa sémantique, il est donc judicieux de fractionner les fichiers par classe.

D'un point de vue mécanique, avoir un fichier par classe présente plusieurs avantages. Vous pouvez ouvrir plusieurs classes en même temps dans différentes fenêtres. Ceci est particulièrement important car aucun développeur sérieux ne travaille avec moins de deux écrans. Être capable d'avoir plus de contexte dans devant de ma tête signifie que je peux garder plus de contexte dans ma tête. (La plupart des IDE vous permettront d'ouvrir deux fois le même fichier, mais je trouve cela gênant).

Le prochain aspect important est le contrôle des sources et la fusion. En gardant vos classes séparées, vous évitez beaucoup de tracas lorsque des modifications sont apportées au même fichier car des classes distinctes doivent être modifiées.

30
Johannes Rudolph

Pour être honnête, veuillez ne pas ajouter plus d'une classe racine dans un fichier. Lors de mon dernier travail, il y avait des fichiers avec non seulement plusieurs classes, mais plusieurs espaces de noms et cela s'étalait sur plusieurs milliers de lignes de code. Très difficile à suivre.

S'il existe des classes qui sont étroitement liées, alors nommez leurs fichiers de la même manière ou placez-les dans un sous-dossier.

La séparation physique des fichiers de classe aide (notez, pas la fin de tout) à engendrer une séparation des préoccupations et un couplage plus lâche.

D'un autre côté, votre exemple n'affiche pas plus d'une classe racine. Il existe plusieurs classes imbriquées (remarque: essayez de ne pas créer de classes imbriquées sauf private si vous pouvez le concevoir) et c'est parfaitement bien à avoir dans un seul fichier.

11
Jesse C. Slicer

Mettez simplement oui, ce n'est pas une bonne forme pour le faire et je vous dirai pourquoi, un peu plus tard, lorsque votre solution deviendra grande, vous oublierez où sont les classes car le nom de fichier ne représentera plus le contenu, quel est le nom du fichier AnimalPersonObject.cs c'est tout simplement impossible.

Bien sûr, vous pouvez contourner cela en utilisant des fonctionnalités dans des outils comme resharper pour passer aux types, mais 1 classe par fichier (y compris les interfaces) est vraiment l'épine dorsale de toute norme de code que j'ai jamais vue, pas seulement dans .net mais dans Java et c ++ et beaucoup d'autres langages, ceux qui n'ont pas souvent de problèmes de maintenance et vous trouverez que les développeurs juniors ont du mal à saisir le code.

Presque tous les outils d'optimisation de code vous diront de déplacer les classes dans un fichier séparé, donc pour moi oui, c'est une odeur de code et a besoin d'être évacuée pour la neutraliser :)

7
krystan honour

Si les fichiers sont très cohésifs, par exemple lorsqu'il s'agit d'une alternative à la présence de plusieurs fichiers très courts portant le même nom, cela peut être une bonne idée.

Par exemple, je trouve que lorsque j'utilise Fluent NHibernate, c'est plus facile si je garde Entity et EntityMap dans un seul fichier, malgré ce que mes outils peuvent avoir à dire à ce sujet.

Dans la plupart des cas, cela rend les classes plus difficiles à trouver. À utiliser avec parcimonie et avec prudence.

7
mootinator

Un autre problème est qu'avec des classes très grandes et similaires dans le même fichier - lorsque vous ne pouvez pas voir la déclaration de classe à tout moment - vous pouvez finir par mettre des points d'arrêt dans la mauvaise classe et vous demander pourquoi ils ne pas touché ... grrr! :)

3
Julia Hayward