5

最近、Null Object デザイン パターンに関するこの YouTube チュートリアルを見ました。何もしない NullCar が無限ループを起こすなどのエラーがありましたが、コンセプトはよく説明されていました。私の質問は、null になる可能性のあるオブジェクトにゲッターがあり、コードで使用されている場合はどうすればよいですか? デフォルトで返される値をどのように知ることができますか? または、すべてのオブジェクト内にこのパターンを実装する必要がありますか? 文字列またはプリミティブを返す必要がある場合はどうすればよいですか? 私はJavaの観点から話しています。

編集:デフォルト値のテストのためにnullオブジェクトをテストすることはありませんか? そうでない場合、なぜですか?

4

5 に答える 5

8

Null オブジェクトの目的は、コードに Null 参照が含まれないようにすることです。Null Object ゲッターによって返される値は、ドメインによって異なります。通常、ゼロまたは空の文字列が適切です。

Null Object パターンを現実の世界に置き換えると、あなたが求めていることは、「何歳の人がいないの?」と尋ねるのと同じです。

教えてはいけません原則に従っていないように見えるので、おそらくあなたのデザインは改善される可能性があります。

編集: Null オブジェクト デザイン パターンは、通常、オブジェクトが動作を別のオブジェクトに委任する場合に使用されます (戦略や状態のデザイン パターンなど)。Tom Hawtin - タックラインがコメントしたように、値を返すオブジェクトには特殊ケース オブジェクト を使用します。

于 2008-11-25T20:14:53.737 に答える
4

私が理解している限りでは、null オブジェクトの値は可能な限り「無」に近いという考えです。残念ながら、それは自分で定義する必要があることを意味します。例として、null 文字列を渡すことができない場合に個人的に "" を使用します。null オブジェクト番号は -1 です (ほとんどの場合、デフォルトではほとんどのデータベース シーケンスが 1 から始まり、アイテム id:sa ロットにそれらを使用するため、-1 です)。 null オブジェクトです)、リスト/マップ/セットではCollections.EMPTY_SETEMPTY_MAPなどEMPTY_LISTなどです。null オブジェクトを作成する必要があるカスタム クラスがある場合は、そこからすべての実際のデータを削除し、それがどこに行くのかを確認してから、「空」になるまで先に述べた内容を適用します。

したがって、デフォルトでどの値を返すかを実際に「知っている」わけではなく、自分で決定する必要があります。

于 2008-11-25T20:10:25.773 に答える
3

null になる可能性のあるオブジェクトにゲッターがあり、コードで使用されている場合はどうしますか? デフォルトで返される値をどのように知ることができますか?

実装するクラスをどのように知ることができますか? これは設計の問題であり、アプリケーションによって異なります。

一般的に言えば、NullObject パターンの目的は、条件がプログラミング言語の null 値との比較である特殊なケースで、Replace Conditional with Polymorphismリファクタリングをサポートすることです。

ビデオの例を正しく実装するには、driveCarメソッドをCarクラスに委譲する必要があります。およびクラスは、おそらく基本クラスの共有実装を介してループを実行し、 はSlowCarただちに戻ります。FastCarNullCar

Java コンテキストでは、NullCar.speed属性はおそらくボックス化されていない int になります。したがって、に設定することnullはオプションではありません。おそらく、アクセサーの背後にある属性を隠してNullCar.getSpeed、例外を発生させます。この例外を回避するためにテストが必要なクライアント コードは、代わりに car クラスに移動します。

使用可能な速度値に直接依存するすべての操作を委任することは、philippeが言及したオブジェクト指向設計のTell Don't Ask原則の適用です。

于 2008-11-25T20:21:18.107 に答える