Là lồng sâu của dòng điều khiển trong mã là một vấn đề nghiên cứu?


8

Tôi đã làm cho các đồng nghiệp rằng các mức độ kiểm soát sâu có hại cho khả năng đọc mã.

Ví dụ, được lấy từ câu hỏi tràn ngăn xếp có liên quan /software/52685/if-you-need-more-than-3-levels-of-indentation-youre-screwed :

for(int i=0; i<10; ++i){
  Object val = repeat(i, someVar);
  if(val.value > 3){
    switch(val.item){
      case DOG:
        if(mProcess){
          outputToUser(val);
          doMoreThings(val, mMoreThingDoer);
          if(mRepurpose){
            addExample(val);
          }
          // and so on, and so on...

Như với hầu hết mọi thứ, thật dễ dàng để tìm thấy ý kiến ​​về chủ đề này.

Tuy nhiên, tôi tự hỏi nếu ai đó có thể đóng góp nhiều hơn thế.

Ví dụ đã được thực hiện một nghiên cứu thực tế có liên quan đến vấn đề?

Hoặc có thể đưa ra những lý lẽ khác vượt xa "Tôi thích X hơn"?


3
Có nhiều cách để giảm số lượng mức độ thụt. Trở về sớm là một trong số đó.
Robert Harvey

Nếu "bằng chứng theo thẩm quyền" có thể chấp nhận được, bạn có thể sử dụng tài liệu có liên quan từ Hoàn thành mã của Microsoft (lần xuất bản thứ 2), mà IIRC khuyến nghị không quá 3 hoặc 4 cấp độ lồng trong Sec. 19.4 (lập luận rõ ràng về sự hiểu biết bị mất vượt quá điểm đó).
hardmath

1
Mỗi cấp độ phạm vi sẽ thêm các điều bổ sung mà bạn cần giữ trong đầu để hiểu đúng chức năng của mã. Ký ức làm việc của một con người không lớn lắm . Cũng xem xét, sự phức tạp của đơn vị kiểm tra mã làm "nhiều hơn một điều".

Câu trả lời:


4

Googling nhanh chóng cho thấy một số nghiên cứu đã được thực hiện. Ví dụ, bài viết này cho thấy rằng có một giá trị về độ phức tạp theo chu kỳ của mã nhằm giảm thiểu tỷ lệ lỗi:

đồ thị sigmoid nông

Có lẽ làm tổ sâu có thể tốt miễn là nó không phân nhánh ở mọi điểm. Đó là, có nhiều điều kiện lồng nhau trên đầu, như trong ví dụ của bạn, có lẽ là tốt, vì về cơ bản nó là một điều kiện, chỉ không được viết dưới dạng kết hợp.

OTOH nếu câu lệnh chuyển đổi của bạn bên dưới lớn và có các nhánh không tầm thường, thì mệnh đề 'bạn bị lừa' có thể được áp dụng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.