Beh, non posso essere sicuro di ciò che il tuo professore ha voluto dire, ma ho qualche idea.
Prima di tutto, il codice come questo può essere "non così ovvio":
someObjectPointer->foo()->bar()->foobar()
Non si può davvero dire che cosa è il risultato di foo()
, e quindi non si può davvero dire in cosa viene chiamato bar()
. È lo stesso oggetto? O forse è un oggetto temporaneo che viene creato? O forse è qualcos'altro?
Un'altra cosa è se devi ripetere il codice. Si consideri un esempio come questo:
complexObject.somePart.someSubObject.sections[i].doSomething();
complexObject.somePart.someSubObject.sections[i].doSomethingElse();
complexObject.somePart.someSubObject.sections[i].doSomethingAgain();
complexObject.somePart.someSubObject.sections[i].andAgain();
confrontarlo con tale:
section * sectionPtr = complexObject.somePart.someSubObject.sections[i];
sectionPtr->doSomething();
sectionPtr->doSomethingElse();
sectionPtr->doSomethingAgain();
sectionPtr->andAgain();
si può vedere come il secondo esempio non è solo più breve, ma più facile da leggere.
A volte la catena di funzioni è più facile, perché non c'è bisogno di preoccuparsi di ciò che essi ritornano:
resultClass res = foo()->bar()->foobar()
vs
classA * a = foo();
classB * b = a->bar();
classC * c = b->foobar();
Un'altra cosa è il debug. È molto difficile eseguire il debug di lunghe catene di chiamate di funzione, perché semplicemente non si riesce a capire quale di esse causa l'errore. In questo caso, rompendo la catena aiuta molto, per non parlare che si può fare alcuni controlli aggiuntivi anche, come
classA * a = foo();
classB * b;
classC * c;
if(a)
b = a->bar();
if(b)
c = b->foobar();
Quindi, per riassumere, non si può dire che si tratta di un "cattivo" o "buona "stile in generale. Devi prima considerare le tue circostanze.
Non l'ho mai sentito. L'unico vantaggio che riesco a vedere è che se si ottiene un errore da un puntatore nullo si può distinguere dal numero di riga che era il dereferenziamento, ed è leggermente più semplice esaminare il puntatore intermedio in un debugger. Ma se c'era il pericolo di una nullità di nullità dovresti controllarlo esplicitamente prima della seconda linea. No, non riesco a vedere una buona ragione. – Rup
È più facile eseguire il debug di una cosa. È più semplice verificare se il terminale è nullo. –
Forse perché ciò aiuterà quando si ha un riferimento negato a un puntatore nullo e si sta cercando di scoprire quale.In questo modo quando capisci la linea di errore (da un debugger ad esempio) saprai quale puntatore è) – Mohammad