0

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

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

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

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

各引数の null を確認します。

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

では、なぜですか?

4

4 に答える 4

1

ワーカー スレッドに何かを渡すときにスタックを失わないものが欲しいです。これに対する回避策も知りません (C#)。ワーカー スレッドが作成された時点までの親スレッドのスタックを把握できると便利です。

一般に、本当に便利なものの多くは言語に組み込む必要があり、ライブラリやフレームワークだけではきれいに実現できないと思います。高校では、関数のコメントに常に事前/事後条件を書くように教えられたのを覚えていますが、私が本当に見たいのは、可能であればコンパイル時にチェックされる事前/事後条件を書くことです。ランタイム。エディターがオプションで表示または非表示にできるように、何らかの方法でフラグを立てて、実際のコードを読むのを妨げないようにします。

于 2010-01-19T15:27:42.630 に答える
1

メソッド呼び出しをログに記録する場合は、 PostSharpなどの AOP フレームワークを使用できます。メソッドの事前/事後条件の強制などは、.net4.0 に同梱される新しいコード コントラクトライブラリなどのコントラクトによる設計メカニズムを使用して最もよく達成できます。メソッドによってはこれが有効な値である可能性があるため、null の引数をチェックするだけでは意味がありません。ソース関数で例外を処理したくない/処理できない可能性があるため、コードに Debug.Asserts を挿入すると問題が発生する可能性があります。プロジェクトごとに要件が大きく異なるため、この種の汎用フレームワークを作成することは、不可能ではないにしても非現実的だと思います。

編集:デバッグアサーションをメソッドに追加することに関する私のコメントを明確にするために-メソッド本体を次のようなものに変換するというあなたの提案を読みました:

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

これに関する問題は、Assert が false であってはならないことを示していることです。つまり、この構造は、メソッドが一般的に true でないものをスローできないことを意味します。問題は、メソッドがスローした場合、呼び出し元のメソッドが例外を適切に処理したとしても、アサーションが失敗することです。あなたのコメントから、あなたは次のようなことをしているようです:

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

    //rest of method
}

これは有用なプラクティスであり、コード コントラクト ライブラリは静的解析で「従来の」前提条件チェック (例外のスロー) をサポートしていると思います。

于 2010-01-19T15:28:02.320 に答える
1

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

于 2010-01-19T15:13:37.113 に答える
0

私はそのようなものがあるとは思わないし、もしそうなら、それは確かにそれほど使い物にならない. それはルールの定義に依存し、人によって考え方が異なり、ニーズやフレームワークも異なります...あなたが説明したことは、メタプログラミングまたはマクロシステムによって実現できます。Java では、注釈を使用してこのようなアプローチを実装するのに役立つプロジェクトがいくつかありますが、C# ユニバースに同等のものがあるかどうかはわかりません。ただし、 isValid() 機能は、契約による設計のアイデアとほとんど同じように見えます。おそらく、そのためのフレームワークがいくつかあります。

于 2010-01-14T12:43:11.213 に答える