Nullオブジェクトパターンと入力検証-実際の実装をコピーするか、すべてを黙って受け入れますか?


8

私が持っているWifiComponent私にはCamera私のクライアントアプリケーションで。カメラのWifi関連の機能を処理します。Cameraは実際のカメラを表します。

これWifiComponentは、有効にすることができます(この場合、接続ステータスのチェックやスキャンなど、それを使って行うことができます)または無効にすることができます(この場合、有効かどうかを確認する以外は、何もできません)。

作成するときCamera、私の中のクライアントアプリケーションを、私はそのかどうかを尋ねるカメラWifiComponent有効になっています。次にWifiComponentWifiComponentImplまたはの適切なサブクラスを作成しますNullWifiComponent

supportedWifiTypes()およびwifiScan()メソッドの実装は簡単です。NullWifiComponent任意の種類をサポートしていない、すぐには結果をスキャンしないと発見して行われます。

しかし今、私はbool connect(WifiNetwork network, String password)メソッドを実装する必要があります。接続に失敗したと言いたいのですが...でWifiEncryptionType提供されているものもサポートしていませんWifiNetwork。実際の実装ではIllegalArgumentException、サポートされていないWifiEncryptionTypewifiネットワークを渡すとスローされます。

私は...

  • リクエストをIllegalArgumentExceptionサポートしていないため、スローWifiEncryptionTypeしますか?
  • return false何が提供されていても、接続に失敗します()。

一般的な質問:

実際の実装が契約を満たし、この契約の一部が特定の入力に対して例外をスローすることである場合、null実装はその中立性または契約を優先する必要がありますか?


厳密に論理的なPOVから、カメラがないWifiEncriptionTypeので、カメラはを拒否しないため、をスローしないと言えIllegalArgumentExceptionます。だから、投げないと契約違反になるとは思いません。
SJuan76 2014年

私はカメラを持っていますが、デバイスAPIのカメラに実装されていないか、カメラに実際にはWifiアダプターがないため、APIを介してWifiをサポートしていません。私はあなたの要点を理解します。
Pimgd 2014年

クラスの契約を決して破らないでください。プログラムが何をするかについて推論するあなたの能力は、それが言うことをするすべてのコンポーネントに依存します。時々、あなたがやりたいことをするために契約または全体的なデザインを変更する必要があるが、決して契約を破らないでください。
Doval 2014年

1
しかし、なぜWi-Fiが無効になっている状況をカバーするための契約を履行できないのですか?この場合は、WifiDisabledException(たとえば、IllegalStateExceptionを拡張する)をスローするだけです。これにより、クライアントコードはそのような状況を認識し、それに適切に(たとえば、適切な指示で)応答できます。
lorus 14年

@lorus私はそのことを考えていませんでした。
Pimgd 2014年

回答:


4

null実装は、完全に機能する実装のドロップイン置換であると想定されているため、null実装は、実装するインターフェイスに完全に従う必要があります。

サポートされていないで呼び出された場合に例外WifiComponentconnect()スローされるようにインターフェースが指定している場合WifiEncryptionType、特にアプリケーションが同じWifiComponentインターフェースを使用しWifiEncryptionTypeてサポートされているを学習する必要がある場合、それはまさにnull実装が行うべきことです。

サポートされているWifiEncryptionTypeのリストがnull実装に由来しない場合、機能実装も例外をスローする必要がある場合にのみ、null実装は例外をスローする必要があります。

WifiComponent例外をスローする必要があることをインターフェースが指定していない場合は、値が機能的な実装に受け入れ可能であると想定し、一般的な接続障害を報告することをお勧めします(return false)。


WifiComponentのインターフェイスを変更することは許可されていますが、操作が難しくないことと、エラーが発生するだけでエラーが発生することのバランスを求めています。サポートされていない暗号化タイプを渡すのは開発者のエラーであり、nullオブジェクトパターンの使用はnullの処理を単純化するためであり、コントラクトの使用を単純化するためではないため、例外をスローするのが良い方法だと思います。
Pimgd 2014年

@pimgd同意します。サポートされているタイプのリストに含まれていない暗号化タイプが指定されている場合、これは明らかにプログラムロジックエラーであるため、例外をスローすることは間違いなく最良のオプションです。
Jules

@Pimgd:WifiComponentがまだ適切に設定されていない場合は、まず適切なコントラクトを定義してから、設定したコントラクトに違反しない絶対的な最小機能でnull実装を作成することをお勧めします。
Bart van Ingen Schenau 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.