Một hàm không nên có hai vòng for?

Hồi trước Đạt không nhớ đã đọc ở đâu, rất có thể là Code Complete 2, có nói rằng một hàm không nên có hai vòng for.

Lý do?

Bởi vì một vòng for đủ để thực hiện một công việc gì đó có ý nghĩa rồi. tại sao không tạo ra riêng một hàm chỉ để xử lý công việc của vòng for đó. Việc này sẽ giúp cho việc viết code rõ ràng hơn.

Chú ý:

  • Hai for lồng nhau tương đối ổn, Ba for trở đi là cực kỳ không ổn. Nếu tính về phần giải thuật thì số lần lặp là lập phương, chả biết nói sao, tức là O(n3).
for () {
    for () {
    }
}
  • Hai for rời rạc là không nên
void blah() {

    // for 1, doing foo   
    for () {    
    }

    // for 2, doing bar
    for () { 
    }
}

Nên thay for(1) làm một hàm và for(2) làm một hàm khác. Lý do là mỗi vòng for đã thể hiện một công việc riêng biệt rồi.

  • Khi đó ta sẽ có
void blah() {
    foo();
    bar();
}

Code thế này rõ ràng hơn phiên bản cũ. Các bạn thấy sao?

17 Likes

Em thấy như vậy là hợp lí, chúng ta code chú trọng vào tối ưu và rõ ràng, như vậy có thể coi là tối ưu được!

vậy mấy cái hàm sort có 2 vòng for thì bạn tách ra ntn? Vấn đề ở đây là bạn định nghĩa ntn là một công việc sẽ được thực thi trong một hàm, nếu để 2 vòng for mà vẫn có lý thì chả sao cả?

Ý mình không phải là 2 vòng for lồng nhau là không được, ý mình là, một hàm không nên có hai vòng for tách biệt. Như mình đã lưu ý ở trên.

1 Like

Ý anh Đạt đúng rồi, nên như vậy, nó liên quan đến refactor, có sách này “Refactoring: Improving the Design of Existing Code by Martin Fowler” thấy hay

1 Like

Vậy khó nhỏ, có bài bắt buột luôn thì sao ta?

I moved a post to a new topic: Vòng for(;:wink: có nghĩa là gì?

1 Like

Loang dầu dùng 2 vòng for tách nhau :smile:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?