Sobes.tech
Middle+

Explain the open/closed principle within SOLID.

sobes.tech AI

Answer from AI

Modules (classes, functions) should be open for extension but closed for modification.

  • Open for extension: New functionality can be added without changing existing code. This is achieved through inheritance, interfaces, abstract classes, and design patterns (e.g., Strategy, Decorator).
  • Closed for modification: Changes to existing code should require minimal effort or none at all when adding new functionality. This reduces the risk of introducing errors into already working code and simplifies maintenance.

Example:

Instead of tightly coupling to a specific implementation, use abstraction:

# Violation of the principle
class ReportGenerator:
    def generate_pdf(self, data):
        # PDF generation logic
        pass

    def generate_excel(self, data):
        # Excel generation logic
        pass

# Adding a new format (e.g., CSV) requires modifying the ReportGenerator class
# Adherence to the principle
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 generation logic
        pass

class ExcelReportFormat(ReportFormat):
    def generate(self, data):
        # Excel generation logic
        pass

class CsvReportFormat(ReportFormat): # Easily add a new format without changing ReportGenerator
    def generate(self, data):
        # CSV generation logic
        pass

# Usage
pdf_generator = ReportGenerator(PdfReportFormat())
excel_generator = ReportGenerator(ExcelReportFormat())
csv_generator = ReportGenerator(CsvReportFormat())

This principle promotes creating more flexible, change-resistant, and easily maintainable systems.