Helpers - компьютеры, интернет, программирование

Является ли наследование лучшим решением для контроллеров с очень похожим кодом?

У меня есть приложение со следующим контроллером (все операции чтения/записи перенаправляются на внешний API):

Пользовательский контроллер:

  • listAction
  • показать действие
  • editAction
  • создать действие
  • удалить действие

Теперь предположим, что я хочу добавить контроллер для продуктов:

ПродуктКонтроллер:

  • listAction
  • показать действие
  • editAction
  • создать действие
  • удалить действие

90% кода двух контроллеров очень похожи, на самом деле различия заключаются в следующем:

  • Список различных атрибутов в listAction, createAction, deleteAction
  • Пользовательская фильтрация в listAction

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

Базовый Контроллер

  • listAction
  • показать действие
  • editAction
  • создать действие
  • удалить действие

UserController и ProductController наследуются от BaseController и определяют такие методы, как getListAttributes()..., которые будут использоваться родительским классом, если требуется какое-либо пользовательское поведение, например, в listAction для ProductController, я бы просто переопределил его там.

Хороший ли это подход?

10.10.2017

  • Наследование контроллера редко работало хорошо для меня. Обычно между действиями достаточно различий, чтобы потребовать какого-то взлома или переопределения. Если это сработает для вас, то отлично. Другой подход заключается в перемещении каждого действия в отдельный класс, а затем совместном использовании самого действия. 10.10.2017
  • Другой подход заключается в перемещении каждого действия в отдельный класс, а затем совместном использовании самого действия. Вы имеете в виду использование композиции? 10.10.2017
  • Не совсем. Вместо контроллера с несколькими действиями создайте несколько контроллеров, каждый из которых содержит ровно одно действие. Не так плохо, как может показаться на первый взгляд, и, если, например, для действия show требуется только другой репозиторий и внедренный шаблон для отображения различных типов сущностей, вы можете использовать точно такой же код ShowAction. Конечно, такой подход не для всех. Я обнаружил, что использование наследования сложно поддерживать, но ваш опыт может быть другим. 10.10.2017

Ответы:


1

Лично мне не нравится имя BaseController, возможно, вы можете найти более конкретную ссылку на имя для вашего варианта использования (с CRUD или вашим внешним именем API).

В остальном ваш подход хорош. Если у вас уже есть наследство, вы также можете создать черту PHP.

И если ваши контроллеры и ваши методы становятся более сложными, вы можете создавать собственные события symfony, чтобы переопределять их, не привязывая больше вашего кода к вашему BaseController и не определяя заново весь метод/действие и логику.

10.10.2017
Новые материалы

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

Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

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

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

Создание простого слайдера изображений с помощью JavaScript
Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

Создание базы данных с помощью супергероя «Python»
В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

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