Ах, спагетті, такі смачні, коли їх поливають соусом марінара, песто або вершковим соусом для пасти, і такі жахливі, коли мають щось спільне з моїми рядками коду. Ця стаття присвячена моїм (любовним?) ненависним стосункам зі спагетті-кодом.

Сподіваюся, до кінця статті ви будете ненавидіти спагетті-код так само, як і я, і ми зможемо втішити один одного спільним досвідом. Якщо ні, то принаймні сподіваюся, що ви чогось навчилися або, можливо, навіть посміялися!

У цій історії про любов і ненависть до спагетті-коду...

Тож давайте почнемо, що таке спагетті-код 🙄?

Це те, що відбувається, коли ви пишете код, який не відповідає раціональним практикам розробки програмного забезпечення. Сподіваюся, що до кінця цієї статті стане зрозуміло, що таке спагетті-код, або принаймні як він виглядає (і чого не слід робити).

Формальне значення терміна «спагетті-код» — це те, що відбувається, коли ви маєте так звані глибокі або широкі залежності. Під цим я маю на увазі, що ваш код залежить від занадто багатьох або занадто мало частин вашої програми, щоб функціонувати правильно.

Але існує багато різних думок щодо того, що таке спагетті-код. Мені найбільше подобається визначення Алекса Мартеллі: «Спагетті-код — це те, що відбувається, коли ви не дотримуєтеся правил правильної декомпозиції зверху вниз».

Для тих, хто не знайомий з терміном «зверху вниз», дозвольте процитувати Вікіпедію з цього питання: «Дизайн зверху вниз, також відомий як ієрархічний дизайн, починається з визначення модулів високого рівня і послідовного визначення підмодулів нижчого рівня, аж до визначення окремих процедур».

Це означає, що ідеальний шматок спагетті перетвориться з того, що написано зараз, на те, що повинен робити код, виконавши такі кроки:

1) Визначте, що робить цей шматочок спагетті.

2) Якщо те, що він робить зараз, не відповідає його призначенню, перепишіть його так, щоб він виконував необхідні функції (цей етап можна розбити на те, що повинен робити ваш код).

3) Напишіть код.

4) Повторюйте, поки всі спагетті не будуть замінені кодом, що не є спагетті.

Однак найчастіше люди просто пропускають пункти 3 і 4 і переходять відразу до пункту 2 або 1 (зазвичай 1), а потім починають кодувати, як божевільні вчені, не зважаючи на правила написання чистого коду. Через кілька місяців вони отримують те, що зазвичай називають спагетті-кодом.

Як розпізнати спагетті-код?

По-перше, якщо ваш код виглядає як важко зрозумілий безлад, це, ймовірно, перша підказка. Для більш важких для виявлення спагетті-кодів ось ще кілька підказок:

  • Якщо редагування коду або усунення помилок викликає величезне розчарування, швидше за все, це спагетті-код.
  • Якщо жоден розробник не хоче працювати з вами над певним проектом або переглянути ваш запит на PR, швидше за все, це спагетті-код.
  • Якщо ваш керівник випадково виявляє до вас гнів, то, швидше за все, ви пишете багато спагетті-коду.

Не хвилюйтеся, якщо якийсь із цих прикладів стосується вас. Важливо те, як ви самі оцінюєте свій спагетті-код — ймовірно, те, що зараз здається вам поганим, після прочитання цієї статті здасться вам набагато гіршим.

То як виглядає спагетті-код?

Це залежить від мови, на якій ви пишете, та від використовуваних фреймворків/бібліотек. Тут я покажу приклад спагетті-коду, написаного на JavaScript з використанням jQuery:

function KFCSecretMenu() { //конструктор

this.getKrushers = function() {

} } $(document).ready(function(){ //event listener for DOM Ready $(‘.welcome’).click(function (){ //event listener for click on element with class name of welcome $(‘.menu-item’).addClass(‘active’); //class to be added if the submenu is opened.

$(‘.menu-item’).find(‘.description’).slideDown(); //sliding down effect for description text }) }); function MenuItemClicked (e) { var itemID = $(e.target).parent().attr(‘id’); //gets ID of parent menu item var description = $(e.target).next().text() KFCSecretMenu.getKrushers({‘itemID’:itemID,’description’:description}); //calling function below }

Слідуєте? Ні, це точно спагетті! 🕵️

Ми розглянемо, що робить цей шматок спагетті-коду таким поганим, що робить його більш спагетті, ніж інші, і що ви можете зробити, щоб це виправити. То що робить спагетті-код таким поганим? Я вважаю, що це найкорисніший перелік того, що робить спагетті-код таким, яким він є: Дублювання або надмірна складність функцій, методів і змінних Складні для розуміння та/або неіндетовані структури Складні для розуміння та/або довгі функції Складні для читання пробіли Складність для розуміння логіки Відсутність коментарів Незвичайні стилі кодування (надмірні зусилля) Хороші імена змінних.

Є також інші речі, які можуть перетворити ваш код на хаотичну суміш, але не обов'язково вважаються спагетті-кодом: неефективні алгоритми, великий розмір файлів, погано розроблене програмне забезпечення, відсутність тестів. Спагетті-код виглядає по-різному в різних мовах, фреймворках і бібліотеках — те, що є спагетті в одній, може не бути спагетті в іншій. Саме це ускладнює визначення того, як виглядає спагетті-код. Вам потрібно згадати, що для вас було спагетті-кодом кілька років тому — які були найбільші проблеми з вашим кодом? Ймовірно, ви припустилися деяких помилок із наведеного вище списку, тому почніть порівнювати, що було поганого в тих минулих фрагментах коду, і намагайтеся пам'ятати цей список під час читання цієї статті.

Отже, ви визначили свій спагетті-код, як з ним боротися?

Декілька важливих речей, на які слід звернути увагу, перш ніж ми почнемо обговорювати, як перетворити наш шматок спагетті… тобто код на те, чим він повинен бути:

Примітка 1: Існують сотні (а може й тисячі) способів, як НЕ писати код. Я намагаюся викласти це якомога простіше, оскільки те, про що я пишу тут, призначене для тих, хто має лише базові знання про те, як писати код. Ви будете здивовані, чого можна досягти, просто додавши трохи пробілів і коментарів!

Примітка 2: Перед тим, як самостійно намагатися виправити спагетті-код, дуже важливо розуміти, що ви робите, інакше ви тільки погіршите ситуацію! Якщо ви цього не розумієте, прочитайте цю статтю ще раз, а потім поверніться сюди.

Примітка 3: Ми зараз з'ясовуємо, що саме спричиняє безлад у вашому спагетті, але ми не з'ясовуємо, що могло спричинити це спочатку (і тому нам слід добре подумати, перш ніж відкривати наш редактор).

Які переваги має спагетті-код?

Нічого. Наступний пункт!

Як запобігти появі спагетті-коду в майбутньому?

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

  • Хороший спосіб уникнути спагетті-коду — це робити функції та методи короткими. Це означає, що функція повинна виконувати тільки те, що від неї очікується. Немає потреби у функції, яка виконує 10 різних завдань або має 100 рядків — видаліть все, що не потрібно!
  • Ще одна порада, як уникнути спагетті-коду, – не змінювати те, що вже зроблено. Маю на увазі, що слід намагатися не вкладати цикли один в один, або, іншими словами, не вкладати те, що не потрібно вкладати!
  • Не забувайте також про форматування коду, пробіли та відступи можуть творити дива для спагетті-коду! Чим привабливіше виглядає код, тим легше його читати.
  • Ретроспективи – завжди аналізуйте, що вийшло добре, щоб ви могли відстежувати це і застосовувати наступного разу!
  • Як альтернатива, ви можете поліпшити свої навички кодування.
  • Останній порада при плануванні того, як повинен виглядати ваш спагетті-код: спробуйте намалювати графіки того, що ви хочете, щоб він робив, замість того, щоб писати код безпосередньо в редакторі (це означає, що перед тим, як реалізовувати функції, подивіться, що кожна з них повинна робити). Якщо щось пішло не так, зробіть крок назад і почніть спочатку.

Якщо ви будете дотримуватися цих простих правил, я майже гарантую, що те, що ви пишете, не перетвориться на спагетті – але що я можу знати? Можливо, те, що ваша тітка називала спагетті, насправді є спагетті-кодом у маскуванні.

Останні думки про спагетті-код

Ви також можете спробувати прийняти свої спагетті, полюбити їх як єдине джерело радості у вашому житті! Якщо це вам не підходить, є чудовий GIF, який імітує альтернативний варіант.

Мем про завдання та зустрічі інженерів, спринт, огляд затримок

Якщо все інше не допомагає, ви можете просто поліпшити свої навички кодування. Але серйозно, це має бути останнє, останнє, останнє, останнє, що ви повинні зробити!