Назад к вопросам
Middle+
76
questionbank

Объясните принцип открытости/закрытости в рамках SOLID.

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Модули (классы, функции) должны быть открыты для расширения, но закрыты для модификации.

  • Открыт для расширения: Новую функциональность можно добавить, не изменяя существующий код. Это достигается за счет наследования, использования интерфейсов и абстрактных классов, паттернов проектирования (например, Стратегия, Декоратор).
  • Закрыт для модификации: Изменение существующего кода должно требовать минимальных усилий или вообще отсутствовать при добавлении новой функциональности. Это снижает риск внесения ошибок в уже работающий код и упрощает поддержку.

Пример:

Вместо жесткой привязки к конкретной реализации, используйте абстракцию:

# Нарушение принципа
class ReportGenerator:
    def generate_pdf(self, data):
        # Логика генерации PDF
        pass

    def generate_excel(self, data):
        # Логика генерации Excel
        pass

# Добавление нового формата (например, CSV) требует модификации класса ReportGenerator
# Соблюдение принципа
class ReportGenerator:
    def __init__(self, report_format):
        self.report_format = report_format

    def generate_report(self, data):
        self.report_format.generate(data)

class ReportFormat:
    def generate(self, data):
        pass

class PdfReportFormat(ReportFormat):
    def generate(self, data):
        # Логика генерации PDF
        pass

class ExcelReportFormat(ReportFormat):
    def generate(self, data):
        # Логика генерации Excel
        pass

class CsvReportFormat(ReportFormat): # Легко добавить новый формат без изменения ReportGenerator
    def generate(self, data):
        # Логика генерации CSV
        pass

# Использование
pdf_generator = ReportGenerator(PdfReportFormat())
excel_generator = ReportGenerator(ExcelReportFormat())
csv_generator = ReportGenerator(CsvReportFormat())

Этот принцип способствует созданию более гибких, устойчивых к изменениям и легко поддерживаемых систем.