Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. WordPress Plugins

Объектно-ориентированная автозагрузка в WordPress, часть 2

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Object-Oriented Autoloading in WordPress.
Object-Oriented Autoloading in WordPress, Part 1
Object-Oriented Autoloading in WordPress, Part 3

Russian (Pусский) translation by Yuri Yuriev (you can also view the original English article)

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

В частности, рассмотрим следующие темы:

  • объектно-ориентированные интерфейсы
  • принцип единой ответственности
  • как это выглядит в PHP
  • куда мы продвигаемся с нашим плагином

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

Полагаю, вы всё ухватили на лету.

Приступая к работе

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

Наш путеводитель

Наш сегодняшний план будет таким:

  1. Исследовать код, который мы написали.
  2. Просчитать возможности улучшения его структуры с использованием объектно-ориентированных техник.
  3. Обеспечить структуру верхнего уровня для реализации нашего плана.

Наконец, много кода писать мы не будем, но кое-что пропишем. Всё-таки это практический урок по исполнению  object-oriented анализа и дизайна. Это необходимый этап для многих крупномасштабных проектов (и то, что приключается с проектами мелкомасштабными).

Что иметь необходимо

Если вы здесь присутствовали, то у вас всё уже имеется. Но, на всякий случай, вот краткий список необходимого:

  • локальный сервер, совместимый с вашей ОС
  • каталог, из которого размещается WordPress 4.6.1
  • текстовый редактор или IDE
  • понимание WordPress Plugin API

Если всё в наличии, мы готовы поделиться кодом в предстоящем уроке. Давайте же начнём.

Анализ кода

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

Ну вот, теперь посмотрим, в каком состоянии находится наш автозагрузчик:

Напомним себе, что принцип единой ответственности гласит:

Класс может измениться только по одной причине.

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

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

Объектно ориентированный анализ: обязанности

Вспомним по предыдущему уроку определение PHP из руководства:

Интерфейсы объектов позволяют создавать код, который определяет, какие методы должен реализовать класс, без определения, как эти методы обрабатываются.

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

Код выполняет следующие действия:

  1. Уточняет, что мы работаем непосредственно с пространствами имён
  2. Разбивает входящие имена классов на составляющие, чтобы определить, класс это или интерфейс (так $class_name плохое имя переменной).
  3. Проверяет, работаем ли мы с файлом интерфейса.
  4. Проверяет, работаем ли мы с файлом класса.
  5. Проверяет, работаем ли мы с интерфейсом.
  6. На основании сделанных выводов создает имя файла.
  7. Строит путь к файлу на основании созданного имени.
  8. Если файл содержит созданное имя, включает его.
  9. В противном случае код генерирует сообщение об ошибке.

Таким образом, приведенный выше код совершает девять действий — то есть, он имеет по крайней мере девять причин для изменения — до завершения работы.

Эта конкретная функция послужит прекрасным примером того, как мы внесём улучшения для демонстрации объектно-ориентированного анализа, дизайна, интерфейса и исполнения.

Возникает вопрос: с чего же начать?

Объектно-ориентированный анализ

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

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

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

Несколько слов о навыках

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

Наши потенциальные классы

С учётом перечисленного выше, я придумал следующие классы:

  1. Autoloader. Главный класс, способный включить остальные классы, пространства имён, интерфейс. Мы его вызовем. Остальные классы будут выполнять необходимую работу по включению сюда файлов.
  2. NamespaceValidator. Этот файл будет проверять входящие классы, интерфейсы или что там ещё, на пригодность. Это станет решающим фактором того, можем мы перейти к остальной части нашего кода или нет.
  3. FileInvestigator. Этот класс смотрит за типами файлов, помещаемых в автозагрузчик. Он будет определять, что это: класс, интерфейс или пространства имён, возвращать полное имя пути к файлу, так, чтобы он мог быть включен.
  4. FileRegistry. Этот будет использовать полный путь к файлу, вернувшемуся из других классов и будет включать его в плагин.

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

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

Объектно-ориентированный дизайн

Разные разработчики, фирмы, учреждения и команды по-разному оформляют системы, на которых они работают.

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

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

Обратите внимание, что коды не будут иметь отношения к пространствам имён, и ни один не исполняется или не проверяется против WordPress. Подойдём к этому в следующем уроке.

Начнём работу с Autoloader отсюда.

Autoloader

Помните, этот класс способен включать необходимый файл. Это файл, который может быть отмечен spl_autoload_register функцией.

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

NamespaceValidator

Этот файл будет проверять входящие имена файлов на пригодность. Обращая внимание на пространства имён в имени файла.

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

FileInvestigator

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

Затем он получает полное имя файла для его типа.

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

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

FileRegistry

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

Альтернативой использованию  WordPress API может быть настройка Exception message. Тогда мы могли бы полностью отделить наш код от WordPress.

Ещё раз, этот код является переходящим из первоначального автозагрузчика. Во время реализации мы можем его изменять, если надо.

Заключение

Хорошо, мы рассмотрели существующий код нашего autoloader, разобрали потенциальный код, который можем использовать на основании некоторого объектно-ориентированного анализа и дизайна.

Является ли решение, над которым мы работаем, более пригодным к обслуживанию, чем то, что имеем? Абсолютно. Будет ли это работать в контексте WordPress и нашего существующего плагина? Мы этого не узнаем, пока не подцепим его к плагину.

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

В любом случае, сейчас код легче читается  (хотя мы до сих пор имеем DocBlocks и некоторые встроенные комментарии), более лёгок в обслуживании и даже больше годен для тестирования.

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

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

Между тем, если вас интересуют материалы об объектно-ориентированном программировании в контексте WordPress, мои предыдущие уроки вы сможете найти на my profile page. Свободно заходите на on my blog или следуйте на мой Twitter, где я регулярно говорю на эти темы.

Ресурсы

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.