1

実装し始めているキャッシングのアイデアがあります。

関数をメモ化し、関数シグネチャのハッシュとともに戻り値をVelocityに保存します。PostSharpを使用して、関数を再度呼び出すのではなく、キャッシュをチェックして、戻り値の再水和された表現を返したいと思います。この動作を制御するために属性を使用したいと思います。

残念ながら、これは私の組織の他の開発者にとって危険であることが判明する可能性があります。彼らがパフォーマンスの向上に夢中になり、副作用のあるものも含めて、キャッシュ属性ですべてのメソッドを装飾し始める場合です。関数が副作用を引き起こす可能性があるとメモ化ライブラリが疑った場合、コンパイラの警告を出したいのですが。

CodeDomまたはReflectionを使用して、コードが副作用を引き起こす可能性があることをどのように知ることができますか?

4

3 に答える 3

8

これは、実際にも理論的にも非常に難しい問題です。メモ化、自動並列化など、正確にシナリオの副作用を防止または分離する方法について一生懸命考えていますが、それは難しく、C# の実行可能なソリューションにはまだほど遠いです。だから、約束はありません。(本当に副作用を排除したい場合は、Haskell への切り替えを検討してください。)

残念ながら、たとえ奇跡が起こり、副作用のあるメソッドのメモ化を防ぐ方法を見つけたとしても、まだ大きな問題がいくつかあります。次の点を考慮してください。

1) それ自体がメモ化された関数を呼び出している関数をメモ化するとどうなりますか? それは良い状況ですよね?メモ化された関数を構成できるようにしたい。しかし、メモ化には副作用があります。データをキャッシュに追加します! したがって、すぐにメタ問題が発生します。副作用を飼いならしたいのですが、「悪い」副作用だけです。奨励したい「良い」ものと、防ぎたい悪いもの、そしてそれらを区別するのは難しい.

2) 例外についてはどうしますか? 例外をスローするメソッドをメモ化できますか? その場合、常に同じ例外をスローしますか、それとも毎回新しい例外をスローしますか? 前者の場合、どのようにしますか?後者の場合、2 つの異なる例外がスローされるため、2 つの異なる呼び出しで 2 つの異なる結果を持つメモ化された関数が作成されます。例外は副作用と見なすことができます。例外を飼いならすのは難しいです。

3) 副作用はないが不純なメソッドについてどうするつもりですか? メソッド GetCurrentTime() があるとします。これには副作用はありません。呼び出しによって何も変更されません。ただし、2 つの呼び出しが異なる結果を生成する必要があるため、これはまだメモ化の候補ではありません。副作用検出器は必要ありません。純度検出器が必要です。

難しい技術的な問題を解決しようとするのではなく、教育とコードレビューを通じて人間の問題を解決することが最善の策だと思います。

于 2009-07-28T16:16:01.220 に答える
0

メタデータにはそのような属性がないため、Reflection自体はそれを行いません。

CodeDomは、すべてのIL命令を検査するほど強力ではない場合があります。

byte[]したがって、各メソッドの生のILを含むリフレクションAPIの非常に低レベルの部分を使用して、それを分析する必要があります。したがって、原則としては可能ですが、簡単ではありません。

すべての命令を分析し、それらがどのような影響を与えるか、およびそれらの影響が重要な範囲外で存続するかどうかを観察する必要があります(たとえば、戻り値またはoutパラメーターからリークする可能性のあるオブジェクトのフィールドを変更するか、またはメソッドの外部では到達できないことが保証されている一時的なオブジェクトを変更するだけですか?)

かなり複雑に聞こえます!

于 2009-07-28T15:35:10.633 に答える
0

簡単に言えば、CodeDom または Reflection ではできません。

メソッドが副作用を引き起こすかどうかを正確に判断するには、メソッドが実行しているアクションを理解する必要があります。.Net の場合、これは IL をクラックして開き、何らかの方法で解釈することを意味します。

Reflection も CodeDom も、この機能を提供しません。

  • CodeDom は、コードをアプリケーションに生成する方法であり、検査機能は非常に限られています。基本的に、さまざまな解析エンジンによって理解される言語のサブセットに限定されます。
  • リフレクションの強みは、メソッド本体の基礎となる IL ではなく、メタデータを検査する能力にあります。メタデータは、何が副作用を引き起こし、何が副作用を引き起こさないかについて、非常に限られた情報しか提供できません。
于 2009-07-28T15:30:18.723 に答える