2009-02-10 2 views
2

Lors de la refonte de certaines classes C#, j'ai rencontré des classes implémentant IDisposable. Sans réfléchir, j'ai créé des fichiers de classe partiels pour chaque classe qui implémente l'interface IDisposable.Dois-je séparer la logique Dispose dans un fichier de classe partiel?

Eg) Pour Stamper.cs -> Stamper.cs + Stamper.Dispose.cs où Stamper.cs contient une logique réelle pour l'estampage et Stamper.Dispose.cs qui contient la logique de disposer

// Stamper.cs 
public partial class Stamper 
{ 
// actual logic 
} 

// Stamper.Dispose.cs 
public partial class Stamper: IDisposable 
{ 
// Implement IDisposable 
} 

Quand je regardais le code, Stamper.cs semble maintenant beaucoup plus propre et lisible (maintenant environ 52 lignes au lieu de 100 lignes où environ 50 lignes était simplement un code de disposer de nettoyage)

Vais-je trop loin w c'est ça?

* EDIT: Merci pour votre avis - J'ai décidé de mettre deux fichiers en un. Le problème que j'avais rencontré était que j'oublie réellement de mettre à jour l'implémentation d'IDisposable après la mise à jour de la logique actuelle.

De plus, il n'y avait pas beaucoup de problèmes de navigation entre les méthodes dans le code source. La première raison semble plus qu'une raison suffisante pour s'en tenir à une solution de fichier dans mon cas particulier.

+0

Ajoutez un tag "subjective". ;) – JohannesH

+0

tag "sujet" ajouté :) – Sung

Répondre

7

Il semble à peu près aussi arbitraire que de créer une classe partielle pour la logique du constructeur. Maintenant, je dois regarder deux fichiers pour grock cette classe. Les classes partielles ne valent vraiment le coup que pour le design ...

+0

Letting Designer ou l'outil de génération de code pour faire face à la classe partielle semble correct. Il n'y avait aucun problème à naviguer autour de la source. L'inconvénient de ma mise en œuvre partielle de classe était que j'ai effectivement oublié de mettre à jour IDisopsable impl. après avoir changé de logique Lien utile: http://tinyurl.com/abmypf – Sung

8

Oui, trop loin. Qu'est-ce qui ne va pas avec juste coller un #Region autour du code et le plier de sorte que vous ne pouvez pas le voir?

1

Si votre procédure de nettoyage est lourde, c'est acceptable, mais pas idéale.

Cela peut être une bonne habitude pour la plaque de la chaudière comme les événements exposés, les méthodes de sérialisation lourdes et dans votre gestion de mémoire de cas.

I préférer classes partielles que les contours (#region). Si vous devez utiliser une classe partielle ou un code pour rendre votre code lisible, c'est généralement un signe que le code doit être modifié. Déchirer la classe appart et seulement en dernier recours utiliser la classe partielle (ou région) si le code est absolument nécessaire pour l'entretien de cette classe.

Dans votre cas, vous pouvez utiliser une classe qui enveloppe finement la ressource non gérée et expose une seule Dispose. Ensuite, dans l'autre classe, utilisez l'objet géré et Disposez-le sans logique.

Si votre classe n'est qu'une enveloppe mince, je dirais que votre méthode est trop lourde car tout le point de la classe est de disposer d'une ressource non gérée.

+0

S'il vous plaît expliquer comment les régions sont un problème, mais les classes partielles ne sont pas? De toute façon, la classe est assez lourde pour exiger une organisation supplémentaire. Le découper en plusieurs fichiers par rapport à des régions dans un seul fichier me frappe plus par goût. – Misko

+0

Les régions dépendent de la configuration de votre EDI alors que les fichiers ne le sont pas. Par exemple, j'aime utiliser Consolas et cela rend l'icône de la région presque invisible et impossible à cliquer. De plus, avoir des choses dans un fichier différent rend le code 'caché' évident alors qu'une région est facile à manquer. – Coincoin

+0

J'utilise Consolas 9pt et je n'ai aucun problème avec les icônes de réduction/expansion de la région qui sont presque invisibles et difficiles à cliquer. Les régions peuvent être faciles à manquer, mais au moins elles sont là - plus faciles à analyser qu'un seul fichier et à voir tous les détails de mise en œuvre, vs devant lire 2 fichiers pour voir l'ensemble de l'image. –

6

Je préférerais voir la logique d'élimination dans le même fichier que les ressources qui justifient l'implémentation d'IDisposable. Bien qu'il y ait un élément de subjectivité, je dirais que c'est trop loin

2

Je pense que votre solution est malsaine. Les classes partielles ne doivent généralement être utilisées que pour séparer le code du développeur du code du générateur. Les régions font généralement un meilleur travail d'ajout de structure à votre code.

+0

Désolé JohannesH, je ne pense pas que l'ajout de régions fait du bon travail sur quoi que ce soit d'habitude. Je considère que les régions sont assez ennuyantes car je ne peux généralement pas voir le code source entier – Sung

+0

Ok ... Eh bien, en fait, je pense que vous devriez le faire comme vous préférez ... Tant que vous le gardez comme une pratique d'équipe cohérente. Je ne le ferais pas comme ça. Cependant, à la fin, c'est vous qui devez travailler tous les jours.Donc, si vous pensez que c'est mieux comme ça, allez-y. :) – JohannesH

0

Sorte de question étrange car elle n'a d'impact que sur le développeur, ce qui en fait un choix personnel. Je peux seulement vous dire ce que je préférerais et ce serait que je le ferais si une part importante de la logique était dans la disposition.

0

Personnellement, j'essaie de garder ma logique d'instanciation/initialisation et ma logique de nettoyage/élimination côte-à-côte, c'est un bon rappel. En ce qui concerne les classes partielles, la seule fois où je les utilise est si une classe est très grande et peut être catégorisée en groupes de méthodes. Cacher le code du concepteur est super aussi.

0

Je préférerais utiliser une classe partielle quand, et seulement quand, le code en question a été généré par ordinateur. Si vous avez plusieurs classes qui partagent un code similaire (qui, pour diverses raisons, doit être répété, plutôt que d'être extrait dans sa propre classe), il peut être utile d'avoir quelques modèles et un programme pour générer le code basé sur ces modèles. Dans ce scénario, les modèles seraient considérés comme des fichiers source, puis générés en tant que code objet-ish intermédiaire. Il semblerait tout à fait approprié de sortir le code généré par un template dans des classes partielles.

Dans vb.net, une telle approche pourrait être utile pour permettre la déclaration de champ, l'initialisation et le nettoyage pour être manipulés en toute sécurité au sein d'un objet IDisposable. Une quantité modérée de code standard est requise, mais les déclarations sur le terrain après cela sont plutôt propres. Par exemple:

 
' Assuming Option Implicit on: 
Dim MyThingie = RegDisposable(New DisposableThingie) 
' If Implicit wasn't on: 
Dim MyThingie As DisposableThingie = RegDisposable(New DisposableThingie) 

RegDisposable serait un membre de la classe qui ajouterait à la nouvelle DisposableThingie une liste détenue par la classe. La routine "Dispose" de la classe devrait alors Disposer tous les éléments de la liste. Malheureusement, il n'y a pas de méthode propre pour faire quelque chose de similaire en C#, car les initialiseurs de champs ne peuvent pas utiliser l'objet sur le point de se construire (dans vb.net, les initialiseurs de champ sont exécutés après la construction de l'objet de base).

Questions connexes