Код спагетти: история любви и ненависти

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

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

В этой истории любви и ненависти к коду спагетти...

Итак, давайте начнем, что такое спагетти-код 🙄?

Это то, что происходит, когда вы пишете код, не следуя здравой практике разработки программного обеспечения. К концу этой статьи, надеюсь, станет ясно, что такое спагетти-код или, по крайней мере, как он выглядит (и чего не следует делать).

Формальное значение "спагетти-кода" - это то, что происходит, когда у вас есть то, что называется глубокими или широкими зависимостями. Под этим я подразумеваю, что ваш код зависит от слишком многих или слишком немногих частей вашего приложения, чтобы функционировать правильно.

Но существует множество различных представлений о том, что такое спагетти-код. Мое любимое определение принадлежит Алексу Мартелли: "Спагетти-код - это то, что происходит, когда вы не соблюдаете правила правильной нисходящей декомпозиции".

Для тех, кто не знаком с термином "нисходящий", позвольте мне процитировать Википедию по этому вопросу: "Нисходящее проектирование, также известное как иерархическое проектирование, начинается с определения модулей высокого уровня и последовательно подмодулей более низкого уровня, пока не будут определены отдельные процедуры".

Это означает, что идеальный кусок спагетти превратится из того, что написано сейчас, в то, что должен делать код, следуя этим шагам:

1) Определите, что делает этот кусок спагетти.

2) Если то, что он делает сейчас, не то, что он должен делать, перепишите его так, чтобы он делал то, что ему нужно (этот этап можно разбить на то, что вам нужно, чтобы делал ваш код).

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

4) Повторяйте, пока все спагетти не будут заменены на код, не содержащий спагетти.

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

Как определить спагетти-код?

Во-первых, если ваш код выглядит как трудновыполнимый горячий беспорядок, это, вероятно, первый намек. Для более сложного определения кода-спагетти, вот некоторые другие подсказки:

  • Если редактирование кода или отладка вызывают огромное разочарование - скорее всего, это спагетти-код.
  • Если ни один разработчик не хочет работать с вами над конкретным проектом или не хочет рассматривать ваш PR-запрос - скорее всего, это спагетти-код.
  • Если у вашего руководителя периодически случаются вспышки гнева на вас - скорее всего, вы пишете много спагетти-кода.

Не волнуйтесь, если какой-либо из этих примеров относится к вам, важно то, как, по вашему мнению, выглядит ваш спагетти-код - вполне вероятно, что то, что вы считаете плохим сейчас, на самом деле будет выглядеть намного хуже после прочтения этой статьи.

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

Это зависит от того, на каком языке вы пишете и какой фреймворк/либы используются. Здесь в качестве примера я покажу спагетти-код, написанный на JavaScript с использованием jQuery:

function KFCSecretMenu() { //constructor

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, который имитирует альтернативу.

Dev meme о задачах и встречах инженеров sprint backlog review

Если все остальное не помогает, вы можете просто улучшить свои способности к кодированию. Но серьезно, это должно быть последним, последним, последним, последним делом, которое вы должны сделать!

tl;dv для бизнеса
tl;dv помогает вам (наконец-то) получать пользу от собраний в масштабах всей организации. Записывайте, расшифровывайте, обобщайте, генерируйте и автоматизируйте полезные для вас и вашей организации сведения о совещаниях. Настройте систему за несколько минут.
Неограниченное количество записей и стенограмм
Краткие сведения об искусственном интеллекте
Спросите tl;dv AI
Работает на +30 языках
Отчеты ИИ для нескольких заседаний
+5000 интеграций