ええと、あなたの教授が何を意味したのかはわかりませんが、私にはいくつかの考えがあります。
まず第一に、このようなコードは「それほど明白ではない」可能性があります。
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();
2番目の例が短いだけでなく、読みやすくなっていることがわかります。
関数が返すものを気にする必要がないため、関数のチェーンが簡単な場合があります。
resultClass res = foo()->bar()->foobar()
vs
classA * a = foo();
classB * b = a->bar();
classC * c = b->foobar();
もう1つはデバッグです。関数呼び出しの長いチェーンをデバッグすることは非常に困難です。なぜなら、それらのどれがエラーの原因であるかを単純に理解できないからです。この場合、チェーンを壊すことは大いに役立ちます。言うまでもなく、次のような追加のチェックも行うことができます。
classA * a = foo();
classB * b;
classC * c;
if(a)
b = a->bar();
if(b)
c = b->foobar();
したがって、要約すると、一般的に「悪い」または「良い」スタイルであるとは言えません。最初に自分の状況を考慮する必要があります。