Danyloff

O из SOLID с примерами на PHP


  • ·

· ·

Принцип открытости/закрытости (Open/Closed Principle) — это один из пяти принципов SOLID, который гласит, что программные сущности (классы, модули, функции и т.д.) должны быть открыты для расширения, но закрыты для изменения. Это означает, что при добавлении новой функциональности в приложение необходимо расширять существующий код, а не изменять его.

Для лучшего понимания этого принципа, рассмотрим несколько примеров на PHP.

Пример 1: Расширение функциональности с помощью интерфейсов

Предположим, у нас есть класс PaymentProcessor, который обрабатывает платежи. В нашем приложении есть два способа оплаты: кредитной картой и PayPal. Мы можем создать интерфейс PaymentMethod, который будет реализован классами CreditCardPayment и PayPalPayment. Таким образом, мы можем добавлять новые способы оплаты, не изменяя код PaymentProcessor.

interface PaymentMethod {
    public function processPayment($amount);
}

class CreditCardPayment implements PaymentMethod {
    public function processPayment($amount) {
        // обработка платежа кредитной картой
    }
}

class PayPalPayment implements PaymentMethod {
    public function processPayment($amount) {
        // обработка платежа через PayPal
    }
}

class PaymentProcessor {
    public function processPayment(PaymentMethod $paymentMethod, $amount) {
        $paymentMethod->processPayment($amount);
    }
}

Пример 2: Использование абстрактных классов

Предположим, у нас есть класс Shape, который представляет геометрическую фигуру. Мы можем создать абстрактный класс ShapeRenderer, который будет реализован классами CircleRenderer и SquareRenderer. Таким образом, мы можем добавлять новые типы фигур, не изменяя код ShapeRenderer.

abstract class ShapeRenderer {
    abstract public function render(Shape $shape);
}

class CircleRenderer extends ShapeRenderer {
    public function render(Shape $shape) {
        // отрисовка круга
    }
}

class SquareRenderer extends ShapeRenderer {
    public function render(Shape $shape) {
        // отрисовка квадрата
    }
}

class Shape {
    protected $renderer;

    public function __construct(ShapeRenderer $renderer) {
        $this->renderer = $renderer;
    }

    public function draw() {
        $this->renderer->render($this);
    }
}

Пример 3: Использование фабричных методов

Предположим, у нас есть класс Logger, который записывает логи в файл. Мы можем создать фабричный метод LoggerFactory, который будет создавать экземпляры класса Logger. Таким образом, мы можем добавлять новые типы логирования, не изменяя код Logger.

class Logger {
    protected $filename;

    public function __construct($filename) {
        $this->filename = $filename;
    }

    public function log($message) {
        // запись лога в файл
    }
}

class LoggerFactory {
    public static function createLogger($filename) {
        return new Logger($filename);
    }
}

Заключение

Принцип открытости/закрытости является важным принципом проектирования, который позволяет создавать гибкие и расширяемые приложения. На PHP этот принцип можно реализовать с помощью интерфейсов, абстрактных классов и фабричных методов.


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

Repository по Эвансу

Концепция Repository (хранилища) является одним из ключевых элементов в методологии Domain-Driven Design (DDD). Эта концепция позволяет разделить бизнес-логику...

Data Access Object (DAO) с примерами на PHP

Data Access Object (DAO) - это шаблон проектирования, который используется для разделения бизнес-логики и доступа к данным. DAO предоставляет единый интерфейс...