<rmcreative>

RSS

О видах плохого кода

21 августа 2017

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

Спагетти

Плохо структурированный код, в котором всё располагается в одном и том же месте и жутко намешано.

Такой код выдают новички, которые ещё не научились структурировать кол и не задумываются об архитектуре. Типичные причины появления:

  • Мало опыта.
  • Не думают о структурировании кода.
  • Слишком сжатые сроки.

Абстракция и слои

Как сделать код лучше? Отрефакторить введя абстракцию. Единственная цель абстракции — сделать всё проще для понимания, чем оно было.

У нашего мозга два типа памяти, один из которых — кратковременная память. Она чем-то напоминает стек, размер которого, в среднем, равен пяти элементам. Из за этого ограничения не получается работать с сильно сложными системами. Абстракция — способ сгруппировать детали так, чтобы они влезли в кратковременную память. Если слои спроектированы верно, то в каждом из них находится не более пяти компонент. Таким образом, можно оперировать всей системой на каждом из уровней несмотря на сложность.

Лазанья

Слоёный код с чистыми интерфейсами. Если слоение сделано верно, то код хорош. К сожалению, правильно выделить слои сложно и частенько получается не то, что хотелось бы: плохая лазанья, в которой слишком много слоёв.

Цель кода-лазаньи — сделать всё проще путём введения слоёв. Часто разработчики фанатично идут к этой цели, создавая один слой за другим. Каждый слой в итоге получается простым, но взаимодействие между слоями выходит сложным. Итог — поддерживать сложнее, чем это было до начала слоения. Типичные причины появления:

  • Мало опыта.
  • Обдумывание повторного использования кода до обдумывания применения.
  • Нечёткие требования.
  • Постоянно меняющиеся цели проекта.

Что же лучше?

Я думаю, что лучше уж спагетти, чем плохая лазанья. И то и то, конечно, зло, которое необходимо рефакторить. Спагетти рефакторить проще. Чтобы рефакторить плохую лазанью сначала приходится убрать все слои (то есть превратить её в спагетти), а потом уже думать над тем, как заново правильно ввести слои.

Комментарии RSS

  1. №11063
    AmdY
    AmdY 21 авг. 2017 г., 17:31:26

    Есть ещё пицца код, это слои как в лазанье покоящиеся на основе из евент диспетчера. Попытка выудить кусочек салями превращается в вырванный ком из сыра, помидоров и теста.

  2. №11064
    Sam
    Sam 22 авг. 2017 г., 10:53:58

    О, да. Архитектуры, основанные исключительно на событиях — это моё любимое.

  3. №11065
    Егор
    Егор 23 авг. 2017 г., 5:54:11

    Пицца код - довольно специфичное и редкое блюдо :)

  4. №11069
    Програмист на Битрик
    Програмист на Битрик 28 авг. 2017 г., 8:10:32

    Я думаю, что лучше уж спагетти, чем плохая лазанья.

    вот поэтому bitrix - лучшая система для веб проектов

  5. №11070
    VolCh
    VolCh 28 авг. 2017 г., 11:47:11

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

    Основной минус лазаньи - минорное вроде изменение типа "добавить поле" оказывается размазанным по десятку файлов.

    Но выбирая между "долго делать что-то новое и легко недоделать" и "легко сломать имеющееся", я выберу первое

  6. №11071
    Иван
    Иван 28 авг. 2017 г., 14:39:43

    Не хватает примеров кода:)

  7. №11087
    Andrey
    Andrey 26 сент. 2017 г., 11:02:24

    Было бы полезно еще разместить информацию для обучения, так как данный пост констатация факта, и что с этим фактом делать дальше не ясно :)

    На моей практике сейчас проблема в постоянно меняющихся целях.

    • Нужно сделать проект который будет делать А. Все красиво, понятно легко
    • А можно добавить еще В Вроде пока все норм
    • а теперь, C-F и еще поменять взаимодействие B c А, но нужно на вчера
    • поменяйте поведение D

    смотришь на код лазенья из спагетти :(

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.