Intereting Posts
Чтение из трубы STDIN при использовании proc_open Загружать список файлов одновременно в PHP array_pop () с ключом XSLTProcessor xmlSAX2Characters: вне памяти как изменить размер bmp, tiff image с помощью gd-библиотеки? а также упомянуть о imagemagick, который хорош в использовании Остановить кеширование для PHP 5.5.3 в MAMP Codeigniter отображает пустую страницу вместо сообщений об ошибках Отправка строковых данных в файл PHP на сервере: строка не отправляется? Уведомление о неопределенном значении PHP при чтении массива из файла cookie Что такое имя для шаблона, в котором он получает данные или запрашивает данные и возвращает обратно объект? Отправить запрос PUT с PHP cURL Захватить текущий первый и последний день недели в php Объединение таблиц из двух баз данных с использованием codeigniter Как получить более 5000 запросов от инструментов веб-мастеров api? пользователей для просмотра в локальном часовом поясе

Элегантные альтернативы странному множественному наследованию

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

Вот мой практический случай:

У меня есть абстрактный класс под названием DataExchangeService и много подклассов, которые расширяют его (это базовый класс CONTROLLER в моей MVC Framework). Модули администрирования, которые обрабатывают определение данных (пользователи, типы, разделы и т. Д.), Все они имеют методы добавления, редактирования, удаления, списка со 100% -ным сходством в большинстве случаев. Я знаю это, потому что я копирую их, используя только поиск и замену. Теперь не все мои подклассы DateExchangeService обрабатывают данные, поэтому есть достаточно случаев, когда мне не нужны методы CRUD.

Множественное наследование определит эти методы CRUD и их поведение в другом классе и расширит оба этих класса там, где это необходимо, но я действительно думаю, что это сложный материал, и я его не использую (+ PHP не имеет такой функциональности). Итак, какова была бы лучшая практика?

Вот те подходы, которые пришли мне в голову:

CASE A

  1. Определите класс CRUDHandler, у которого все эти методы параметризованы.

  2. Создайте свойство типа CRUDHandler, где это необходимо, а также реализуйте интерфейс CRUD, который заставит меня использовать эти методы.

  3. В телах реализованных методов я добавляю что-то вроде этого:

 public function edit ($ params) {
     $ this-> params = $ params;
     $ this-> CRUDHandler-> handle ("edit", $ this);
 }

(В PHP это можно сделать с __call() магического метода __call() .)

CASE B

  1. Определите класс CRUDHandler как расширение базы DataExchangeService.

  2. При определении определенного типа DataExchangeService (например, UsersExchangeService) вместо расширения DataExchangeService вы расширяете CRUDHandler, таким образом вы получаете все, что хотите, когда это необходимо.

Итак, есть ли другие мнения относительно этого подхода MultiInheritance?

благодаря

Related of "Элегантные альтернативы странному множественному наследованию"

В настоящее время существует популярный стиль мышления, в котором говорится, что « предпочитают композицию над наследованием ». Слишком много информации о Google, чтобы действительно перечислить все это здесь, но давайте просто скажем, что за редким исключением изредка абстрактного базового класса я не использовал наследование через 2-3 года.

Основная идея заключается в том, что любой заданный класс, а не расширение базовых классов, которые позволяют ему предоставлять требуемую функциональность, будет иметь зависимости от других классов. На самом деле, чтобы сохранить вещи SOLID , у нее будут зависимости от интерфейсов, которые предоставляют контракт, в котором говорится, что они будут выполнять функцию.

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

На этом этапе я считаю, что рекомендуется читать:

  • Благодарите композицию над наследованием .
  • Инъекция зависимостей и инверсия управления .
  • Инверсия управляющих контейнеров (например, StructureMap и мой личный фаворит: Castle Windsor ).