Open/Closed Principle (OCP) – принцип открытости/закрытости (программные сущности должны быть открыты для расширения, но закрыты для изменения. Проблема: надо добавить функциональность – приходится менять класс. А это противоречит идее S.O.L.I.D. Решение: абстракция и интерфейсные указатели. Современное объектно-ориентированное проектирование, не отрицая важность наследования, делает ставку на композицию, и на передачу интерфейсных указателей, поэтому, когда мы говорим про расширение, мы говорим про интерфейсные указатели. Принцип открытости/закрытости требует переходить от реализации к абстракции.
Суть принципа ОСР в том, что единожды созданные классы не следует изменять под конкретные нужды конкретной ситуации. Для изменения поведения некоторого класса необходимо явным образом описать его интерфейс, и создать другую реализацию этого интерфейса.
======================================================================
задания для практики:
-
Реализуйте систему скидок в интернет-магазине, используя принцип открытости/закрытости. Добавьте возможность для клиентов получать скидку на товары в корзине, если они удовлетворяют определенным условиям (например, покупают более 3 товаров). Реализуйте систему скидок таким образом, чтобы она была расширяемой и легко поддерживаемой.
-
Реализуйте систему управления задачами, используя принцип открытости/закрытости. Создайте базовый класс Task и классы-наследники для различных типов задач (например, задачи по программированию, задачи по тестированию, задачи по анализу данных и т.д.). Реализуйте методы для добавления, удаления, изменения и выполнения задач, используя принцип открытости/закрытости, чтобы система была расширяемой и легко поддерживаемой.
-
Реализуйте систему плагинов для обработки файлов. Создайте базовый класс FileProcessor и классы-наследники для различных типов файлов (например, текстовые файлы, изображения, видео и т.д.). Реализуйте методы для чтения, записи, обработки и отображения файлов, используя принцип открытости/закрытости, чтобы система была расширяемой и легко поддерживаемой.