あなたの教授が何を意味していたのか分かりません。私はいくつかの考えを持っています。
まず第一に、このようなコードは「それほど明白ではない」ことができます。
someObjectPointer->foo()->bar()->foobar()
あなたが本当にfoo()
の結果が何であるかを言うことはできませんので、あなたが本当に上の言うことができませんbar()
は何が呼び出されていますか?それは同じ対象ですか?それとも、作成されている一時オブジェクトですか?それとも別のものか?
もう1つのことは、コードを繰り返す必要がある場合です。このように例を考えてみましょう:
complexObject.somePart.someSubObject.sections[i].doSomething();
complexObject.somePart.someSubObject.sections[i].doSomethingElse();
complexObject.somePart.someSubObject.sections[i].doSomethingAgain();
complexObject.somePart.someSubObject.sections[i].andAgain();
は、このようなとそれを比較:
section * sectionPtr = complexObject.somePart.someSubObject.sections[i];
sectionPtr->doSomething();
sectionPtr->doSomethingElse();
sectionPtr->doSomethingAgain();
sectionPtr->andAgain();
あなたは第二の例は短いが、読みやすいだけでなく、どのように見ることができます。
あなたは、彼らが戻る何を気にする必要はありませんので、時々機能のチェーンは、簡単です。もう一つは、デバッグしている
classA * a = foo();
classB * b = a->bar();
classC * c = b->foobar();
対
resultClass res = foo()->bar()->foobar()
。関数呼び出しの長いチェーンをデバッグするのは非常に難しいです。なぜなら、エラーの原因となっているものがどれだけあるかを理解できないからです。この場合、チェーンを破壊することは、それが良い」「悪い」かであると言うことはできません、あなたは要約するので
classA * a = foo();
classB * b;
classC * c;
if(a)
b = a->bar();
if(b)
c = b->foobar();
、のように、あまりにもいくつかの余分なチェックを行うことができますもちろんのこと、多くのことができます"一般的なスタイル。まずあなたの状況を考慮する必要があります。
私はそれを聞いたことがない。私が見ることができる唯一のメリットは、ヌルポインタからエラーが発生した場合には、それが参照されていた行番号から判断することができ、デバッガで中間ポインタを調べるほうが少し簡単です。しかし、ヌル参照解除の危険がある場合は、2行目の前に明示的にチェックする必要があります。いいえ、私は正当な理由を見ることができません。 – Rup
1つのことをデバッグする方が簡単です。端末がnullであるかどうかをテストする方が簡単です。 –
これは、逆参照されたヌルポインタを持ち、どのポインタを見つけようとしているときに役に立ちます。このようにしてエラーの行を理解すると(たとえば、デバッガから)、それはどのポインタであるかわかります。 – Mohammad