Không có gì sai hoặc nhất thiết là xấu về các vòng lặp lồng nhau. Tuy nhiên, họ có những cân nhắc và cạm bẫy nhất định.
Các bài báo bạn đã được dẫn đến, có thể nhân danh sự ngắn gọn hoặc do một quá trình tâm lý được gọi là bị cháy, bỏ qua các chi tiết cụ thể.
Bị cháy là khi bạn có trải nghiệm tiêu cực về một cái gì đó với ngụ ý là bạn sau đó tránh nó. Ví dụ, tôi có thể cắt rau bằng một con dao sắc và tự cắt. Sau đó tôi có thể nói rằng những con dao sắc nhọn là xấu, đừng sử dụng chúng để cắt rau để cố gắng làm cho trải nghiệm tồi tệ đó không thể xảy ra nữa. Điều đó rõ ràng rất không thực tế. Trong thực tế bạn chỉ cần cẩn thận. Nếu bạn đang bảo người khác cắt rau thì bạn còn có cảm giác mạnh mẽ hơn về điều này. Nếu tôi hướng dẫn trẻ em cắt rau, tôi sẽ cảm thấy rất mạnh mẽ khi bảo chúng không sử dụng một con dao sắc nhọn đặc biệt là nếu tôi không thể giám sát chúng chặt chẽ.
Vấn đề là trong lập trình là bạn sẽ không đạt được hiệu quả cao nhất nếu bạn luôn thích sự an toàn trước tiên. Trong trường hợp này, những đứa trẻ chỉ có thể cắt rau mềm. Đối mặt với bất cứ điều gì khác và họ sẽ chỉ tạo ra một mớ hỗn độn bằng cách sử dụng một con dao cùn. Điều quan trọng là học cách sử dụng đúng các vòng lặp bao gồm các vòng lặp lồng nhau và bạn không thể làm điều đó nếu chúng bị coi là xấu và bạn không bao giờ thử sử dụng chúng.
Như nhiều câu trả lời ở đây chỉ ra một vòng lặp lồng nhau là một dấu hiệu cho thấy các đặc tính hiệu suất của chương trình của bạn, điều này có thể trở nên tồi tệ hơn theo cấp số nhân mỗi lần lồng. Đó là, O (n), O (n ^ 2), O (n ^ 3) và trên đó bao gồm O (n ^ độ sâu) trong đó độ sâu biểu thị số lượng vòng lặp bạn đã lồng. Khi làm tổ của bạn phát triển, thời gian cần thiết tăng theo cấp số nhân. Vấn đề là ở chỗ, đó không phải là một điều chắc chắn rằng sự phức tạp về thời gian và không gian của bạn sẽ là như vậy (thường là một * b * c nhưng không phải tất cả các vòng lặp có thể chạy mọi lúc) cũng không phải là một điều chắc chắn rằng bạn sẽ có một vấn đề hiệu suất ngay cả khi đó là.
Đối với nhiều người, đặc biệt là sinh viên, nhà văn và giảng viên thẳng thắn, hiếm khi lập trình để kiếm sống hoặc hàng ngày cho các vòng lặp cũng có thể là điều họ không quen và gây ra quá nhiều nhận thức về những cuộc gặp gỡ sớm. Đây là một khía cạnh có vấn đề bởi vì luôn có một đường cong học tập và tránh nó sẽ không hiệu quả trong việc chuyển đổi sinh viên thành lập trình viên.
Các vòng lặp lồng nhau có thể đi hoang dã, đó là chúng có thể kết thúc rất sâu. Nếu tôi đi qua từng châu lục, rồi qua từng quốc gia, rồi qua từng thành phố, rồi qua từng cửa hàng, rồi qua từng kệ, rồi qua từng sản phẩm nếu đó là một lon đậu qua từng hạt đậu và đo kích thước của nó để lấy trung bình thì bạn có thể thấy rằng sẽ làm tổ rất sâu. Bạn sẽ có một kim tự tháp và rất nhiều không gian lãng phí từ lề trái. Bạn thậm chí có thể cuối cùng đi ra khỏi trang.
Đây là một vấn đề sẽ có ý nghĩa hơn trong lịch sử khi màn hình nhỏ và độ phân giải thấp. Trong những trường hợp đó, thậm chí một vài cấp độ làm tổ thực sự có thể chiếm rất nhiều không gian. Đây là một mối quan tâm ít hơn hiện nay khi ngưỡng cao hơn mặc dù nó vẫn có thể gây ra vấn đề nếu có đủ lồng.
Liên quan là lập luận thẩm mỹ. Nhiều người không tìm thấy lồng nhau cho các vòng lặp thẩm mỹ trái ngược với bố cục với sự liên kết phù hợp hơn, điều này có thể hoặc không thể liên kết với những gì mọi người đã quen, theo dõi bằng mắt và các mối quan tâm khác. Tuy nhiên, có vấn đề ở chỗ nó có xu hướng tự củng cố và cuối cùng có thể khiến mã khó đọc hơn khi phá vỡ một khối mã và gói các vòng lặp đằng sau trừu tượng như các hàm cũng có nguy cơ phá vỡ ánh xạ mã theo luồng thực thi.
Có một xu hướng tự nhiên đối với những gì mọi người đã quen. Nếu bạn đang lập trình một cái gì đó theo cách đơn giản nhất thì xác suất không cần lồng là cao nhất, xác suất cần một cấp giảm xuống theo một độ lớn, xác suất cho cấp khác lại giảm xuống. Tần số giảm và về cơ bản có nghĩa là càng làm tổ sâu, các giác quan của con người càng ít được huấn luyện để dự đoán nó.
Liên quan đến điều đó là trong bất kỳ cấu trúc phức tạp nào, có thể xem xét một vòng lặp lồng nhau, thì bạn nên luôn luôn hỏi đó là giải pháp đơn giản nhất có thể vì có tiềm năng cho một giải pháp bị bỏ lỡ cần ít vòng lặp hơn. Điều trớ trêu là một giải pháp lồng nhau thường là cách đơn giản nhất để tạo ra thứ gì đó hoạt động với lượng nỗ lực, độ phức tạp và tải nhận thức tối thiểu. Nó thường tự nhiên để làm tổ cho các vòng lặp. Nếu bạn xem xét ví dụ một trong những câu trả lời ở trên, cách nhanh hơn nhiều so với vòng lặp lồng nhau cũng phức tạp hơn nhiều và bao gồm nhiều mã hơn đáng kể.
Cần phải hết sức cẩn thận vì thường có thể loại bỏ các vòng lặp trừu tượng hoặc làm phẳng chúng với kết quả cuối cùng là một phương pháp chữa trị tồi tệ hơn căn bệnh này, đặc biệt nếu bạn không nhận được sự cải thiện hiệu suất đáng kể và có thể đo được từ nỗ lực.
Mọi người thường gặp phải các vấn đề về hiệu năng liên quan đến các vòng lặp đang bảo máy tính lặp lại một hành động nhiều lần và thường sẽ liên quan đến các tắc nghẽn về hiệu suất. Thật không may, phản ứng với điều này có thể rất hời hợt. Mọi người thường thấy một vòng lặp và thấy một vấn đề về hiệu suất khi không có vòng lặp và sau đó ẩn vòng lặp khỏi tầm nhìn để không có hiệu quả thực sự. Mã "trông" nhanh nhưng đặt nó trên đường, đánh lửa, đặt chân ga và nhìn vào đồng hồ tốc độ và bạn có thể thấy nó vẫn nhanh như một bà già đang đi trên khung hình zimmer của mình.
Kiểu ẩn này tương tự như nếu bạn có mười kẻ lừa đảo trên tuyến đường của bạn. Nếu thay vì có một con đường thẳng đến nơi bạn muốn đi, bạn hãy sắp xếp nó để có một kẻ buôn lậu đằng sau mỗi góc, nó sẽ tạo ảo giác khi bạn bắt đầu hành trình của mình rằng không có kẻ lừa đảo. Xa mặt cách lòng. bạn vẫn sẽ bị lừa mười lần nhưng bây giờ bạn sẽ không thấy nó đến.
Câu trả lời cho câu hỏi của bạn là cả hai, nhưng không có mối quan tâm nào là tuyệt đối. Họ hoàn toàn chủ quan hoặc chỉ khách quan theo ngữ cảnh. Thật không may, đôi khi ý kiến hoàn toàn chủ quan hay đúng hơn chiếm ưu thế và chiếm ưu thế.
Theo nguyên tắc thông thường, nếu nó cần một vòng lặp lồng nhau hoặc có vẻ như là bước rõ ràng tiếp theo, tốt nhất không nên cố tình và chỉ cần làm điều đó. Tuy nhiên nếu có bất kỳ nghi ngờ nào kéo dài thì nên xem lại sau.
Một nguyên tắc nhỏ khác là bạn phải luôn kiểm tra cardinality và tự hỏi mình rằng vòng lặp này sẽ là một vấn đề. Trong ví dụ trước tôi đã đi qua các thành phố. Để thử nghiệm tôi chỉ có thể đi qua mười thành phố nhưng số lượng thành phố tối đa hợp lý để mong đợi sử dụng trong thế giới thực là bao nhiêu? Sau đó tôi có thể nhân số đó với cùng một lục địa. Đó là một quy tắc để luôn luôn cân nhắc với các vòng lặp, đặc biệt là lặp đi lặp lại một lượng động (biến) số lần có thể chuyển thành dòng xuống.
Bất kể luôn luôn làm những gì làm việc đầu tiên. Cách mà bạn thấy một cơ hội để tối ưu hóa, bạn có thể so sánh giải pháp tối ưu hóa của mình với cách dễ nhất để làm việc và xác nhận rằng nó mang lại lợi ích như mong đợi. Bạn cũng có thể mất quá nhiều thời gian để tối ưu hóa quá sớm trước khi các phép đo được thực hiện và điều đó dẫn đến YAGNI hoặc rất nhiều thời gian lãng phí và thời hạn bị bỏ lỡ.