Ответ
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
Преимущества:
- Уменьшает риск внесения ошибок в существующий код
- Упрощает тестирование
- Повышает переиспользуемость кода