Бред програміста цикли

Не варто сприймати цей текст занадто серйозно. У ньому присутня деяка частка марення


У сучасному програмуванні набагато важливіше зрозумілість коду, ніж швидкодія. Методи повинні робити тільки свою задачу і не займатися самодіяльністю. Крім того, гарним тоном вважаються функції без побічних ефектів. це дозволяє набагато краще оптимізувати програми під многопоточную обробку. Саме тому зараз функціональне програмування стає вельми популярним, проникаючи навіть у звичайні імпратівние мови.

Давайте подумаємо, де в цьому красивому стрункому світі місце циклам? А місця насправді і немає! Не потрібні цикли при повсякденній роботі. Вони можуть бути заховані десь всередині бібліотек або взагалі бути тільки на рівні компілятора. Без них можна абсолютно спокійно обійтися, всьому є гарні заміни. Перерахуємо, для чого використовують цикли:

перетворення

Типова задача: взяти зі списку об'єктів "Користувач" тільки ім'я і працювати з ним далі. Є цілком сформувалися абстракції, наприклад map в jQuery або Select в .NET. Погодьтеся, що другий приклад коду виглядає набагато зрозуміліше першого, тому що відсутня зайвий допоміжний код:

фільтрація

Теж часта завдання. Вибрати всіх активних користувачів. Тут стандартні схеми filter і Where:

аггрегаціі

Куди ж без неї! Наприклад, нам потрібно порахувати кількість користувачів (так, у нас зараз немає вбудованої функції):
А в нормальному стилі (в загальному вигляді) це можна зробити якось так, через акумулятор:

В даному випадку результат передається кудись далі, основний об'єкт ніяк не трансформується. Тут нам на допомогу приходять each в jQuery і ForEach в .NET. Наприклад, ми хочемо вивести імена користувачів на консоль:

І все разом

І звичайно ж, цикли використовуються відразу для всіх завдань разом, ще більше заплутуючи код і підміняють реалізацію завдання непотрібними деталями реалізації (які, дійсно, нікому ніколи не потрібні і лише заважають подальшому читання коду).

Отже, вибираємо імена активних користувачів і знаходимо найдовше:


Погодьтеся, другий варіант, набагато зрозуміліше і коротше. Відразу по тексту видно що він робить (і це я ще не скористався готовим методом Max). У першому ж випадку найпростіше здогадатися про те, що робить код за назвою змінної, але це в даному простому тестовому прикладі. А в реальному житті все набагато заплутаніше, адже обов'язково набіжать оптимізатори і цикл перетвориться в більш коротку і просту версію, яка зрозуміліше (начебто), але в результаті вся логіка прибита цвяхами і її зміна стає вже більш складним завданням, пов'язаної з практично повним переписуванням шматка коду:

наостанок

Щоб не зупинятися на елементарних прикладах, я вирішив привести трохи складніший. А саме, реалізацію сортування. Класичний quicksort з підручника виглядає приблизно так (тільки головна частина):
Даний код, звичайно можна скоротити, але це вже тонкощі і деталі реалізації і оптимізації. Проте, навіть на такий приклад я витратив достатньо часу, поки його реалізував і виловив всі помічені помилки. І в тепер розібратися як сортує алгоритм за всіма конструкціями вельми складно. А тепер подивіться, що я написав відразу на LINQ:

Всього 5 рядків, і то розбитих для зручності! І дивіться як просто пояснити тепер алгоритм: беремо перший-ліпший елемент, беремо з масиву всі елементи менше нього, сортуємо їх даними ж алгорітом, додаємо елементи рівні даного, і великі, відсортовані тим же алгоритмом. Все просто, банально і зрозуміло.
Чи не хочем quicksort, хочемо сортування вибором. Немає нічого простіше:

Бачите, цілком чітка логіка і зрозумілість. Так навіщо вам ще цикли?

Схожі статті