嗯,我不确定你的教授是什么意思,但我有一些想法。
首先,这样的代码可能“不那么明显”:
someObjectPointer->foo()->bar()->foobar()
您无法真正说出 的结果是什么foo()
,因此您无法真正说出bar()
被调用的内容。那是同一个对象吗?或者它可能是一个正在创建的临时对象?或者也许是别的东西?
另一件事是如果你必须重复你的代码。考虑一个这样的例子:
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();
您可以看到第二个示例不仅更短,而且更易于阅读。
有时函数链更容易,因为您不需要关心它们返回的内容:
resultClass res = foo()->bar()->foobar()
对比
classA * a = foo();
classB * b = a->bar();
classC * c = b->foobar();
另一件事是调试。调试长链函数调用非常困难,因为您根本无法理解它们中的哪一个导致了错误。在这种情况下,打破链条有很大帮助,更不用说你也可以做一些额外的检查,比如
classA * a = foo();
classB * b;
classC * c;
if(a)
b = a->bar();
if(b)
c = b->foobar();
所以,总而言之,你不能说它是一种“坏”或“好”的风格。你必须首先考虑你的情况。