İç içe geçmiş döngüler için doğal olarak yanlış veya zorunlu olarak bile kötü bir şey yoktur. Ancak, bazı önemli hususları ve tuzakları var.
Öncelikle kısaltılmış olduğunuz ya da yanık olarak bilinen psikolojik bir süreç yüzünden yönlendirdiğiniz makaleler, ayrıntıların üzerinden geçiyor.
Yanmış olmak, ima eden varlıkla ilgili olumsuz bir deneyim yaşadığınızda ve bundan kaçınmanız demektir. Mesela sebzeleri keskin bir bıçakla kesip kendimi kesebilirim. Daha sonra keskin bıçakların kötü olduğunu söyleyebilirim, bu kötü deneyimin bir daha yaşanmasını imkansız kılmak için onları sebze kesmek için kullanmadıklarını söyleyebilirim. Bu kesinlikle çok pratik değil. Gerçekte, sadece dikkatli olmanız gerekir. Başka birine sebze kesmesini söylüyorsanız, o zaman daha da güçlü bir şekilde hissedersiniz. Çocuklara sebze kesmelerini söyleseydim, özellikle onları yakından denetleyemezsem, keskin bir bıçak kullanmamalarını söylerken çok kuvvetli hissederdim.
Sorun programlamada, her zaman önce güvenliği tercih ediyorsanız en yüksek verimlilikle karşılaşmamanızdır. Bu durumda çocuklar sadece yumuşak sebzeleri kesebilir. Başka bir şeyle karşı karşıya kaldıklarında sadece keskin bir bıçak kullanarak karışıklık çıkaracaklar. Yuvalanmış döngüler dahil olmak üzere döngülerin uygun kullanımını öğrenmek önemlidir ve kötü sayılırlarsa ve bunları kullanmaya çalışmazsanız bunu yapamazsınız.
Buradaki birçok cevap, iç içe geçme için bir yuvaya işaret ettiğinden, programınızın performans artış özelliklerinin bir göstergesidir; bu da her bir yuvaya katlanarak kötüleşebilir. Bu, O (n), O (n ^ 2), O (n ^ 3) ve benzerlerini içerir; burada derinlik iç içe geçirdiğiniz kaç döngüyü temsil eder, O (n ^ derinlik). Yuvalama işleminiz büyüdükçe, gereken zaman katlanarak büyür. Bununla ilgili sorun şu ki, zamanınız veya mekan karmaşıklığınızın (oldukça sık sık bir * b * c ama tüm yuva döngülerinin her zaman çalışabileceği) olacağının kesinliği değil, ne de sizin öyle olsa bile bir performans sorunu var.
Pek çok insan için, özellikle de öğrenciler, dürüst olmak gerekirse, döngüler için günlük yaşamda nadiren program yapan yazarlar ve öğretim görevlileri, alışkın olmadıkları ve erken karşılaşmalarda çok fazla bilişsel yüke neden olan bir şey olabilir. Bu sorunlu bir durumdur çünkü daima bir öğrenme eğrisi vardır ve onlardan kaçınmak öğrencileri programcılara dönüştürmede etkili olmayacaktır.
İç içe döngüler çılgınca gidebilir, yani çok derinlere yuvalanmış olarak sona erebilirler. Her kıtaya, daha sonra her bir ülkeye, sonra her bir şehre, sonra her bir mağazaya, daha sonra her rafa, sonra her bir ürüne bakacak olursam, her bir fasulyeden bir fasulye kovanı alıp ortalamayı elde etmek için boyutunu ölçmek Bunun çok derine yuvalanacağını görebiliyorum. Sol kenar boşluğundan uzakta bir piramit ve boşa harcanacak bir yeriniz olacak. Sayfadan çıkmayı bile başarabilirsin.
Bu, ekranların küçük ve düşük çözünürlükte olması tarihsel olarak daha önemli bir sorundur. Bu durumlarda, birkaç iç içe geçme seviyesi bile gerçekten çok fazla alan kaplayabilir. Bu, günümüzde eşiğin daha yüksek olduğu yerlerde daha az bir endişe kaynağı olmasına rağmen, yeterli yuvalama varsa hala sorun yaratabilir.
İlgili estetik argümandır. Birçok insan, daha tutarlı bir hizalamaya sahip yerleşim düzenlerinin aksine, insanların alışkın olduğu, göz takibi ve diğer kaygılarla bağlantılı olabileceği veya bununla bağlantılı olamayacak şekilde estetik olarak hoş görünen döngüler iç içe bulamazlar. Bununla birlikte, kendi kendini pekiştirme eğiliminde olması ve sonuçta kodun bir blok bloğunun parçalanması ve soyutlamaların arkasına sarılması gibi fonksiyonların soyutlanması arkasındaki kodların yürütme akışına eşleştirilmesi riskini almak için okumayı zorlaştırması problemlidir.
İnsanların alıştığı şeylere karşı doğal bir eğilim var. Eğer bir şeyi en basit şekilde programlıyorsanız, yuvalamaya ihtiyaç duymama olasılığı en yüksek, bir seviyeye ihtiyaç duyma olasılığı büyüklük sırasına göre düşer, başka bir seviye için olasılık tekrar düşer. Frekans düşüyor ve esasen iç içe geçme derinliği, insan duyularının ne kadar az eğitimli olduğunu önceden tahmin ediyor.
Bununla ilişkili olarak, iç içe bir döngünün düşünülebileceği herhangi bir karmaşık yapıda, o zaman her zaman sormanız gereken, daha az döngüye ihtiyaç duyan cevapsız bir çözüm potansiyeli olduğu için mümkün olan en basit çözümün olmasıdır. Buradaki ironi, iç içe geçmiş bir çözümün, asgari çaba, karmaşıklık ve bilişsel yük ile çalışan bir şey üretmenin en basit yoludur. Döngüler için yuva yapmak genellikle doğaldır. Örneğin, döngü için iç içe geçmekten çok daha hızlı bir yolun da çok daha karmaşık olduğu ve önemli ölçüde daha fazla koddan oluştuğu yukarıdaki yanıtlardan birini düşünüyorsanız.
Döngüleri soyutlamak ya da düzleştirmek için çoğu zaman mümkün olduğu için son derece özen gösterilmesi gerekir, ancak sonuçta hastalıktan daha kötü bir tedavi olabilir, özellikle de örneğin çabadan ölçülebilir ve anlamlı bir performans artışı elde edemiyorsanız.
İnsanların sık sık performans sorunları yaşamaları çok yaygındır; bu işlem, bilgisayara bir eylemi birçok kez tekrar etmesini söyleyen ve doğal olarak genellikle performans darboğazlarına karışacak olan döngülerle ilgilidir. Maalesef buna verilen cevaplar çok yüzeysel olabilir. İnsanların bir döngü görmesi ve hiçbir şeyin olmadığı bir performans problemi görmesi ve daha sonra döngüyü görünmeden gerçek bir etkiye kadar gizlememesi yaygınlaşır. Kod "hızlı" görünüyor, ancak yola koydu, kontağı açın, gaz pedalını döşeyin ve hız ölçere bir bakın ve bunun hala onun zimmer karesinde yürüyen yaşlı bir kadın kadar hızlı olduğunu görebilirsiniz.
Bu tür bir gizleme, rotanız üzerinde on kupa sahibi olmanıza benzer. Gitmek istediğiniz yere giden düz bir rotaya sahip olmak yerine, onu her köşenin arkasında bir kupa olacak şekilde düzenlersiniz, o zaman yolculuğunuza başlamazken yanıltıcı olmaz. Gözden ırak olan gönülden de ırak olur. hala on kez tecavüze uğrayacaksın ama şimdi bunun geldiğini görmeyeceksin.
Sorunuzun cevabı her ikisinin de olduğu, ancak endişelerin hiçbiri kesin değil. Ya tamamen özneldirler ya da yalnızca bağlamsal olarak nesneldirler. Maalesef bazen tamamen öznel veya daha doğrusu görüş emsal alır ve hâkimdir.
Temel bir kural olarak, iç içe geçmiş bir döngüye ihtiyaç duyuyorsa veya bir sonraki açık adıma benziyorsa, bunu kasıtlı yapmamak ve basitçe yapmak en iyisidir. Ancak herhangi bir şüphe varsa, o zaman daha sonra gözden geçirilmelidir.
Diğer bir kural, kardinaliteyi her zaman kontrol etmeniz ve kendinize sormanızın, bu döngünün bir problem olacağıdır. Önceki örneğimde şehirlerden geçtim. Testler için sadece on şehirden geçebilirim ama gerçek dünya kullanımında beklenebilecek makul maksimum şehir sayısı nedir? O zaman bunu kıtalar için aynı şekilde çarpabilirim. Her zaman döngülerle birlikte düşünmek bir kuraldır, özellikle de çizgide aşağıya çevrilebilecek dinamik (değişken) bir süreyi tekrarlar.
Ne olursa olsun, her zaman önce işe yarayanı yapın. Optimizasyon için bir fırsat gördüğünüzde, optimize edilmiş çözümünüzü çalışmak için en kolay olanla karşılaştırabilir ve beklenen faydaları sağladığını doğrulayabilirsiniz. Ölçümler gelmeden ve YAGNI'ye veya çok fazla boşa harcanan zaman ve cevapsız son teslim tarihine neden olmadan önce erken optimizasyon yapmak için çok uzun zaman harcayabilirsiniz.