質問
C#3.0では、Microsoftは部分メソッドというサポートを導入しました。 。
それらを使用しますか?方法と理由を説明できますか?
部分的なメソッドの使用をプログラミングの適切なプラクティスと見なしますか?
解決
部分メソッドは、主に、このような拡張性が使用されていないランタイム評価やユーザーに表示されるコードのいずれかのコストなしで、ツール生成コードの動作を拡張するのに役立ちます。
そのため、その使用は賢明であり、必要な場合は奨励されるべきですが、そのような機会はほとんどのユーザー(コードを生成するツールを作成していない)には比較的まれです。 そのようなツールを作成している場合、生成されたコードのフローと対話する場所、および意図したパフォーマンスと使いやすさの目標を達成しながら、メカニズムのようなイベントを通じてそのような使用を簡単に処理できないかどうかを考慮する必要があります。イベントは本質的にマルチキャストであり、そのような構造はAPIの意図した設計に本質的に反する可能性があります。あるいは、複雑な戻り値、またはref / outパラメーターとの相互作用が必要になる場合があります。最終的に、拡張機能はその有用性にもかかわらず複雑/脆弱になる可能性があります。これらのすべての理由にはニッチがありますが、一般的ではない場合は部分的な方法で効果的に解決できます。
部分的なメソッドを実装するConsumers は、ツールで生成されたコードが指示するとおりに使用する必要があります(拡張ポイントが提供され、必要な場合は使用します)。 機能が混乱していると感じるため、これを避けるには、これが明らかに意図された拡張ポイントであるため、言語とAPIの使用が不十分になります。
他のヒント
部分クラス自体と同様に、それらはツール(デザイナー)が生成したコードとの組み合わせでのみ有用です。そして、イベントに代わるシンプルで軽量な代替手段を提供します。
作成したクラスライブラリで部分メソッドを使用する機会がありました。定義済みの定数を使用して、さまざまな機能ブロックをコンパイルインまたはコンパイルアウトする、いくつかの異なるバージョンの1つにライブラリをコンパイルすることができました。
ただし、コンパクトフレームワークやデスクトップフレームワークと交差するオプションのすべての組み合わせに対して#if / #endifを使用してコードを散らかすと、混乱を招くものになります。
部分的なメソッドを使用して、その部分を単純化しています-見えない、または暗黙的な#if /#endifのようなものです。私が理解しているように、これはLINQでの使用方法に似ています。
一方で、LINQが行うように、または実行するように、実行時にこれらのメソッドを追加しません。分離可能なアセンブリがあるlinqモデルではなく、組み合わせて追加の機能を取得する場合、クラスライブラリには、オプションの組み合わせごとに1つのDLLが構築されます。これは、展開と消費を簡単にするためです。
部分クラスを使用すると、C#とVBがCとC ++のように機能し、クラスを実装するコードをさまざまなファイルに分散させることができます。主な目的は、WPFなどのビジュアルデザイナーをきれいにサポートすることです。これは部分クラスに適しています。
私が見たもう1つの用途は、大きなソースファイルを論理的な部分に分割することです。たとえば、 class BigForm
は、BigForm-BillingInfo.cs、BigForm-ShippingInfo.cs、およびBigForm-LineItems.csファイルにまたがる場合があります。これは通常、部分クラスの不適切な使用です。複数のクラスまたはコントロールへのリファクタリングの方が、OOP設計(再利用性など)に優れているためです。
部分クラスは非常に便利な機能です。たとえば、クライアントとサーバーがあり、両方がビジネスオブジェクトの永続性のためにデータ型を共有する必要がある場合です。通常のクラスサーバーサイドがあり、Webサービスでクライアントサイドを公開し、クライアントサイドを非常に美しく装飾したい場合は、クラスの部分バージョンを作成できます(クライアントサイドにはコード生成バージョンがありますプロキシ生成などによるサーバーバージョン)。
この例は、部分的な機能を拡張して使用するようになりました。最近では、Silverlightプロジェクトに取り組んでおり、切断されたオブジェクトを保持しています:)
//質問がメソッドを明示的に参照していることに気付かないでごめんなさい。パーシャルメソッドは、特定のシナリオで自動生成されるイベントハンドラーでコード機能を編むのに非常に便利です。
Microsoftプログラミングカルチャーは常に、より緩やかな「ダクトテープ」を好んでいます。アプローチ。これは、少なくともQuick BASIC対Turbo Pascalの戦争まで遡ります。 Microsoft言語ではショートカットが許可されています。デリゲートの例を見てみましょう。デリゲートとは、基本的に設計を忘れたインターフェイスのことです。部分的なメソッドも同じです。
質問のタイトルはEdsger DijkstraのCACMへの悪名高い手紙を参照しており、これは非常に適切です。ダイクストラの手紙は、構造化プログラミング戦争の公式の出発点でした。個人的に、すべての状況で構造化されたパスまたは構造化されていないパスのいずれかを提唱することで知恵を見つけることはないと思います。
この矛盾は、エンジニアリングとコンピューターサイエンスの観点の違いの結果であると常に考えてきました。 Earyのマイクロソフトプログラマーは、一日中ベアメタルをプログラミングしていました。十分なアセンブラーを作成した後、構造化プログラミングの指示は少しばかげているように見えます。
トレードオフは次のように要約されます:あなた自身を掛けるのに十分なロープが欲しいですか、または言語の柔軟性を満足させるためにあなたのアーキテクチャの一部を書き直さなければなりませんか?規律のあるチームはどちらの環境でも良いコードを書くことができ、普遍的な正しい答えはありません。
手元の質問に戻る:部分メソッドは素晴らしい言語機能ではないと思いますが、LINQを機能させるために必要な場合は、間違いなく許容する価値があります。