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