dd

От Form к DataHandler: рефакторинг с помощью реддита

Написано

в

У нас новый бэкендер появился. Первым же его проектом стало создание апи для сайта. Ничего сложного, просто надо выдать весь контент, который в админке заполняется. А так как у меня уже за последние месяцы чуть не свой мета-фреймворк для Yii2 нарисовался, то было принято решение его и использовать, ввиду удобства.
Среди всего прочего мне пришлось ему объяснять что такое Form и Result и для чего их используют. И если с Result всё понятно, то что такое Form? Это как-то связано с html-формой? Если нет, то почему так называется? Почему функционал никак не связано с сабмитами и прочим? Пока я ему всё это объяснял меня осенило — я говнокодер. Я намешал всё в одну кучу и в следствии этого назвал как попало. Если кратко, то класс Form — это абстрактный класс, который проводит валидацию данных и потом передаёт управление дочернему классу, при этом дочерний класс ещё должен определить правила валидации (те, что были в одном из предыдущих постов). Херня, если честно.
По интересному совпадению я на днях смотрел девлог разработчика инди-игр. Он рассказывал про создание своей системы частиц и как он к ней прикрутил Entity Component System. Тут пазл сошёлся — зачем я в самом классе Form провожу валидацию, когда это всё можно делегировать? Принялся за работу, переименовал класс Form в DataHandler, чем он по сути и являлся всегда, добавил новый тип атрибутов — DataTransformer. Теперь, на дочерний класс достаточно навесить атрибут Validated, которому при вызове метода DataHandler::run() будут переданы данные для валидации.
Таким образом, мы получаем легко расширяемый класс с гибким функционалом, который можно гнуть как нам надо в любой ситуации.
Теперь не надо называть дочерние классы ReplacementCreationForm, для этого сейчас лучше всего подходит императивная форма — CreateReplacement, или вместо PermissionListCollector теперь будет ListPermissions. Красота.
Ко всему этому я пришёл не только благодаря новому бэкендеру. Он этот процесс запустил, но больше всего работы проделали ребята с реддита. Я там задал вопрос — как мне лучше назвать этот класс, который сейчас зовётся Form? Некоторые начали выяснять что он конкретно делает, некоторые начали говорить, что я оскорбляю богов SOLIDа. Всё это в итоге заставило мой мозг крутить шестерёнки и думать — а чем же и правда занимается этот класс? Почему он так спроектирован? Один из комментаторов открыл мне глаза — это «шаблон» ApplicationService (Action в Laravel), который делает ровно то, что мне нужно.

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

P.S. ссылка на пост на реддите, где можно почитать все обсуждения — https://www.reddit.com/r/PHPhelp/comments/ys3x91/help_with_class_naming/?utm_source=share&utm_medium=ios_app&utm_name=iossmf

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *