Совершенный код

ruby on rails best practicies

Принцип наименьшего удивления (ПНУ)

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

Небольшая оговорка: рекомендую посмотреть мое выступление с докладом “ментальное программирование” где изложена эта и многие другие концепции.

Разберем конкретный пример. Исходные данные: В проекте есть CRUD для управления пользователями. Задача: вместо удаления делать soft destroy, чтобы иметь возможность восстановить пользователя.

В коде удаление выглядит вот так: user.destroy().

Любой опытный ruby девелопер сразу же находит множество гемов которые решают эту задачу. В большинстве случаев решение сводится к переопределению метода destroy, таким образом, что теперь он выставляет флаг “deleted”. У некоторых при этом, где-то глубоко в мозгу, возникает мысль “а не хуйню ли я делаю?”.

Что же мы натворили?

  • Стандартное, общепринятое решение, теперь, в некоторых ситуациях, работает особым образом, нарушая ПНУ, а заодно не соответствует принципам “ментального программирования”. Это в свою очередь приводит к тому что программисту нужно больше держать в голове деталей, и постоянно сомневаться. Легко ли вы выполните user.destroy в терминале на продакшене? ;) Я думаю что вы сначала будете думать “а сработает ли” и самое хреновое, то что оно может не сработать (бага, настройки, удалили гем и заменили на другой).
  • Вырабатывается неправильная привычка из-за которой в другом проекте (с другим подходом) можно поиметь проблем.
  • Поле “destroyed” это, вообще говоря, неверно. Наличие полей определяющих состояния вместо нормального конечного автомата, приводит к куче говнокода и постоянной рукопашке (учитывая наличие нормальных гемов).

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

Comments