1

ここでの冗長コレクションのチェックに問題がありますか?:

SomeMethod()
{
    shapes = GetShapes();
    //maybe Assert(shapes.Any())?
    if(shapes.Any())
    {
        ToggleVisibility(shapes);
    }
}

ToggleVisibility(IEnumerable<Shape> shapes)
{
    //maybe Assert(shapes.Any())?
    if(shapes.Any())
    {
        //do stuff 
    }
}
4

6 に答える 6

1

Any()の呼び出しはコストのかかる操作ではないため、ここでは大きな問題はないと思います。

ToggleVisibilityの責任と動作が宣言されていないという小さな問題があります。ToggleVisibilityは、図形が空またはnullの場合の動作を呼び出し元に通知する必要があります。これを行う最良の方法は、XMLコメントを使用してIntellisenseに表示されるようにすることです。これにより、ToggleVisibilityの呼び出し元は、コレクションが空かnullかを確認する必要があるかどうかを判断できます。

于 2010-01-25T12:48:54.243 に答える
0

テストとデバッグのためにこれらのアサーションを追加する場合は、確かにそれは理にかなっています。

そのような状況では、物事がいつも期待どおりに進まない場合に通知されたいと思います。

ただし、本番環境では、図形コレクションの存在しないメンバーに呼び出しを行って、アプリケーション全体をタンクに入れたくない場合があります。

于 2010-01-25T10:04:28.990 に答える
0

コードコントラクトライブラリを使用できます。この場合、コードで事前条件(着信値の検証)、事後条件(結果の検証)、および不変条件(特定のクラスに対して常に真でなければならない条件)を動的に構成できます。

于 2010-01-25T11:43:48.340 に答える
0

ここで重要なのは責任を知ることだと思います。ToggleVisibilityを呼び出すすべての場所を知っていて、常に事前にチェックする予定の場合は、ToggleVisibilityメソッドをチェックインしないでください。

私の場合、ToggleVisibility内でチェックします。これにより、呼び出し元のコードがよりクリーンになり、50の異なる場所からToggleVisibility関数を呼び出すと、コードが大幅に少なくなります。

于 2010-01-25T19:25:13.453 に答える
0

答えは...いつものように...「状況によって異なります」ということをお勧めします。IEnumerableでAnyを呼び出すのは費用がかかりませんが、本当に必要ですか?これは、メソッドでコレクションを使用して何を計画しているかによって異なります。

コレクションが空であるために、メソッドが例外またはその他の望ましくないものをスローしますか?foreachを使用してコレクションを繰り返し処理していますか?もしそうなら、それはあなたのビジネスルールに反するかもしれませんが、空のコレクションを持っていることは必ずしも害を及ぼすことはありません。nullコレクションを反復処理しようとするのは明らかに異なります。

GetShapes()回答のフレームワークの例として使用します。私の考えを拡張するためToggleVisibility()に、空のコレクションを使用することは本当に違法ですか?明らかにあまり効果はありませんが、ユーザーが空の図形のセットを強調表示してから、可視性の切り替え機能をクリックした場合、何か悪いことはありますか?

于 2010-01-25T19:33:30.217 に答える
0

ToggleVisibility(IEnumerable<Shape>)がプライベートメソッドである場合(したがってSomeMethod()、同じライブラリ内にある必要があります)、リリースビルドにチェックを1回だけ含めることは間違いありません。チェックがいずれかの方法で行われるかどうかは、何が起こっているのかが何に意味があるかによって異なります。正しい実行でコレクションが空になることはないと予想される場合は、おそらくチェックは必要ありません。が10の異なる場所から呼び出され、それらのいずれかに空のコレクションがある可能性がある場合ToggleVisibility(IEnumerable<Shape>)は、呼び出し元が毎回チェックを行う負担を確実に軽減し、メソッド自体の中にそれを貼り付けるだけです。

がパブリックAPIの一部である場合ToggleVisibility(IEnumerable<Shape>)、APIのユーザーは何かを行う可能性が高く、すべてのパラメーターを常にチェックする必要があるため、必要なパラメーター検証を確実に実行する必要があります。メソッドのドキュメントに空のコレクションが無視されると記載されている場合はSomeMethod()、明らかにそれについて心配する必要はありません。それ以外の場合SomeMethod()は、冗長なチェックが行われることを意味する場合でも、通過するコレクションが有効であることを確認するために必要なことは何でも行う必要があります。

于 2010-01-25T20:17:56.730 に答える