Быстрое прототипирование: от прототипа к коду, часть 2
Предыдущий пост демонстрирует проделанную большую работу по использованию чего-то, что когда-то было быстрым прототипом, и переносу этого прототипа в код. Если вы не следили за нами, мы сделали следующее:
- обсудили и построили прототип плагина,
- схематично один объектно-ориентированный подход может работать,
- и преобразовали наш прототип в реальный код.
На данный момент есть еще несколько вещей, которые мы можем сделать, чтобы улучшить наш код. А именно, мы можем ввести понятие пространств имен. Это продвигает организацию на шаг вперед и может принести дивиденды для более крупных проектов.
Итак, вот посмотрите, как это проявляется в нашем текущем проекте.
От прототипа к коду: пространства имен
Я подробно рассмотрел пространства имен в предыдущих постах. Если не читали, то рекомендую. Затем вернитесь и проверьте остальную часть поста.
Если вы решите пропустить статью, вот краткое определение пространства имен :
Пространства имен предназначены для решения двух проблем, с которыми сталкиваются авторы библиотек и приложений при создании повторно используемых элементов кода, таких как классы или функции…
И общая идея заключается в том, что мы организуем наши классы на основе логической связи, которую они имеют друг с другом.
Кроме того, мы также организуем файлы в каталогах, которые соответствуют пространству имен. Это не то, что нужно делать, но я считаю, что это помогает логически организовать классы на диске так, как они виртуально организованы в пространстве имен.
С учетом сказанного давайте организуем файлы.
Организация файлов
Вместо того, чтобы начинать с основного файла плагина, давайте сначала организуем наши файлы.
- Файлы Meta Box и Meta Box Display будут находиться в каталоге Display. Это совершенно произвольно, но поскольку эти файлы делают именно это, кажется, имеет смысл, что именно там они будут находиться.
- Мы также можем поместить файлы message-description.php и no-post-list.php в этот каталог, но давайте поместим их в подкаталог Views. Вы можете назвать это Templates или Partials или что-то подобное.
- Далее у нас есть классы, отвечающие за запросы к базе данных, и класс, отвечающий за координацию обмена сообщениями. Давайте поместим каждый из них в Utility. Конечно, есть и другие места, куда они могли бы пойти, но помните, что цель — продемонстрировать, как использовать пространства имен. Поэтому, если вы чувствуете себя так склонным, не стесняйтесь настраивать свои файлы по своему вкусу.
Если вы следовали тому, что мы сделали выше, то у вас должна быть структура каталогов, которая выглядит примерно так:
Один из способов организовать ваши файлы.
Теперь пришло время определить пространства имен для каждого из классов. Поскольку мы организовали их все в свои каталоги, будет легко указать пространство имен; однако важно понимать, что нам нужно будет использовать ключевое слово use, когда мы используем классы, расположенные в других пространствах имен.
Давайте пройдемся по каждому из наших файлов, начиная с файлов в Utility. Во-первых, мы начнем с Post Messenger :
Вы заметите, что пространство имен файла появляется в заголовке вместе с объявлением об использовании созданного нами класса Post Query . Я добавил имя класса в конец пространства имен, поэтому мне не нужно использовать его во всей кодовой базе.
Обратите внимание, что конструктор теперь выглядит так :
Я добавил аргумент $plugin_dir, потому что нам нужно использовать его для правильного отображения результатов запроса. И поскольку теперь они находятся в другой области приложения, функции выглядят так :
Далее, давайте посмотрим на класс Post Query . Ничего особенного в этом классе не изменилось, за исключением того, что мы дали ему пространство имен, и мы также обновили запрос только для извлечения трех сообщений (согласно этому комментарию ).
Обратите внимание, что в коде я также поставил перед WP_Query косую черту, потому что это часть глобального пространства имен.
Давайте перейдем в каталог Display и посмотрим на класс Meta Box. Ему также было присвоено пространство имен, а также используется полное имя класса Meta Box Display, которое мы сейчас рассмотрим.
Обратите внимание, что этот конструктор также принимает каталог плагинов в качестве аргумента и также передает его в класс отображения Meta Box . Это делается для того, чтобы функции, отвечающие за отображение сообщений, можно было правильно найти в их расположении в каталоге Views .
Наконец, давайте рассмотрим класс отображения Meta Box . Это простой класс, который включает в себя пространство имен и ссылается на Post Messenger, который мы рассмотрели выше.
На данный момент мы прошли полный круг через плагин. За одним исключением: файл начальной загрузки. Мы добавили к нему пространство имен и должны обновить способ его создания :
А именно, у нас есть:
- определил пространство имен,
- ссылаться на расположение класса Meta Box ,
- обновлены пути, чтобы указать, где найти файлы (что в конечном итоге можно сделать с помощью автозагрузчика),
- и обновил вызов add_action .
Вот что касается вызова действия добавления: поскольку WordPress необходимо найти эту функцию, а функция находится в пространстве имен, необходимо определить полное имя функции, чтобы WordPress мог ее вызвать. Отсюда и необходимость NAMESPACE в имени функции.
Теперь мы организованы (за одним исключением)
Как вы понимаете, пространства имен и каталоги, которые им соответствуют, делают проект более организованным. За ним легче следить, легче понять, куда идут дела (как для существующих, так и для новых файлов). И это дает меньше ощущения, просто собирая много файлов в одном месте.
Даже если класс немного монолитный, его все же можно организовать таким образом, чтобы упростить обслуживание.
С учетом сказанного, есть еще кое-что, что я бы изменил в этом плагине: передача каталога плагина таким образом не помогает с низкой связностью, и это более тесно связывает классы вместе, потому что файл начальной загрузки должен передавать значение в один класс передает его другому классу, который использует его для загрузки файлов и так далее.
Так есть ли способы исправить это? Абсолютно. И, возможно, мы рассмотрим это в последнем посте.
До тех пор помните, что самая последняя версия плагина доступна в основной ветке с тегом 0.3.0 на GitHub.
Сообщения серии
- Быстрое прототипирование с помощью WordPress: от концепции до плагина
- Быстрое прототипирование с помощью WordPress: анализ концепции
- Быстрое прототипирование: от прототипа к коду, часть 1
- Быстрое прототипирование: от прототипа к коду, часть 2
- Быстрое прототипирование: знакомство с автозагрузкой