IT-Service-WordPress / WPF

Шаблон плагина для WordPress (CMS)
GNU General Public License v2.0
0 stars 0 forks source link

Рефакторинг фабрики класса #6

Closed sergey-s-betke closed 10 years ago

sergey-s-betke commented 10 years ago

Сейчас фабрика класса инстанциируется без переопределения в плагине. В результате в сам класс фабрики придётся тащить много избыточного кода, который потребуется далеко не всем плагинам.

Поэтому всё-таки целесообразно сделать фабрику переопределяемой с определением в этот момент необходимого функционала.

Учитывая тот факт, что множественное наследование в php невозможно, определять необходимый функционал можно через реализацию интерфейсов. С ними и типизация поддерживается, что удобно.

sergey-s-betke commented 10 years ago

Итак, через иерархию интерфейсов можно обеспечить необходимую гибкость и контроль типов в коде на этапе выполнения. Но теперь - вопрос в реализации. Ведь в фабрику необходимо не только интерфейсы добавить, но и их реализацию! Хотелось бы избежать кучи if ( $this instanceof I...).

sergey-s-betke commented 10 years ago

С использованием ReflectionClass (примеры) можно построить следующую схему: в конструкторе базового класса фабрики через reflection получать перечень реализуемых интефейсов. Далее - можно реализовать некий механизм автозагрузки необходимых модулей Фреймворка по перечню интерфейсов - для загрузки реализации этих интерфейсов.

А с "динамической" реализацией интерфейсов могут быть некоторые сложности. Пока всё, что приходит на ум - создавать некий массив в объекте фабрики, где каждому интерфейсу будет соответствовать объект, реализующий его методы.

Обеспечить взаимосвязь с объектами при этом можно через __call.

sergey-s-betke commented 10 years ago

Неверная идея. В корне.

Дело в том, что компонентов плагина, реализующих один и тот же интерфейс, может быть несколько. Например - и собственная таблицы / таблицы в БД, и опции реализуют интерфейс IActivatable.

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

И для admin-side небходим отдельный файл (<plugin-file-name>-admin.php), в котором будет определяться ещё одна фабрика, в качестве одного из аргументов которой - базовая фабрика будет.

sergey-s-betke commented 10 years ago

И называть обсуждаемые объекты фабриками - неправильно. Они вовсе не фабрики. Они, по сути, и определяют функциональность плагина, они и есть плагин. А компоненты - компоненты плагина.

sergey-s-betke commented 10 years ago

Возможно - и для frontend так же целесообразно выделить отдельный файл <plugin-file-name>-frontend.php, которого может и не быть для некоторых плагинов.