nullオブジェクトパターンを使用して、場所全体でヌルチェックが多い大きなクラスをリファクタリングしています。これまでのところ、ほぼ円滑な変更が行われていましたが、私は最終結果にいくつかの問題を抱えています。より良い方法や違う方法があるのか、それとも元に戻すのかを知りたいと思います。Nullオブジェクトパターンにリファクタリングしようとしましたが、最終結果が悪化しているようです。
最大の問題は、私は次のコードを持っていることである。
IMyObject myObject = GetMyObject();
if(myObject != null && !myObject.BooleanProperty)
DoSomething();
あなたが見ることができるように、私はおそらく、この状態からヌルチェックを外すことができますが、私はデフォルト値に設定されている場合ブール型プロパティを持っていますコードを実行します。私がいつも真実を返すならば、私は発見して除去するのが辛い微妙なバグを導入するかもしれません。
もう一つの問題は、私はこのようなヌルからチェックを変更しなければならなかったということです。
if(myObject.GetType() != typeof(MyNullObject))
return false;
DoSomething();
だけではなく、ヌルをチェックする、今私は種類を確認する必要があるので、これは単なる醜いです。この種の状況は、オブジェクトのプロパティのいずれかを返さないか、メソッドの1つを実行していないため、このチェックを行う必要があるため、クラスで3回発生します。
最後に、オブジェクトにはnull可能ではないいくつかのDateTimeプロパティがあり、建築家はそれらをnullableにしたくありません。もう一度MinDateの値をデフォルトにすることで、いくつかの厄介なバグがコードにクロールする可能性があります。
あなたはそれを持っています。これは、ヌルオブジェクトパターンがスパゲッティのヌルチェックよりも悪い場合ですか?これを達成するより良い方法はありますか?
ご回答ありがとうございます。
オブジェクトのnullをテストするために静的メソッドまたは拡張メソッドを定義する方法と、null以外の場合はプロパティを返しますか?おそらく、オブジェクトがnullの場合にfalseを返す場合はPropertyNameOrFalse、そうでない場合はTrueを返すと仮定するとPropertyNameOrTrueと命名できます。オブジェクトが存在する場合はプロパティの値を返し、そうでない場合はdefaultValueを返すPropertyNameOrDefault(defaultValue)を持つこともできます。 – supercat