Сайт с курсами

Был у нас сайт с курсами. Групповые, индивидуальные и ещё всякие.

Сайт на Yii2.

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

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

Вся эта логика жила в одной жирной ActiveRecord модели, построенной в несколько этажей через наследование и с десятком сценариев, как для валидации так и для вычислений всех кейсов.

Запутанность и баги

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

Притом баги в силу сложности и запутанности логики проявлялись только при специфических условиях, и выявлялись только когда нам писали из техподдержки что “в Краснодаре курсы фотошоперов отвалились”.

Робот-часовой

Дошло до того, что я написал тест на каждую форму каждого курса в каждом городе, чтобы робот ходил по всем страницам курсов — несколько тысяч страниц — и отправлял на все формы тестовые заявки. Как только форма не отправлялась, или не открывалась страница, робот отправлял мне письмо на почту.

Тогда баги стали выявляться раньше, а я согласовал время на рефакторинг и сел на пару месяцев распиливать эту дичь на части.

Чистый код

Я не мог понять, в чём наши проблемы. Код был сложный, но выглядел корректно.

Почему же мы страдали и ловили баги? Что было не так и что надо изменить чтобы стало хорошо?

Где-то что-то я упускал. Не в силах с этим смириться, я полез на форумы, читать посты и ветки в поисках того, как правильно писать код.

Стал гуглить статьи и изучать всё про чистый код, что мог найти.

В те времена, в 2016 году, принципы чистого кода ещё не были приняты повсеместно, про SOLID слышали только местные гуру. А на форумах всерьёз спорили, что “чистый код это просто хрень ненужная и только мешает”.

Так что самообучаться было тяжело, но мало-помалу я добывал знания.

Рефакторинг: разделить код

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

Тогда я отделил формы от модели, разделил модели и формы на несколько по основным сценариям, общую логику куда-то вынес.

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

Вот такая история.