Danyloff

Устойчивость к изменениям из 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.

Заключение

Таким образом, принцип Устойчивости к изменениям помогает создавать гибкие и расширяемые системы. Использование паттернов проектирования, таких как Адаптер, помогает реализовать этот принцип в практике.


Так же интересно