質問

私はソフトウェアをより堅牢にするコードを書くのが嫌いです。これはフレームワークが行うべきことです。それで、コードを強化するコード「強化」ユーティリティを知っている人はいますか?

このようなものを自分で作成する必要がある場合は、次のように機能します。Debug フラグを使用してコードをコンパイルすると、各メソッドに「統合」コードが魔法のように自動的に追加されます。

コードを try-catch でワープし、catch に Debug.Assert(true) を置きます (例外が発生元でキャッチされるように)。

各メソッドのエントリをログに記録し、引数の「ToString()」値を出力して、何が起こっているかを追跡できるようにします。

各引数が null かどうかを確認します。

「IsValid」フレームワークを使用して、オブジェクト自体と各引数をチェックします。 IsValid() は、その期待が true であることを宣言するオブジェクトの方法です (たとえば、私が TableOfContentsEntry の場合、常に IsValid である Book に存在することを期待します) () そして、IsValid() であるページを指します。

では、なぜそうではないのでしょうか?

役に立ちましたか?

解決

あなたはメソッド呼び出しのログを記録したい場合は、

は、 PostSharp のようにAOPフレームワークを使用することができます。メソッドの事前/事後条件を強制するようなものは、最高の新しい<のhref =「http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx」のrel = "nofollowのように、契約による設計のメカニズムを使用して達成されるであろうnoreferrer「.net4.0で出荷されますのライブラリ>コード契約。これは、方法によっては、有効な値とすることができるので、それは確かにちょうどヌルの引数をチェックしても意味がありません。あなたは/ソース関数で例外を処理できるようにしたくないかもしれないので、コードにDebug.Assertsを注入することは問題である可能性があります。私は、要件がプロジェクト間でそれほど大きく異なりますので、この種のもののための汎用的なフレームワークを作成することは不可能ではないがあれば、それは非現実的だと思います。

EDIT:メソッドにデバッグアサーションを追加することについての私のコメントを明確にする - 私はこのような何かにメソッド本体を変換することにあなたの提案を読みます:

public void SomeMethod(args)
{
    try
    {
        //original method body
    }
    catch(Exception ex)
    {
        Debug.Assert(false);
        throw;
    }
}

これに伴う問題は偽になることはありません事を示しアサートことである - ので、この構築物は、方法は、一般的に真実ではありませんどの投げることはできないということを意味します。問題は、この方法がスローした場合、呼び出し元のメソッドが適切に例外を処理する場合でも、アサーションが失敗することになりました。あなたのコメントから、あなたがこのような何かをやっているようです。

public void SomeMethod(object arg)
{
    Debug.Assert(arg != null);
    if(arg == null) throw new ArgumentNullException("arg");

    //rest of method
}

これは便利練習です、と私は、コード契約ライブラリサポート「レガシー」前提条件がその静的解析では(例外を投げる)をチェックすると信じています。

他のヒント

私の本がプラグに差し込まれているのを見るのはうれしいです!私にとっての大きな問題は、コード生成は開発者のコ​​ードの「そば」にあることを目指すべきだと考えていることです。理想的には、生成されたコードが開発者のコ​​ードと混在しないようにする必要があります。この「固定化」コードを部分クラスとして、またはクラスとそれを呼び出しているクライアントの間に設定するプロキシとして追加する方法はあるのだろうか。もちろん、コードを生成して開発者のコ​​ードに挿入することは確かに可能ですが、開発者が変更を加えて「販売」コードを再生成するときに、ツールが古いコードを削除できるように、ある種の規則を作成する必要があります。コードを作成し、開発者のコ​​ードの最新バージョンに基づいて新しいコードを生成します。

私はあなたのワーカースレッドにオフに何かを渡すとき、あなたのスタックを失うことはありません何かを愛することになります。私も、この(C#の)の回避策を知りません。ワーカースレッドが作成された時点まで親スレッドのスタックを知ることは素晴らしいことだ。

は、一般的には、私は本当に便利なものの多くは、言語に組み込まれる必要があるだろうし、本当に一人でライブラリやフレームワークによってきれいに達成することはできないと思います。私は、彼らが常に機能のためのコメントでプリ/ポストの条件での書き込みを教え、高校で覚えて、しかし、私が本当に見たいことは、可能な場合に、その後でない場合は、コンパイル時にチェックされているプリ/ポストの条件を書いていますランタイム。彼らはそれが実際のコードを読み取る邪魔にならないように、エディタは、必要に応じてそれらを表示または非表示にすることができるようにいくつかの方法がフラグを立てることと思います。

私はそれがわからその使用可能ではありませんが、そこにそのようなことがあると疑う場合。それはあなたのルールの定義に、異なる人々は、異なると思う異なるニーズやフレームワークを持っている依存します... あなたが説明したものは、メタプログラミングまたはいくつかのマクロシステムによって達成することができました。 Javaでは、C#の宇宙の中でいくつかの同等があるかどうかわからない、このようなアプローチusign注釈を実装するために助けることができるいくつかのプロジェクトがあります。 isValid()機能は、しかし、おそらくそのためのいくつかのフレームワークがありますが、ほとんどの契約のアイデアにより、デザインのように見えます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top