14

webforms/winforms で生成されたコード シナリオ以外で、部分クラスの適切な使用法はありますか? それとも、この機能は基本的にそれをサポートするためのものですか?

4

20 に答える 20

11

これは、生成されたコードとプログラマーコードを混合するシナリオ(WebForms、WinForms、LINQ-to-SQLなど)をサポートするためのものです。

それを使用する理由は他にもあります。たとえば、大きくて扱いにくいファイルに大きなクラスがあるが、クラスに論理的に関連するメソッドのグループがある場合、部分クラスはファイルサイズをより管理しやすくするためのオプションになる可能性があります。

于 2008-10-02T01:49:05.423 に答える
7

コード生成は、部分クラスの背後にある原動力でした。この必要性は、常に変化するコード生成クラスを持つことから生じますが、クラスの再生成を強制する変更が行われるたびにオーバーライドされないクラスの一部として、開発者がカスタム コードを提供できるようにします。

例として、WinForms または Typed-DataSets (またはその他のデザイナー) を取り上げます。デザイナーに変更を加えるたびに、対応するコードがファイルにシリアル化されます。ジェネレーターが何も知らないいくつかの追加メソッドを提供する必要があるとしましょう。生成されたファイルに追加すると、次に生成されたときに変更が失われます。

私が現在取り組んでいるプロジェクトでは、すべての DAL、BLL、およびビジネス エンティティに対してコード生成を使用しています。ただし、ジェネレーターは情報の 75% しか得られません。残りの部分は手動でコーディングする必要があります (カスタム ビジネス ロジックなど)。すべての BLL クラスには SelectAll メソッドがあると想定できるので、簡単に生成できます。ただし、顧客の BLL にも SelectAllByLocation メソッドが必要です。これは、すべての BLL クラスに一般的ではないため、ジェネレーターに入れることはできません。したがって、すべてのクラスを部分クラスとして生成し、別のファイルでカスタム メソッドを定義します。今後、構造が変更されたり、何らかの理由で BLL を再生成する必要が生じたりしても、カスタム コードは消去されません。

于 2008-10-02T02:33:41.947 に答える
6

作成したカスタムコントロールのさまざまなサブ要素を分離する手段として、部分クラスを使用します。また、エンティティ作成ソフトウェアと併用すると、LLBLGenなどの製品で、生成されたクラスのバージョンと、エンティティを再生成する必要がある場合に置き換えられないカスタムのユーザー編集バージョンを作成できます。

于 2008-10-02T01:51:36.760 に答える
5

部分クラスを使用して、ネストされた各クラスに独自のファイルを与えることがよくあります。私が取り組んできたいくつかのアーキテクチャでは、ほとんどの実装が 1 つのクラスによってのみ必要とされるため、それらのクラスをその 1 つのクラスにネストしました。部分クラス機能を使用して各ファイルを独自のファイルに分割することで、ファイルの保守を容易にすることは理にかなっています。

また、ストック オーバーライドのグループ化や、ストック セットのプロパティの非表示にも使用しました。そういうもの。これは、株式の変更を混在させる便利な方法です (ファイルをコピーして、部分クラス名をターゲット クラスに変更するだけです。もちろん、ターゲット クラスも部分クラスになっている場合に限ります)。

于 2008-10-02T02:18:30.440 に答える
4

部分クラスの別の用途として、部分メソッドを利用して、条件付きコンパイルを使用してメソッドを選択的に非表示にすることもできます。これは、デバッグ モードの診断コードや特殊な単体テストのシナリオに最適です。

抽象メソッドのような部分メソッドを宣言してから、他の部分クラスでキーワード「partial」を入力すると、Intellisense を利用してそのメソッドの実装を作成できます。

1 つの部分を条件付きビルド ステートメントで囲むと、デバッグのみのコードまたはテスト コードを簡単に切り取ることができます。以下の例では、DEBUG モードで LogSomethingDebugOnly メソッドが呼び出されますが、リリース ビルドではメソッドがまったく存在しないように見えます。これは、多数の分岐やビルドを行わずに、診断コードを運用コードから遠ざける良い方法です。複数の条件付きコンパイル ブロック。

// Main Part
public partial class Class1
{
    private partial void LogSomethingDebugOnly();

    public void SomeMethod()
    {
        LogSomethingDebugOnly();
        // do the real work
    }
}

// Debug Part - probably in a different file
public partial class Class1
{

    #if DEBUG

    private partial void LogSomethingDebugOnly()
    {
        // Do the logging or diagnostic work
    }

    #endif
}
于 2008-10-23T03:31:57.287 に答える
3

部分的なクラスは非常に役立つと思います。通常、これらは自動生成されたクラスを拡張できるようにするために使用されます。私はそれらを1つのプロジェクトで重い単体テストで使用しました。私のUTクラスには複雑な依存関係があり、コードを複数のクラスに分割することはあまり実用的ではありませんでした。もちろん、inheritance \ composeを使用する方が良いですが、場合によっては部分的なクラスが役立つことがあります。

于 2008-10-02T01:55:26.063 に答える
3

LINQ to SQLLINQ to SQL では、部分クラスをうまく利用して、デザイナーが生成したコードを拡張します。通常、デザイナーが作成したコードで使用される部分クラスのこのパターンを見つけると思います。

于 2008-10-02T01:46:37.583 に答える
2

手遅れかもしれませんが、2セントも追加させてください。

*。大規模なプロジェクトで作業する場合、クラスを別々のファイルに分散させると、複数のプログラマーが同時に作業できるようになります。

*。VS.NETで生成されたクラスのコード(拡張機能用)を簡単に記述できます。これにより、システムで生成されたコードをいじることなく、必要なコードを記述できます。

于 2011-07-15T21:52:36.837 に答える
2

先に述べたように、私もこれはコードの臭いと思います。

クラスが大きすぎてより多くのファイルに分割する必要がある場合は、単一責任の原則に違反し、多くのことを実行していることを意味します。大きなクラスは、一緒に協力する小さなクラスに分割できます。

コードを整理するために部分的なクラスまたはリージョンを使用する必要がある場合は、それらを独自のクラスに含める必要があるかどうかを検討してください。読みやすさが向上し、コードの再利用が増えます。

于 2008-10-02T10:59:44.743 に答える
1

比較的複雑なUserControlsでは、イベント処理を1つのファイルに入れ、ペイントとプロパティを別のファイルに入れました。部分的なクラスはこれに最適です。通常、クラスのこれらの部分は比較的独立しており、ペイントとイベント処理を並べて編集できるのは素晴らしいことです。

于 2008-10-02T01:56:10.743 に答える
1

私はゲームに遅れています...しかし私の2セントだけ...

1つの用途は、既存のレガシーコードベースの既存の神クラスを複数の部分クラスにリファクタリングすることです。部分クラスを含むファイル名に適切な命名規則が守られている場合は、コードの発見可能性が向上する可能性があります。これにより、ソースコードリポジトリも削減される可能性があります。ある程度解決してマージします。

理想的には、神クラスは複数の小さなクラスに分割する必要があります-それぞれが単一の責任を持ちます。中規模から大規模のリファクタリングを実行すると、混乱を招く場合があります。そのような場合、部分的なクラスは一時的な救済を提供することができます。

于 2011-03-02T07:01:53.827 に答える
1

私がいるところには、クライアントからの着信ファイルを処理するプログラムがあります。各クライアントのコードが独自のクラス ライブラリ プロジェクトに含まれるように設定されており、クライアントが使用する形式を処理する方法を認識しています。

メイン コードは、ライブラリ内のクラスが実装する必要があるかなり広範なインターフェイスを定義することによって、ライブラリを使用します (おそらくいくつかの異なるインターフェイスである必要がありますが、変更するには遅すぎます)。場合によっては、同じクラスに通常考えられるよりもはるかに多くのコードが含まれることがあります。部分クラスを使用すると、部分クラスをある程度分割できます。

于 2008-10-02T01:48:47.017 に答える
1

私は数年前、DataTable 内のメソッド、TableAdapter 内のメソッド、TableAdapter インスタンスの宣言など、大量のコードを含む型指定された DataSet クラスを持っていたプロジェクトに取り組みました。これは、全員が頻繁に取り組まなければならないプロジェクトの大規模な中心点であり、部分的なクラス コード ファイルをめぐって多くのソース管理の競合がありました。

そのため、コード ファイルを修正ファイルまたは 6 つの部分クラス ファイルに分割し、機能ごとにグループ化しました。これにより、小さな部分に取り組むことができ、小さな変更が必要になるたびにファイル全体をロックする必要がなくなりました。

(もちろん、排他的にロックするソース管理システムを使用しないことで問題を解決することもできましたが、それは別の問題です。)

于 2008-10-02T03:45:04.117 に答える
1

一般的に、コードの匂いだと思います。

クラスがそれほど複雑な場合は、再利用可能な小さなコンポーネントに分割できる可能性があります。

または、継承階層があるべき場所に継承階層がないことを意味します。

コード生成のシナリオでは良いのですが、コード生成は別のコード臭だと思います。

于 2008-10-02T04:10:15.413 に答える
0

マットが指摘したように、修正は、部分の両側が同じアセンブリにある必要があります。私の悪い。

于 2008-10-02T02:00:51.217 に答える
0

データアクセス層で使用しています。マッパーのような生成されたクラスは、パーシャルをクエリします。たとえば、生成されていない派手なロードを実行するためにマッパーメソッドを追加する必要がある場合は、それをカスタムクラスに追加します。

最後に、ビジネスレイヤーでデータレイヤーを使用するプログラマーには、必要なすべての機能を備えた1つのクラスしか表示されません。また、データソースが変更された場合でも、カスタムのものを上書きすることなく、汎用パーツを簡単に生成できます。

于 2008-10-02T02:01:22.807 に答える
0

編集:VisualStudio用のDSLツールは部分的なクラスを使用します。

したがって、これは多くの自動生成コードが使用する機能です。#regionを使用する代わりに、自動生成されたコードは1つのファイルに移動し、ユーザーコード(カスタムコードとも呼ばれます)は別のファイルに移動し、別のディレクトリに移動するため、開発者は多くの無意味なファイルと混同されません。

継承と組み合わせることができるが、強制的に使用することはできないこの選択肢があるのは良いことです

また、いくつかのクラスのロジックをいくつかのディレクトリ間で分離すると便利な場合があります。もちろん、マシンの場合も同じですが、ユーザーの読みやすさを向上させます。

于 2008-10-02T10:42:59.777 に答える
0

場合によっては、既存のコードを壊さずに個別の要素にリファクタリングすることがほぼ不可能な、非常に古いコードが動作しているのを見つけることがあります。

より本格的なアーキテクチャを作成するオプションや時間が与えられていない場合、部分クラスを使用すると、必要な場所でロジックを非常に簡単に分離できます。これにより、より具体的なアーキテクチャに一歩近づく一方で、既存のコードは同じアーキテクチャを使用し続けることができます。

于 2008-10-02T02:45:47.753 に答える
0

部分クラスの使用法を見つけました。クライアントにデータを渡すために使用する [DataContract] クラスがあります。クライアントが特定の方法 (テキスト出力) でクラスを表示できるようにしたかったのです。そのため、部分クラスを作成し、ToString メソッドをオーバーライドしました。

于 2008-10-02T02:07:12.963 に答える
0

以前にセクションを使用したことのある場所は#region、おそらく部分クラスの個別のファイルとしてより理にかなっています。

私は個人的に、静的メンバーが一方のファイルに、インスタンス メンバーがもう一方のファイルに入る大規模なクラスに部分クラスを使用しています。

于 2008-10-02T03:51:10.437 に答える