30 votes

Quand est-il raisonnable d'avoir plusieurs classes dans le même fichier?

Nous savons tous que d'avoir un grand nombre de classes dans un fichier n'est pas la meilleure pratique - c'Est une mauvaise pratique d'avoir plusieurs classes dans le même fichier?

Cependant, ce qui me confond, avec de nouveaux VS 2015 nous avons encore des outils en supposant que plusieurs classes.

1. La classe de menu déroulant de sélection. Il n'a de sens que lorsque vous avez plusieurs classes:

enter image description here

2. Dans la solution de l'arbre, la feuille est une classe, pas un fichier, qui est aussi redondant compte tenu que vous avez une classe par fichier:

Visual Studio 2015 Solution Explorer

3. Je n'ai trouvé aucune règle stricte "une classe - un fichier" dans la Conception de lignes Directrices, ni dans les Conventions de Codage.

Ce qui me fait penser que c'est en fait légitime. Donc, la question est que lorsque nous avons besoin de le faire?

41voto

CommuSoft Points 6439

Outils de traiter avec des programmes/code doivent être conservateur: depuis C# prend en charge plusieurs-à-plusieurs relations entre les fichiers et les classes/... vous ne pouvez pas simplement "assumer" un utilisateur ne va pas le faire parce qu'il/elle est a appris à ne pas le faire. Donc, ce n'est pas le signe d'encouragement. Vous avez à gérer les cas d'utilisateurs qui utilisent toutes les fonctionnalités disponibles dans la langue de votre offre. En outre, le compilateur lui-même n'a aucun problème avec plusieurs classes dans des fichiers, il est donc plus ce qui fait d'un programmeur/testeur/... plus efficace.

Il y a des avantages de la prise en charge de plusieurs classes par fichier et plusieurs fichiers par catégories:

  • Plusieurs classes par fichier:

    • compilateur de compilateurs par exemple parfois besoin (ou au moins rendre les choses plus simples, s'ils utilisent de multiples catégories. Dans de tels cas, il est agréable à émettre de tous à l'analyseur de code dans un seul fichier, parce qu'en général, un programmeur de ne jamais regarder dans le fichier. Surtout si le nombre de classes dépendent de certains paramètres d'entrée. Si l'on a jamais été inondé avec un programme générant des milliers de fichiers dans votre répertoire d'accueil (ou une autre répertoire), il/elle apprécie de garder le code généré dans un seul fichier;

    • en conserve exemples: un autre avantage d'au moins permettant à plusieurs classes par fichier est de permettre aux utilisateurs de faire des conserves exemples. Par exemple, si quelqu'un publie son code à un code de fragement sur StackOverflow; on peut exécuter immédiatement à travers un compilateur alors que pour le code Java, vous devez d'abord diviser les fragments dans des fichiers séparés.

  • Plusieurs fichiers par classe: GUI éditeurs parfois générer des code de l'INTERFACE utilisateur, mais il y a toujours un fichier qui doit gérer des événements. On peut bien sûr mettre dans le même fichier, mais cela rend les choses plus compliquées: qu'allez-vous faire avec le code d'utilisateur si vous avez à régénérer votre code de l'INTERFACE utilisateur?

Comme @RubberDuck dit, partial est utile dans l'interaction entre un vrai programmeur et générateur de code, des outils pour prévenir le code de devenir un gâchis.

Enfin, il y a parfois des situations où la définition de plusieurs classes/interfaces/... dans un seul fichier n'est pas nécessairement une mauvaise pratique. delegates (ainsi que enums et comme @mg30rg dit - Exception des classes), par exemple, sont conceptuellement sur le même niveau des classes, mais il peut en résulter de générer une énorme quantité de fichiers chaque avec une petite quantité de code. Cela peut faire un projet illisible ainsi.

Un parfois indiqué avantage de l'utilisation d'une classe par fichier approche est que quand vous mettez un fichier sous contrôle de version (git, svn, cvs), vous pouvez facilement voir l'histoire d'une seule classe est passé.

En général, par le découplage des fichiers de classes, C# permet aux programmeurs de plus de liberté pour gérer leurs affaires comme ils pensent qu'il doit être le moyen le plus efficace. Bien que la norme est une classe par fichier (probablement hérité de Java qui a appliqué ce), il y a des situations où il peut être avantageux d'utiliser une autre forme de gestion.

Quelques commentaires ci-dessous montrent alternative raisons pour stocker plusieurs classes (ou des articles sur le même niveau conceptuel) dans un seul fichier et d'utiliser plusieurs fichiers qui contiennent des détails d'une seule classe,...

22voto

InBetween Points 6162

Je trouve la fonctionnalité extrêmement utile. Vous oubliez les classes imbriquées qui sont largement utilisées et très pratiques dans plusieurs modèles de conception:

Un exemple d'un motif que j'ai vu à plusieurs reprises est quelque chose de similaire à:

 public class Foo
{
    private Foo() {} //prevents inheritance from outside the class

    private class MySpecializedFoo1: Foo {...}
    private class MySpecializedFoo2: Foo {...}

    public static Foo GetFoo(...) {...}
}
 

11voto

CodeCaster Points 38181

En vous donnant les ressources nécessaires pour faire quelque chose ne signifie pas qu'il est activement encouragée. Microsoft ne va pas vous dire comment organiser votre code, vous pouvez utiliser Visual Studio que vous le souhaitez.

Il ne semble pas être une déclaration officielle, voir Une classe par fichier de règle .NET? pour une discussion sur le sujet. Il y sont des cas où l'on pourrait utiliser plusieurs types de fichier par fichier, mais en général, vous n'en voulez pas.

Outre le code de l'utilisateur, la liste déroulante est surtout utile pour le code généré, où toutes les classes sont dans un seul fichier.

5voto

Matías Fidemraizer Points 16842

La meilleure raison pour utiliser une classe, un fichier n'est pas seulement parce qu'il applique la simplicité, mais aussi parce que Visual Studio va renommer la classe et toutes ses occurrences dans l'ensemble de la solution à l'aide intégrée dans le refactoring si le fichier de code a le même nom que la classe (ou enum, ou de l'interface,...) au sein de l'ensemble du fichier.

Peut-être il n'y a pas de règle officielle à ce sujet, mais quand un outil qui vous donne un avantage certain si vous suivez certaines règles c'est comme une façon officieuse de vous dire comment faire les choses bien.

5voto

Octopoid Points 1046

À partir de cette page MSDN, en comparant le fichier source conventions de C# Java:

La convention de nommage pour les fichiers contenant des classes C# est un peu différent de Java. En Java, tous les fichiers sources ont une .extension java. Chaque fichier source contient un public de haut niveau de la déclaration de classe, et le nom de la classe doit correspondre au nom du fichier. En d'autres termes, une classe appelé à la Clientèle a déclaré avec une portée publique doit être définie dans un le fichier source avec le nom Customer.java.

Code source C# est notée par le .cs extension. Contrairement à Java, source les fichiers peuvent contenir plus d'un public de haut niveau de la déclaration de classe, et le nom de fichier n'a pas besoin de correspondre à une des classes de noms.

Évidemment, nous savons tous, c'est vrai, mais ce qui semble être un exemple de Microsoft à l'appui de l'utilisation de la présente convention à un certain degré.

En termes de bonnes pratiques, je pense toujours que c'est communément admis qu'un seul fichier source pour chaque classe publique est la meilleure façon de gérer votre solution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X