Статьи

Шаблоны проектирования в WordPress: простой шаблон фабрики

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

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

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

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


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

Согласно Википедии шаблон фабричного метода определяется следующим образом:

Шаблон фабричного метода — это объектно-ориентированный шаблон творческого проектирования, предназначенный для реализации концепции фабрик. Он решает проблему создания объектов (продуктов) без указания точного класса создаваемого объекта.

Звучит немного сложно, не правда ли?

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

Итак, как уже упоминалось, мы собираемся взглянуть на версию шаблона, которая немного спарена и должна быть более широко применима к менее сложным проектам.

Прежде чем мы это сделаем, давайте придумаем определение простого фабричного шаблона:

Шаблон Simple Factory возвращает определенный набор данных или определенный класс на основе его ввода.

Ах риск сделать каламбур, просто, верно?

Правда в том, что многие разработчики программного обеспечения называют Simple Factory скорее идиомой, чем полноценным шаблоном; другие считают это паттерном.

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

Несмотря на это, я говорю об этом так, что если вы увидите, что это используется как идиома (или шаблон), используемая в различных статьях в Интернете или даже в разговоре, вы поймете, что разработчики, о которых идет речь, ссылаются на одну и ту же стратегию программирования. — просто по-другому.

Как и шаблоны проектирования в проектах, не связанных с WordPress, например, в более крупных приложениях, шаблоны проектирования предоставляют проверенный и надежный способ решения распространенной проблемы.

Это помогает немного абстрагировать наш код, сделать наш проект легко обслуживаемым, легко читаемым и на самом деле может помочь нам сохранить наш код легким. Это может привести к тому, что в нашем проекте будет больше файлов , но каждый файл должен иметь меньше строк кода.

Это означает, что каждый файл должен иметь определенную цель, которая должна быть понятна не только нам, но и будущим разработчикам.


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

Дело в том, что читатели этого блога охватывают широкий спектр опыта — у нас есть люди, которые учатся писать код; другие, которые являются опытными ветеранами.

Чтобы обратиться к большинству читателей, нам необходимо найти баланс. Так что для тех из вас, кто занимался разработкой программного обеспечения в течение многих лет, это может показаться слишком упрощенным; однако, не просматривайте это — возможно, вы подберете что-то новое.

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

Итак, представьте себе такой сценарий: вы работаете с функцией, которая принимает набор входных данных — обычно какой-то тип уникальной строки или целого числа — и у вас есть такой длинный оператор if/else или, возможно, у вас есть этот большой оператор switch/case который продолжается расти по мере роста вашего проекта.

Проблема в том, что условием становится боль в управлении. Фактически, условные выражения или блоки case могут в конечном итоге выполнять столько работы, сколько должна выполнять определенная функция.

Именно здесь в игру вступает Simple Factory. То, что мы можем сделать, это абстрагировать детали, происходящие в каждом из условных выражений, в их собственный класс, что значительно упрощает поддержку и делает код намного проще.

И это простой шаблон фабрики.

Простая фабричная модель

Итак, вот ключевые особенности Simple Factory Pattern:

  • Обратите внимание, что класс Plugin имеет частную ссылку на класс Factory
  • Класс Factory инкапсулирует всю логику, чтобы вернуть объект типа User
  • Класс User является базовым классом для трех других классов: Admin, Volunteer, Reader, и идея заключается в том, что каждый из этих типов является подклассом пользователей с уникальными собственными функциональными возможностями.
  • Плагин получит определенный тип ввода, который он передаст на Фабрику.
  • Фабрика проверит ввод, а затем, основываясь на его значении, вернет один из трех пользовательских типов.

Ничего сложного, правда? Честно говоря, я думаю, что диаграмма немного сложнее, чем принципы в игре. Это действительно обеспечивает большую гибкость, особенно когда вы хотите ввести другой тип пользователя, такой как редактор или что-то подобное.

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

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

Сначала давайте посмотрим на класс плагина. Помните, это не более чем прототип того, как выглядит шаблон. Это не то же самое, что полностью разработанный плагин WordPress.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
<?php
 
include_once( ‘simple-factory.php’ );
 
class Plugin {
 
    private $factory;
 
    public function __construct() {
        $this->factory = new Simple_Factory();
    }
 
    public function get_user( $permission ) {
        return $this->factory->get_user( $permission );
    }
 
}
 
?>

Обратите внимание, что плагин относительно прост:

  • Он включает в себя скрипт simple-factory.php в заголовке файла
  • Затем он определяет конструктор, в котором он устанавливает свойство $factory для экземпляра Simple_Factory
  • Единственный метод, доступный в плагине, это get_user который возвращает пользователя в зависимости от типа

Посмотрим, как это вступит в силу после того, как мы изучим все остальные классы.

User — это абстрактный базовый класс, который предоставляет базовый конструктор и абстрактную функцию, которая должна быть реализована всеми другими подклассами.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?php
 
abstract class User {
 
    private $role;
 
    public function __construct( $role ) {
        $this->role = $role;
    }
 
    abstract public function get_role();
 
}
 
?>

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?php
 
class Admin extends User {
 
    public function __construct() {
        $this->role = «Administrator»;
    }
 
    public function get_role() {
        return $this->role;
    }
 
}
 
?>
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?php
 
class Reader extends User {
 
    public function __construct() {
        $this->role = «Reader»;
    }
 
    public function get_role() {
        return $this->role;
    }
 
}
 
?>
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?php
 
class Volunteer extends User {
 
    public function __construct() {
        $this->role = «Volunteer»;
    }
 
    public function get_role() {
        return $this->role;
    }
 
}
 
?>

Как обычно, оставляйте мне вопросы в комментариях; в противном случае, просмотрите код, а затем обязательно прочтите «Простую фабрику», которая является следующим разделом — он связывает все это вместе.

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

Класс Simple_Factory — это суть всего паттерна. Здесь принимаются все решения и возвращаются соответствующие объекты.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
 
include_once( ‘users/user.php’ );
include_once( ‘users/admin.php’ );
include_once( ‘users/volunteer.php’ );
include_once( ‘users/reader.php’ );
 
class Simple_Factory {
 
    public function get_user( $permission ) {
 
        switch( strtolower( $permission ) ) {
 
            case ‘read-write’:
                $user = new Admin();
                break;
 
            case ‘help’:
                $user = new Volunteer();
                break;
 
            case ‘read’:
                $user = new Reader();
                break;
 
            default:
                $user = null;
                break;
 
        }
 
        return $user;
 
    }
 
}
 
?>

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


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

  • Он предоставляет элегантный способ абстрагировать ваш код, чтобы было меньше визуальных помех
  • Это позволяет вам вводить специализированные, ориентированные на классы с одной целью (это здорово, если вы следуете принципам SOLID )
  • Это делает код более понятным, так как существует единственное место, где создаются экземпляры классов, и каждый класс служит одной цели

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


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

На данный момент мы рассмотрели три модели:

  1. Образец Наблюдателя
  2. Синглтон
  3. Простая фабричная модель

Эта серия может идти один на некоторое время; Тем не менее, я думаю, что мы уже достаточно разбирались, чтобы многие из нас начали внедрять шаблоны в нашу работу.

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