Vâng, tôi không thể chắc chắn về những gì giáo sư của bạn đã làm có nghĩa là, bu tôi có một số suy nghĩ.
Trước hết, mã như thế này có thể là "không thể thấy rõ":
someObjectPointer->foo()->bar()->foobar()
Bạn không thể thực sự nói là kết quả của foo()
là gì, và do đó bạn có thể không thực sự nói trên bar()
được gọi là gì. Đó có phải là cùng một đối tượng không? Hoặc có thể là một đối tượng tạm thời của nó đang được tạo ra? Hoặc có thể nó là cái gì khác?
Một điều khác là nếu bạn phải lặp lại mã của mình. Hãy xem xét một ví dụ như thế này:
complexObject.somePart.someSubObject.sections[i].doSomething();
complexObject.somePart.someSubObject.sections[i].doSomethingElse();
complexObject.somePart.someSubObject.sections[i].doSomethingAgain();
complexObject.somePart.someSubObject.sections[i].andAgain();
Hãy so sánh nó với ví dụ:
section * sectionPtr = complexObject.somePart.someSubObject.sections[i];
sectionPtr->doSomething();
sectionPtr->doSomethingElse();
sectionPtr->doSomethingAgain();
sectionPtr->andAgain();
Bạn có thể xem như thế nào ví dụ thứ hai là không chỉ ngắn hơn, nhưng dễ đọc hơn.
Đôi khi chuỗi các chức năng dễ dàng hơn, bởi vì bạn không cần phải bận tâm với những gì họ trở về:
resultClass res = foo()->bar()->foobar()
vs
classA * a = foo();
classB * b = a->bar();
classC * c = b->foobar();
Một điều được gỡ rối. Rất khó để gỡ lỗi các chuỗi cuộc gọi chức năng dài, bởi vì bạn chỉ đơn giản là không thể hiểu được cái nào trong số chúng gây ra lỗi. Trong trường hợp này, phá vỡ chuỗi sẽ giúp rất nhiều, chưa kể bạn có thể làm một số kiểm tra thêm quá, giống như
classA * a = foo();
classB * b;
classC * c;
if(a)
b = a->bar();
if(b)
c = b->foobar();
Vì vậy, để tóm tắt, bạn không thể nói rằng đó là một "xấu" hay "tốt "phong cách nói chung. Bạn phải xem xét hoàn cảnh của bạn trước.
Tôi chưa từng nghe điều đó. Lợi ích duy nhất tôi có thể thấy là nếu bạn nhận được một lỗi từ một con trỏ null bạn có thể nói từ số dòng mà dereference nó được, và nó dễ dàng hơn để kiểm tra con trỏ trung gian trong một trình gỡ lỗi. Nhưng nếu có một nguy cơ của một dereference null bạn nên kiểm tra một cách rõ ràng cho nó trước khi dòng thứ hai. Không, tôi không thể thấy lý do chính đáng. – Rup
Dễ dàng gỡ lỗi một điều. Nó đơn giản hơn để kiểm tra nếu thiết bị đầu cuối là null. –
Có thể vì điều đó sẽ giúp ích khi bạn có một con trỏ rỗng và đã cố gắng tìm ra cái nào.Bằng cách này, khi bạn hiểu được dòng lỗi (từ trình gỡ lỗi chẳng hạn), bạn sẽ biết đó là con trỏ nào) – Mohammad