У вкладених петлях немає нічого поганого або обов'язково навіть поганого. Однак вони мають певні міркування та проблеми.
Статті, до яких вам привели, ймовірно, в ім'я стислості або через психологічний процес, відомий як спалений, пропускаючи специфіку.
Спалюватися - це коли ти маєш негативний досвід чогось із того, що має на увазі, то ти цього уникаєш. Наприклад, я можу гострим ножем порізати овочі і порізати себе. Тоді я можу сказати, що гострі ножі погані, не використовуйте їх для різання овочів, щоб спробувати унеможливити повторення цього поганого досвіду. Це, очевидно, дуже непрактично. Насправді потрібно просто бути обережними. Якщо ви говорите комусь іншому порізати овочі, то у вас є ще сильніше почуття цього. Якби я доручав дітям порізати овочі, я б дуже наголосив сказати їм не користуватися гострим ножем, особливо якщо я не можу уважно їх контролювати.
Проблема в програмуванні полягає в тому, що ви не будете досягати пікової ефективності, якщо завжди в першу чергу віддаєте перевагу безпеці. У цьому випадку дітки можуть нарізати тільки м’які овочі. Зіткнувшись з чим-небудь іншим, і вони лише збираються зіпсувати це за допомогою тупого ножа. Важливо навчитися правильному використанню циклів, включаючи вкладені петлі, і ви не можете цього робити, якщо вони вважаються поганими, і ви ніколи не намагаєтесь їх використовувати.
Оскільки тут багато відповідей зазначають, що вкладений цикл є вказівкою характеристик продуктивності вашої програми, які можуть ставати експоненціально гіршими кожного гніздування. Тобто O (n), O (n ^ 2), O (n ^ 3) і так далі, що включає O (n ^ глибина), де глибина являє собою кількість петель, які ви вклали. У міру зростання вашого гніздування необхідний час зростає експоненціально. Проблема полягає в тому, що це не впевненість у тому, що ваша часова чи просторова складність буде такою (досить часто a * b * c, але не всі петлі гнізда можуть працювати весь час), а також не впевненість, що ви мати проблеми з роботою, навіть якщо це так.
Для багатьох людей, зокрема студентів, письменників та викладачів, які, чесно кажучи, рідко програмують на життя чи щоденно для циклів, також може бути те, до чого вони не звикли, і що викликало занадто велике пізнавальне навантаження на ранніх зустрічах. Це проблематичний аспект, тому що завжди існує крива навчання, і уникати цього не може бути ефективним у перетворенні студентів на програмістів.
Вкладені петлі можуть розійтися, тобто вони можуть вбудуватись дуже глибоко. Якщо я проходжу через кожен континент, то через кожну країну, потім через кожне місто, потім через кожен магазин, потім через кожну полицю, потім через кожен продукт, якщо це банка з квасолею через кожну квасолю і вимірюю її розмір, щоб отримати середнє значення, то ви бачимо, що гніздишся дуже глибоко. У вас буде піраміда та багато витраченого простору від лівого краю. Ви навіть можете перейти на сторінку.
Ця проблема була б більш істотною, коли екрани були невеликими та мали низьку роздільну здатність. У цих випадках навіть кілька рівнів гніздування можуть по-справжньому займати багато місця. Сьогодні це менше занепокоєння, коли поріг вище, хоча він все ще може створити проблему, якщо достатньо гніздування.
Пов’язаний аргумент естетики. Багато людей не знаходять вкладені петлі з естетичного вигляду на відміну від макетів з більш послідовним вирівнюванням, це може бути, а може і не бути пов’язане з тим, до чого звикли люди, відстеженням очей та іншими проблемами. Однак це проблематично тим, що воно, як правило, самозміцнюється, і в кінцевому підсумку може ускладнити читання коду, оскільки розбиття блоку коду та інкапсуляція циклів за абстракціями, такими як функції, також ризикує порушити відображення коду до потоку виконання.
Існує природна тенденція до того, до чого люди звикли. Якщо ви програмуєте щось найпростішим способом, ймовірність того, що не потрібно гніздування, є найвищою, ймовірність необхідності одного рівня знижується на порядок, ймовірність іншого рівня знижується знову. Частота, що падає, і по суті означає глибше гніздування, тим менш навчені людські почуття повинні передбачити це.
З цим пов’язано те, що в будь-якій складній конструкції, яку можна вважати вкладеною циклом, завжди слід запитати, що найпростіше можливе рішення, оскільки існує потенціал для пропущеного рішення, що потребує меншої кількості циклів. Іронія полягає в тому, що вкладене рішення часто є найпростішим способом виготовити щось, що працює з мінімальною кількістю зусиль, складності та пізнавального навантаження. Часто природно гніздитися за петлями. Якщо розглядати, наприклад, один з вищезазначених відповідей, де набагато швидший шлях, ніж вкладений цикл, також набагато складніший і складається зі значно більше коду.
Потрібна велика обережність, оскільки часто можна абстрагувати петлі або вирівняти їх, але кінцевий результат, в кінцевому рахунку, є ліком гіршим від захворювання, особливо якщо ви, наприклад, не отримуєте вимірюваного та значного підвищення продуктивності від зусиль.
Люди часто зустрічаються з проблемами продуктивності, пов’язаними з циклами, які спонукають комп'ютер повторювати дію багато разів і за своєю суттю часто буде задіяний у вузьких місцях. На жаль, відповіді на це можуть бути дуже поверхневими. Людям стає звичайним бачити цикл і бачити проблему з продуктивністю там, де її немає, а потім приховувати цикл від погляду до реального ефекту. Код "виглядає" швидко, але поставте його на дорогу, ввімкніть запалення, підлогу прискорювача і погляньте на спідометр, і ви можете виявити, що це все-таки так швидко, як бабуся, яка ходить за рамкою зіммер.
Цей вид приховування схожий на те, якщо у вас на маршруті десять мандрівників. Якщо замість того, щоб мати прямий маршрут туди, куди ви хочете поїхати, влаштуйте його так, щоб за кожним кутом стояв грязець, то це дає ілюзію, коли ви починаєте свою подорож, що немає мандрівників. З очей геть з серця геть. Ви все ще збираєтеся пограбувати десять разів, але тепер Ви не побачите, що це буде.
Відповідь на ваше запитання полягає в тому, що це і те, і інше, але жодна проблема не є абсолютною. Вони або повністю суб'єктивні, або лише контекстуально об'єктивні. На жаль, іноді цілком суб'єктивна, а точніше думка має перевагу та домінує.
Як правило, якщо йому потрібен вкладений цикл або це здається наступним очевидним кроком, краще не замислюватися, а просто робити це. Однак якщо якісь сумніви затримуються, то їх слід пізніше переглянути.
Ще одне головне правило полягає в тому, що ви завжди повинні перевірити кардинальність і запитати себе, чи це цикл буде проблемою. У своєму попередньому прикладі я проїжджав по містах. Для тестування я міг би пройти лише через десять міст, але яку розумну максимальну кількість міст можна очікувати в реальному світі? Тоді я можу помножити це на те саме для континентів. Це правило, щоб завжди розглядати з циклами, особливо, щоб повторити динамічну (змінну) кількість разів, що може перевести вниз по лінії.
Незалежно завжди робіть те, що працює спочатку. Тоді, коли ви бачите можливість для оптимізації, ви можете порівняти ваше оптимізоване рішення з найпростішим у роботі та підтвердити, що воно принесло очікувані переваги. Ви також можете витратити занадто довго передчасну оптимізацію до початку вимірювань, що призводить до YAGNI або багато витраченого часу та пропущених термінів.