Перенаправление из GRASP с примерами на PHP
- ·
-
Перенаправление (Indirection) — это один из принципов проектирования, который помогает создавать гибкие и расширяемые системы. Он заключается в том, что классы и модули должны использовать промежуточный уровень индирекции, чтобы изменения в одном классе не приводили к изменениям в других классах.
GRASP (General Responsibility Assignment Software Patterns) — это набор паттернов проектирования, который помогает разработчикам создавать гибкие и расширяемые системы. Один из паттернов GRASP — это принцип Перенаправления.
Пример на PHP
Представим, что у нас есть класс Order, который отвечает за обработку заказов. У этого класса есть зависимость от класса Customer, который отвечает за информацию о клиенте. Если мы захотим изменить класс Customer, то это может привести к изменениям в классе Order, что нарушает принцип Перенаправления.
Чтобы решить эту проблему, мы можем использовать паттерн Фасад (Facade). Мы можем создать класс CustomerFacade, который будет предоставлять интерфейс для работы с классом Customer. Затем мы можем использовать класс CustomerFacade в классе Order, вместо использования класса Customer напрямую. Таким образом, класс Order будет зависеть только от класса CustomerFacade, а не от конкретной реализации класса Customer.
class Customer {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
class CustomerFacade {
private $customer;
public function __construct($name) {
$this->customer = new Customer($name);
}
public function getName() {
return $this->customer->getName();
}
}
class Order {
private $customerFacade;
public function __construct(CustomerFacade $customerFacade) {
$this->customerFacade = $customerFacade;
}
public function getCustomerName() {
return $this->customerFacade->getName();
}
}
$customerFacade = new CustomerFacade("John Doe");
$order = new Order($customerFacade);
echo $order->getCustomerName(); // Output: John Doe
В этом примере класс Order зависит только от класса CustomerFacade, а не от конкретной реализации класса Customer. Если мы захотим изменить класс Customer, то это не повлияет на класс Order.
Заключение
Таким образом, принцип Перенаправления помогает создавать гибкие и расширяемые системы. Использование паттернов проектирования, таких как Фасад, помогает реализовать этот принцип в практике.