PHP
Шаблоны проектирования
Поиск…
Вступление
В этом разделе приведены примеры хорошо известных шаблонов проектирования, реализованных в PHP.
Цепочка методов в PHP
Метод Chaining - это метод, описанный в книге Мартина Фаулера « Доменные языки» . Цепь метода суммируется как
Рассмотрим эту нецелую / правильную часть кода (портированную на PHP из вышеупомянутой книги)
$hardDrive = new HardDrive;
$hardDrive->setCapacity(150);
$hardDrive->external();
$hardDrive->setSpeed(7200);
Метод Chaining позволит вам написать приведенные выше утверждения более компактным образом:
$hardDrive = (new HardDrive)
->setCapacity(150)
->external()
->setSpeed(7200);
Все, что вам нужно сделать для этого, - это return $this
в методах, из которых вы хотите связать:
class HardDrive {
protected $isExternal = false;
protected $capacity = 0;
protected $speed = 0;
public function external($isExternal = true) {
$this->isExternal = $isExternal;
return $this; // returns the current class instance to allow method chaining
}
public function setCapacity($capacity) {
$this->capacity = $capacity;
return $this; // returns the current class instance to allow method chaining
}
public function setSpeed($speed) {
$this->speed = $speed;
return $this; // returns the current class instance to allow method chaining
}
}
Когда его использовать
Основными вариантами использования для использования метода Chaining является построение внутренних доменных языков. Метод Chaining является строительным блоком в Expression Builders и Fluent Interfaces . Однако это не синоним . Метод Chaining просто позволяет это. Цитата Фаулера:
Я также заметил распространенное заблуждение - многие люди, кажется, приравнивают к свободному интерфейсу с методом Цепочка. Конечно, цепочка - это обычная техника для использования с плавными интерфейсами, но истинная беглость намного больше.
С учетом сказанного, использование метода Chaining только для того, чтобы избежать записи объекта-хозяина, многие считают кодом запаха . Это делает для неочевидных API-интерфейсов, особенно при смешивании с API-интерфейсами без цепочки.
Дополнительные примечания
Разделение запросов команд
Разделение командного запроса - это принцип проектирования, созданный Бертран Мейер . В нем говорится, что методы, изменяющие состояние ( команды ), не должны возвращать ничего, тогда как методы, возвращающие что-то ( запросы ), не должны мутировать состояние. Это упрощает рассуждение о системе. Метод Chaining нарушает этот принцип, потому что мы мутируем состояние и возвращаем что-то.
Геттеры
При использовании классов, которые реализуют цепочку методов, обратите особое внимание при вызове методов getter (т. Е. Методов, возвращающих нечто, отличное от $this
). Поскольку getters должен возвращать значение, отличное от $this
, привязка дополнительного метода к геттеру заставляет вызов работать с полученным значением, а не с исходным объектом. Хотя есть некоторые варианты использования для прикованных геттеров, они могут сделать код менее читаемым.
Закон Деметры и влияние на тестирование
Метод Chaining, представленный выше, не нарушает Закон Деметры . Это также не влияет на тестирование. Это потому, что мы возвращаем экземпляр хоста, а не какой-то соавтор. Это распространенное заблуждение, связанное с тем, что люди путают простое соединение методов с использованием свободных интерфейсов и выразителей . Только когда метод Chaining возвращает другие объекты, кроме объекта-хозяина, который вы нарушаете Закон Деметры, и заканчиваетесь мечами в ваших тестах.