1

質問の仕方がよくわかりませんが、次の状況についてどう思いますか、どの状況を好むか知りたいです。

私たちは、winforms を使用したクライアント サーバー アプリケーションで作業しています。また、別のフィールドに入力すると自動的に計算されるいくつかのフィールドを持つコントロールがあります。したがって、ユーザーが入力すると、別のフィールド、おそらくより多くのフィールドの自動入力が決定されるフィールド通貨があります。

ユーザーが通貨フィールドに値を入力すると、ユーザーが入力した文字列に基づいてキャッシュから Currency オブジェクトが取得されます。入力された通貨がキャッシュ内に見つからない場合、ヌル参照がキャッシュ オブジェクトによって返されます。さらに、アプリケーション層に通貨に基づいて他のフィールドを計算するように要求すると、null 通貨が指定された場合、null 固有のフィールドが返されます。このように、デフォルトの暗黙的な動作は、すべてのフィールドをクリアすることです。これは予想される動作です。より明確にするために、ユーザーが「利用できない通貨」を入力すると、もちろん通知されますが、入力された通貨に依存するフィールドもクリアする必要があります。これは、特定のコントロール値を null に設定することによって行われます。

私が明示的な実装と呼ぶのは、 Currency オブジェクトが null であることを確認することです。この場合、依存するフィールドは明示的にクリアされます。

後者のバージョンの方が明確で、エラーが発生しにくく、テストしやすいと思います。しかし、それは一種の冗長性を意味します。以前のバージョンは明確ではなく、テストで表現されていないアプリケーション層からの特定の動作を暗示しています。たぶん下位層のテストで、下位層を変更する必要が生じた場合、null 通貨が与えられた場合に何か他のものを返す必要がある場合、動機がないというだけのテストが障害になるとは思いません。上位層にバグを導入。

皆さんはどう思いますか?

4

3 に答える 3

2

明示的は暗黙的よりも優れています。- The Zen of Python、Tim Peters 著

私が全体を理解しているように、少し冗長で読みやすさを得る明示的な方法を使用しますが、私は常に、あいまいで魔法のような動作(一見すると明らかではないもの)よりもこれを好みます。

于 2010-03-21T09:22:36.473 に答える
1

まず、Dinu Florinは正しいです。通常、明示的な方が暗黙的なものよりも優れています(ただし、1つのサイズですべてに対応できるわけではないため、例外があります)。

次に、問題を正しく理解したかどうかはわかりませんが、Null-Objectパターンを確認することをお勧めします。アイデアは、データが利用できない場合でも、バックエンドは常に有効なデータオブジェクト(この場合は通貨オブジェクト)を返す必要があるということです。その場合、特別なNull-Objectが返されます。このオブジェクトは、通常のデータオブジェクトと同じインターフェイスを実装しますが、フィールドに特別な値が含まれている場合があります。アプリケーションが有効なデータオブジェクトとNullオブジェクトを区別する必要がないように設計する必要があります。

それがあなたのニーズに合うかどうかはわかりませんし、あなたの場合には当てはまらないかもしれませんが、あなたはそれを自分で判断する必要があります。

于 2010-03-21T10:37:39.207 に答える
0

あなたの質問を理解する方法は、次のアクションを決定するために NullReferenceException または null オブジェクトに依存する必要があるかどうかを比較していることです。

ここに私の考えがあります:

  1. 例外に依存する場合は、CurrencyNotFoundException などの独自のアプリケーション例外でラップします。呼び出し元は、その例外をチェックし、それに応じて動作する必要があります。このようにして、ボンネットの下で何が起こっているかがより明確になります。
  2. キャッシュから通貨が見つからないという状況が頻繁に発生すると予想される場合は、例外を回避することをお勧めします (通常の場合の「例外」ではありません)。null オブジェクト パターンを選択することもできます。このパターンでは、NullCurrency オブジェクトを返します。呼び出し元は一致するディスプレイ戦略を持っている可能性があり、そのうちの 1 つが NullCurrencyDisplayStrategy です。このように、null チェックに頼る必要はありません。返されたオブジェクトは、そのビジネス ドメイン内の有効なオブジェクトです。

それが役立つことを願っています

于 2010-03-21T10:18:08.630 に答える