Поиск…


Вступление

В этом разделе приведены примеры хорошо известных шаблонов проектирования, реализованных в 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 возвращает другие объекты, кроме объекта-хозяина, который вы нарушаете Закон Деметры, и заканчиваетесь мечами в ваших тестах.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow