2

いくつかの C# クラスをリファクタリングしているときに、IDisposable を実装するクラスに出くわしました。

何も考えずに、IDisposable インターフェイスを実装するクラスごとに部分クラス ファイルを作成しました。

例) Stamper.cs -> Stamper.cs + Stamper.Dispose.cs の場合、Stamper.csには実際のスタンピング ロジックが含まれ、 Stamper.Dispose.csには破棄ロジックが含まれます。

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

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

コードを見てみると、Stamper.cs はかなりすっきりして読みやすくなっています (約 50 行は単にクリーンアップの破棄コードであった 100 行ではなく、約 52 行になりました)。

私はこれで行き過ぎですか?

*EDIT : ご意見をお寄せいただきありがとうございます。2 つのファイルを 1 つにまとめることにしました。私が直面した問題は、実際のロジックを更新した後に IDisposable 実装を更新するのを実際に忘れていたことです。

さらに、ソース コード内のメソッド間を移動するのにそれほど問題はありませんでした。最初の理由は、私の特定のケースでは 1 つのファイル ソリューションに固執するのに十分な理由のようです。

4

8 に答える 8

0

問題のコードがコンピューターで生成された場合にのみ、部分クラスを使用することをお勧めします。同様のコードを共有するクラスが多数ある場合 (独自のクラスに引き出されるのではなく、さまざまな理由で繰り返される必要があります)、いくつかのテンプレートと、そのようなテンプレートに基づいてコードを生成するプログラムがあると便利です。そのシナリオでは、テンプレートはソース ファイルと見なされ、生成されたファイルはオブジェクトのような中間コードと見なされます。テンプレートで生成されたコードを部分クラスに引き出すことは、まったく適切なことのように思われます。

vb.net では、フィールドの宣言、初期化、およびクリーンアップを IDisposable オブジェクト内で安全に処理できるようにするために、このようなアプローチが適している場合があります。適度な定型コードが必要ですが、その後のフィールド宣言はかなりきれいです。例えば:

' Option Implicit を仮定すると:
Dim MyThingie = RegDisposable(新しい DisposableThingie)
' Implicit がオンになっていない場合:
MyThingie を DisposableThingie = RegDisposable(New DisposableThingie) として暗くする

RegDisposable は、クラスが保持するリストに新しい DisposableThingie を追加するクラス メンバーになります。クラスの Dispose ルーチンは、リスト内のすべての項目を Dispose します。

残念ながら、フィールド初期化子は構築しようとしているオブジェクトを利用できないため、C# で同様のことを行う明確な方法はありません (vb.net では、ベース オブジェクトが構築された後にフィールド初期化子が実行されます)。

于 2011-01-16T23:44:10.333 に答える
0

個人的には、インスタンス化/初期化ロジックとクリーンアップ/破棄ロジックを並べて維持するようにしています。これは良い思い出です。

部分クラスに関しては、クラスが非常に大きく、メソッドのグループに分類できる場合にのみ使用します。デザイナーのコードを非表示にすることも素晴らしいことです。

于 2009-04-21T18:44:37.633 に答える