もキレイに処理する方法はnull参照オブジェクトhierarcy
-
09-09-2019 - |
質問
私エクスペディアの扱いにnullの参照オブジェクト上位の階層となります。
ie:
if(null == Object1.Object2.Object3.Property)
この例するNull以外の参照例外の場合もObject2はnullになります。
私の場合は注意を払っていない何かがnullの場合、そのものです。んですが、いい/捕それぞれの場所をもう少し前向きなことをやりたいこのような、見ています。
私は実は??オペレーターがこも醜みコードします。
そのアイデア。
解決
さて、これは接線であるかもしれない...しかし、私は醜さとを避けるために設計変更をお勧めしたいの痛み
の呼び出しObject1.Object2.Object3.Property
はデメテルするの法律に違反します。あなたは、そのプロパティを取得することになっている場合代わりに、オブジェクト1は、プロパティ自体を公開する必要があります...だから、Object1.RetrievedFromTheDepthsProperty
の
を呼び出すべきです
これが必要なのはなぜ..タイプObject2にの設計者は、あなたが探しているプロパティを持っていないものに「オブジェクト3」フィールド/プロパティによって返されるオブジェクトの種類を変更した場合、あなたはまずいことだろうということです。クライアントは、オブジェクト1の内部構造についてはあまり知っています。データが内部的に配置されている場所オブジェクト1がカプセル化された場合は、将来の変更に対して安全であると思います。また、このプロパティは内部的にチェックすべてのNULLを行うことができ、必要に応じ...よりクリーンであなたを残し
if (Object1.RetrievedFromTheDepthsProperty == null) {...}
他のヒント
この(nullで安全な間接参照)時折上げます何かあり、なし。
:以外に現時点では何もきちんと答えは、ありませんif(Object1 == null || Object1.Object2 == null
|| Object1.Object2.Object3 == null
|| Object1.Object2.Object3.Property == null)
あなたは(変数を導入することにより)必要がある場合は、いくつかのマイナーなキャッシングを行うことができますが、それはさらに醜い取得します。
SomeType2 obj2;
SomeType3 obj3;
if(Object1 == null || (obj2 = Object1.Object2) == null
|| (obj3 = obj2.Object3) == null
|| obj3.Property == null)
あなたは本当に、<全角>本当にが二度プロパティを呼び出すにしたくない場合を除き、一般的には、私は上記のに対して助言する(それは財産よりも多くの作業を行うために必要があります)。
あなたはヌルオブジェクトパターンを使用することができます。
class Car {
Engine engine = null;
public Engine Engine {
get {
return engine ?? new NullEngine();
}
}
}
class Engine {
string make;
public virtual string Make { get { return make; } }
}
class NullEngine : Engine {
public override string Make { get { return null; } }
}
次に、あなたが行うことができます:
Car car;
if (car.Engine.Make != null) Console.WriteLine(car.Engine.Make);
の代わりに:
Car car;
if (car.Engine != null && car.Engine.Make != null) Console.WriteLine(car.Engine.Make);
あなたの全体モデルの「ヌルオブジェクト」を定義する作業のかなり多くあることに注意してください。また、あなたは、モデルのユーザーを混同しないように細心の注意を払う必要があります。コードは、あなたがnullの周りに渡し、それをチェックするのを忘れた場合すぐに爆破する傾向があるが、「nullオブジェクトは、」簡単に深いコールスタックに生き残るためには、それが本当の目的ではないので、微妙な問題を引き起こす可能性があります。
直接的な応答におうかがいかにヒント:
- 使ってみ Nullオブジェクト
- それだけではないよう適切なの階層をここまで(ごはんのレベル)のなかには何らかの方法第一/第二レベルに達していることの回答のう
一般的に、あなたのオブジェクト階層内のNULLだったが、それに対してテストしない性質気にしない場合。 (これはアプリケーションのASP.NET、リサイズ、...の種類に依存します)アプリケーションのためのグローバルエラーハンドラを使用して、ユーザー何かが間違っていたと言っています。
私は強くあなたが以下のポストに見えることをお勧めしたいです。 http://www.hardcodet.net/2008/ 12 /観察-依存関係スルーラムダ式の-part1をする
これは、同様の問題を意味し、また、あなたが簡単に変更を処理することができます。