Рефакторинг плагинов WordPress: небольшой пример
Одним из способов появления плагинов WordPress является то, что, по крайней мере, в моем случае, они начинаются как набор функций, используемых для достижения определенной цели для данного проекта. Оттуда вы думаете: «Эй, может быть, это кому-то еще покажется полезным».
По крайней мере, это был мой опыт чаще, чем нет.
Но дело в том, что перед тем, как выпустить его для опробования другими людьми, вы хотите пройти процесс очистки кода. Я не говорю о рефакторинге плагинов WordPress — по крайней мере, пока.
Я говорю о том, чтобы взять код, довести его до чего-то, что будет работать как плагин WordPress, а затем, возможно, провести рефакторинг кода.
Рефакторинг плагинов WordPress
Прохождение всего процесса рефакторинга плагинов WordPress — не говоря уже об одном плагине WordPress — может быть трудным, но поделиться тем, как рефакторить часть плагина, вполне выполнимо.
Поэтому я буду использовать пример того, как я что-то недавно использовал (с немного абстрагированным кодом, чтобы не беспокоиться о конкретном проекте).
График идеального выпуска опционов.
Однако прежде чем сделать это, я считаю важным сообщить, что мой процесс может отличаться — или, скорее всего, — отличается от вашего (поскольку у многих из нас разные процессы).
- Спроектируйте компонент (да, даже не полный плагин) в блокноте,
- Придумайте контрольный список вариантов использования, в которых он должен пройти, а когда он должен дать сбой,
- Запишите, какие данные нужны, как они нужны и когда их следует игнорировать
- Превратите все вышеперечисленное в код.
Конечно, я не преобразовываю все это буквально в код, но вы поняли идею. Пожалуй, наиболее кратко это можно выразить так:
- Начните с длинного метода, который соответствует идеальному варианту использования. Затем реорганизуйте этот код, чтобы функции были меньше и учитывали случаи, в которых результат не удался.
Итак, с учетом сказанного, вот как может выглядеть код.
1 Написание для идеального варианта использования
В этом примере идеальный вариант использования — это когда пользователь загружает параметры, параметры присутствуют, а затем ему необходимо выполнить действие, если параметры имеют определенные значения.
<?php
private function load_dates() {
$options = get_option( 'acme_date_options' );
$event_settings = $options['event'];
$import = $event_settings['import'];
$post_type = $event_settings['post-type'];
if (( 0 === strcmp( 'yes', $import)) && (0 === strcmp( 'events', $post_type) )) {
// This is where you take whatever action you want.
}
}
Эта часть должна быть легко читаемой, но она не учитывает ничего, кроме идеального пути по коду.
2 Получите немного защиты
Далее, я хотел бы убедиться, что параметры установлены, прежде чем пытаться их прочитать. В некоторых случаях может потребоваться отобразить уведомление, создать исключение или внести в журнал информацию.
К этому примеру я просто вернусь, так как он легко читается и его легче всего настроить для вашего использования.
<?php
private function load_dates() {
$options = get_option( 'acme_date_options' );
if (! isset( $options['event'])) {
return;
}
$event_settings = $options['event'];
if (! isset( $event_settings['import']) ||! isset( $event_settings['post-type'])) {
return;
}
$import = $event_settings['import'];
$post_type = $event_settings['post-type'];
if (( 0 === strcmp( 'yes', $import)) && (0 === strcmp( 'events', $post_type) )) {
// This is where you take whatever action you want.
}
}
Итак, это обрабатывает параметры, но как насчет случая, когда параметры установлены, но не имеют ожидаемых значений? Это означает, что нам нужно также убедиться, что они это делают. И, если нет, игнорируйте их, возвращайтесь, регистрируйте ошибку, выбрасывайте исключение и так далее.
Вы знаете: то же самое, что и выше. За исключением того, что в этом случае я не буду предпринимать никаких действий, если код не будет содержать идеальную информацию.
3 Получение немного длинного
На данный момент метод становится немного длинным и его становится труднее читать. Конечно, если вы опытный программист, вы можете аргументировать: «Это код, а не английский», но почему бы не попытаться сделать его немного проще?
Кроме того, это немного облегчает тестирование. Но это выходит за рамки данного поста. Возьмем оценку параметров в качестве первого примера кода.
- Это то, что можно обернуть в свою функцию, которая не только изолирует эту проверку, но и немного упрощает результирующий вызов.
- Затем возьмите второй блок кода, который проверяет идеальные значения параметров. Это также может быть абстрагировано по тем же причинам, что и выше.
- И, наконец, настройте функцию, чтобы убедиться, что ожидаемые значения установлены для каждого из указанных значений :
<?php
private function has_valid_option( $option) {
return isset( $option );
}
private function has_valid_values( $value1, $value2) {
return! (isset( $value1) && isset( $value2) );
}
private function can_import_data( $value1, $value2) {
return (0 === strcmp( 'yes', $value1)) && (0 === strcmp( 'events', $value2) );
}
Итак, теперь у вас есть два меньших метода, инкапсулирующих ту же проверку, которую вы делали.
4 Последняя функция
На этом этапе конечную функцию намного легче читать, поскольку у нее есть две вспомогательные функции, которые инкапсулируют свои обязанности, в то время как эта возвращается к оценке идеального пути по коду:
<?php
private function load_dates() {
$options = get_option( 'acme_date_options' );
if (! $this->has_valid_option( $options)) {
return;
}
$event_settings = $options['event'];
if (! $this->has_valid_values( $event_settings['import'], $event_settings['post-type'])) {
return;
}
$import = $event_settings['import'];
$post_type = $event_settings['post-type'];
if ($this->can_import_data( $import, $post_type)) {
// This is where you take whatever action you want.
}
}
Достаточно сказать, что когда дело доходит до рефакторинга плагинов WordPress, это всего лишь один пример того, как сделать только его часть. Но это начало, верно?
Целые плагины?
Я точно знаю? Рефакторинг плагинов WordPress — это не шутки. Но если вы начнете с таких небольших функций и постепенно будете продвигаться по кодовой базе, все станет проще.
И если вы потратите время на планирование проекта с самого начала, это может сэкономить много времени на возврате и рефакторинге такого рода вещей.