Что означает буква O в принципах SOLID?

«Что означает буква O в принципах SOLID?» — вопрос из категории ООП, который задают на 23% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

O означает Open-Closed Principle (Принцип открытости-закрытости).

Суть: Программные сущности (классы, модули, функции) должны быть:

  • Открыты для расширения — можно добавлять новую функциональность
  • Закрыты для модификации — существующий код не должен изменяться

Проблема без OCP:

class AreaCalculator {
    func area(shape: Any) -> Double {
        if let rect = shape as? Rectangle {
            return rect.width * rect.height
        } else if let circle = shape as? Circle {
            return .pi * circle.radius * circle.radius
        }
        return 0
    }
}
// При добавлении Triangle нужно менять AreaCalculator

Решение с OCP:

protocol Shape {
    func area() -> Double
}

class Rectangle: Shape {
    let width, height: Double
    init(width: Double, height: Double) {
        self.width = width
        self.height = height
    }
    func area() -> Double { width * height }
}

class Circle: Shape {
    let radius: Double
    init(radius: Double) { self.radius = radius }
    func area() -> Double { .pi * radius * radius }
}

class AreaCalculator {
    func totalArea(shapes: [Shape]) -> Double {
        shapes.reduce(0) { $0 + $1.area() }
    }
}
// Теперь можно добавить Triangle без изменения AreaCalculator

Преимущества:

  • Уменьшает риск внесения ошибок в существующий код
  • Упрощает тестирование
  • Повышает переиспользуемость кода