4

null オブジェクト パターンを使用するように、null のチェックがあちこちにある大きなクラスをリファクタリングしています。これまでのところ、ほぼスムーズに変更されていますが、最終結果にいくつか問題があります。より良い、または別のアプローチがあるかどうか、または以前の方法に戻るかどうかを知りたい.

最大の問題は、次のコードがあることです。

IMyObject myObject = GetMyObject();
if(myObject != null && !myObject.BooleanProperty)
   DoSomething();

ご覧のとおり、おそらくこの条件から null チェックを削除できますが、デフォルト値に設定するとコードを実行するブール値のプロパティがあります。常に true を返すと、見つけて排除するのが困難な微妙なバグが発生する可能性があります。

もう 1 つの問題は、次のようにチェックを null から変更しなければならなかったことです。

if(myObject.GetType() != typeof(MyNullObject))
   return false;

DoSomething();

nullをチェックするだけでなく、型をチェックする必要があるため、これは単純に醜いです。オブジェクトのプロパティの 1 つを返したり、そのメソッドの 1 つを実行したりしていないため、このような状況がクラスで 3 回発生します。このチェックを行う必要があります。

そして最後に、オブジェクトには null 許容ではない DateTime プロパティがいくつかあり、設計者はそれらを null 許容にすることを望んでいません。ここでも、MinDate 値をデフォルトとして使用すると、厄介なバグがコードに侵入する可能性があります。

それで、あなたはそれを持っています。これは、スパゲッティ ヌル チェックがあちこちに散らばっているよりも、ヌル オブジェクト パターンの方が悪いだけの場合ですか? これを達成するためのより良い方法はありますか?

回答ありがとうございます。

4

4 に答える 4

1

コードをリファクタリングして、それDoSomething()が Null オブジェクトのメソッドであり、単に no-op として実装された方がよいでしょうか? Null Object の別の代替手段はMaybe<T>です。これにより、null チェックが少し読みやすくなり、コードの呼び出しがより安全になります。

于 2011-08-30T21:54:11.413 に答える
0

インターフェイス IMyObject にブール型の IsNull (IsEmpty) プロパティを追加し、そのプロパティに対して true を返す MyNullObject を実装します。明らかに、それ以外の場合は false を返す必要があることを信頼する必要があります。そうしないと、間違った動作をすることになります。

于 2011-08-30T21:52:50.447 に答える