Plusieurs classes dans un seul fichier .cs - bon ou mauvais? [fermé]

30

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 qu'il s'agit d'un mauvais exemple de bonne architecture, le fait d'avoir plus d'une seule classe dans un fichier .cs a-t-il une odeur de code?


la source

Réponses:

30

L'exemple que vous avez donné est en fait très bien à mon avis. Vous déclarez des 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 Itemsclasse 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 classe (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 posez la question «Dois-je mettre chaque classe de niveau d' espace de noms dans son propre fichier», ma réponse serait «oui».

Lors de la conception des cours, 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. Pouvoir avoir plus de contexte devant 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.

Johannes Rudolph
la source
1
Je suis d'accord, mais là encore, les classes internes sont très rares dans mon expérience. Pour être juste, il n'y a pas grand-chose qui puisse vraiment justifier les classes internes, le seul cas que je connaisse est celui des classes IEnumerable où vous ne vous intéressez pas vraiment à la classe réelle tant que vous pouvez l'énumérer. Dans tous les autres cas, chaque classe doit obtenir son propre fichier. Si pour aucune autre raison en raison de problèmes de contrôle de source.
Homde
2
J'ajouterais que les classes internes devraient être une exception rare et ne devraient presque jamais être publiques.
Josh
Yup m'apprend à être si rapide, les classes internes sont bien, mais demander si vous devez utiliser des classes internes est une autre question :)
krystan honor
11

Pour être brutalement honnête, veuillez ne pas ajouter plus d'une classe racine à 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 à essayer de 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 rien faire de classes imbriquées mais privatesi vous pouvez le concevoir) et c'est parfaitement bien d'avoir dans un seul fichier.

Jesse C. Slicer
la source
3
Oh mon dieu - ça a l'air terrible.
Pourquoi demandes-tu? Est-ce que quelqu'un vous a déçu et vous voulez demander pourquoi?
Attendez ... parliez-vous de la petite anecdote sur mon dernier emploi? Si c'est le cas, j'ai mal compris et je m'en excuse.
Jesse C. Slicer
Complètement d'accord. Je travaille sur un projet où la plupart des fichiers ont au moins 4 classes par fichier. Et certains ont jusqu'à 22 classes + 1 interface par fichier.
L_7337
7

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 qu'en utilisant Fluent NHibernate, c'est plus facile si je garde Entityet EntityMapdans 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.

mootinator
la source
1
Spécifiquement pour Fluent NHibernate, j'ai trouvé utile de les conserver non seulement dans le même fichier, mais aussi dans la même classe. Toutes mes entités ont une classe imbriquée appelée Map.
James Beninger
7

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 en .net mais en 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 :)

honneur krystan
la source
3

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 sont pas touchés ... grrr! :)

Julia Hayward
la source
-3

Fondamentalement, si vous avez seulement besoin d'utiliser cette classe à partir de la classe "parent" (en termes de portée), il est généralement approprié de la définir comme classe imbriquée.

hjdjdg
la source