68 votes

Classes partielles - est-ce qu'elles sont mal conçues?

Je me demande pourquoi les " partielle de la classe de concept existe même en C#/VB.NET. Je suis en train de travailler sur une application et nous sommes à la lecture d'un (très bon) livre relavant de la plate-forme de développement que nous avons mise au travail. Dans le livre, il offre une grande base de code /wrapper autour de la plate-forme de l'API et explique comment il a développé ce qu'il enseigne différentes rubriques sur la plate-forme de développement.

De toute façon, c'est une longue histoire courte, il utilise les classes partielles, tous sur la place, comme un moyen de faux héritage multiple en C# (OMI). Pourquoi il na pas juste diviser les classes en place dans plusieurs de celles et utiliser la composition est au delà de moi. Il dispose de 3 'classe partielle fichiers pour faire de sa classe de base, chaque w/ 3-500 lignes de code... Et ce, plusieurs fois dans son API.

Trouvez-vous cela est-il justifiable? Si c'était moi, j'aurais suivi la S. R. P. et créé plusieurs classes pour gérer les différents comportements, alors créer une classe de base qui a des instances de ces classes en tant que membres (par exemple la composition). Pourquoi MS a mis même classe partielle dans le cadre?? Ils ont retiré la possibilité d'agrandir/réduire tout le code à chaque niveau d'étendue en C# (ce qui était autorisé en C++), car il était évidemment seulement de permettre à de mauvaises habitudes - classe partielle est de l'OMI la même chose. Je suppose que ma quetion est: Pouvez-vous m'expliquer qu'il existe un motif légitime à utiliser une classe partielle?

EDIT: je suis conscient que pour le Web/Winforms il n'y a pas d'autre choix. Mais en dehors de cela? Pourquoi ne pas MS vient de mettre quelques mots clés pour le collage de code-genned classes combinés? Ou est-il vraiment légitime de conception de scénario qui mérite?

Je ne dis pas cela pour être un coup de gueule / la guerre thread. Je suis honeslty qui cherchent à apprendre quelque chose ici. Quand doit-classes partielles être utilisés dans le code de la conception simple question, pas besoin de fermer l'

Merci

97voto

John Feminella Points 116878

Pouvez-vous m'expliquer qu'il existe un motif légitime à utiliser une classe partielle?

L'un des plus légitime et utile raisons est d'encourager la séparation de code automatiquement généré et vos propres extensions. Par exemple, il est courant d'avoir un formulaire automatique de code à partir d'un certain genre de designer, mais vous voulez ajouter votre propre comportement. De cette façon, si vous régénérer l'automatique-partie du code, vous n'êtes pas en contact avec la partie qui a vos extensions spécifiques.

Cela dit, il est tout à fait possible d'avoir trop d'une bonne chose. Quelques conseils:

  • Ne faites pas de vos classes partial pour le plaisir de partial.

  • Ne mettez pas des classes partielles n'importe où sauf en plus l'un de l'autre. Si vous devez sauter complètement sans rapport avec l'article du projet de voir l'autre moitié de la classe, vous êtes probablement de faire le mal.

  • Ne pas utiliser partial comme une technique pour dissimuler la taille de la classe. Si vous êtes à la rupture de vos classes avec des partial parce qu'ils sont trop gros, vous devriez revoir le Principe de Responsabilité Unique.

  • Si vous avez trois ou plus partial des fragments de la même classe, c'est presque une garantie que vous êtes abuser partielle. Deux est le cas typique de la limite supérieure de la vraisemblance, et il est généralement utilisé pour segmenter automatiquement le code généré à partir de notes manuscrites code.

De toute façon, c'est une longue histoire courte, il utilise les classes partielles, tous sur la place, comme un moyen de faux héritage multiple en C# (OMI). Pourquoi il na pas juste diviser les classes en place dans plusieurs de celles et utiliser la composition est au delà de moi. Il dispose de 3 'classe partielle fichiers pour faire de sa classe de base, chaque w/ 3-500 lignes de code... Et ce, plusieurs fois dans son API.

Oui, c'est un abus manifeste de l' partial!

12voto

Jeff Yates Points 36725

Il y a deux raisons que je voudrais (et faire) utiliser des classes partielles.

  1. Pour séparer les auto-généré parties du code (comme les WinForms code de concepteur ou T4 de sortie).
  2. Pour permettre les types imbriqués leur propre fichier tout de même d'atteindre l'encapsulation requis par votre conception.

Mise à jour
Je vois que certains ne sont pas convaincus de mon deuxième point, permettez-moi de donner un exemple; l' ListViewItemCollection dans le cadre. Il est tout à fait à juste titre imbriqués sous ListView parce que c'est uniquement pour une utilisation en ListView, mais pour rendre la maintenance plus facile, je voudrais lui donner son propre fichier en utilisant des classes partielles. Je ne vois pas cela comme une mauvaise conception ou d'une mauvaise utilisation de l' partial mot-clé.

Pour plus de détails, consultez la question que celui-ci les doublons: http://stackoverflow.com/questions/160514/partial-classes-in-c

11voto

Aaronaught Points 73049

Une autre utilisation légitime de classes partielles est de contribuer à réduire le "monolithique service web" fouillis dans WCF. Vous voulez le décomposer en groupes logiques de fonctionnalités mais ne voulez pas avoir à créer une rame de personne instances de services/systèmes d'extrémité (sans doute parce qu'ils partagent l'état, des ressources, et ainsi de suite).

La solution? Le service d'implémenter plusieurs interfaces, et de mettre en œuvre chaque interface dans sa propre classe partielle. Puis la carte différents paramètres dans la configuration de la physique même de la mise en œuvre. Il rend le projet beaucoup plus facile à gérer, mais il vous reste qu'à avoir un physique de point de terminaison.

Dans certains cas, je serais point à ce type d'approche comme une mauvaise pratique sur le compte de la SRP, mais quand vous travaillez avec des services WCF ou des services web en général, ce n'est pas tout à fait aussi simple. Vous avez de l'équilibre interne des exigences de conception contre les exigences de la consommation.

2voto

sumit bisht Points 31

Juste tombé sur ce thread alors que googler les avantages de la classe partielle. Je suis dans le processus de conversion d'une application Java EE dans un silverlight basée .NET un. Je suis tombé sur le code suivant dans la couche de la vue :

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.225
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

...

 public partial class Wwcusts04d : System.Windows.Controls.Page {

Maintenant, si l'partielle de la page elle-même est généré automatiquement, quelle est l'utilité de son maintien ? En outre, le code à l'intérieur, juste des liens différents contrôles à leurs noms. Je n'ai pas l'avouer avoir eu connaissance de silverlight, mais n'est pas cette chose mieux en xaml?

2voto

Robert Davis Points 1016

Une autre bonne utilisation pour les classes partielles serait le cas de la mise en œuvre de l' Abstrait modèle de fabrique. Faire la racine de l'usine de l'objet partiel, puis placez l'usine réelle méthodes dans le même fichier que la classe de l'usine instancie.

EDIT: classes Partielles travaillent aussi bien pour les classes qui interagissent avec un fichier de configuration. Placez le code contenant les paramètres de configuration de près le code qui utilise le paramètre de configuration.

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