Сравнение ООП с другими парадигмами
Суть
Парадигма — это способ организовать код и состояние. Swift мультипарадигменный, поэтому вопрос на интервью обычно звучит как «когда что применять».
- Процедурное программирование: последовательность шагов и общие данные; функции меняют состояние. Просто для скриптов и алгоритмов, плохо масштабируется из-за неявных зависимостей через глобальное состояние.
- ООП: состояние и поведение объединены в объектах, взаимодействие через сообщения, полиморфизм через подтипы. Хорошо моделирует сущности с жизненным циклом (экраны, соединения), но склонно к глубоким иерархиям и разделяемому изменяемому состоянию.
- Функциональное (FP): чистые функции, неизменяемые данные, композиция; побочные эффекты вынесены на край. Легко тестировать и распараллеливать. В Swift —
map/filter/reduce,let, value types, Combine. - Protocol-oriented (POP): «ответ Swift» — поведение описывается протоколами и их
extension, а не базовыми классами; данные — value types; полиморфизм — через дженерики и протоколы.
Пример одной задачи в трёх стилях
let prices = [120.0, 80.0, 45.0]
// Procedural: step-by-step mutation
var sum = 0.0
for p in prices where p > 50 { sum += p }
// Functional: pure transformations, no mutation
let sum2 = prices.filter { $0 > 50 }.reduce(0, +)
// Protocol-oriented: behaviour attached to a protocol, works for any Sequence
extension Sequence where Element == Double {
func total(over threshold: Double) -> Double {
filter { $0 > threshold }.reduce(0, +)
}
}
print(sum, sum2, prices.total(over: 50)) // 200.0 200.0 200.0
Как это выглядит в iOS-проекте
- UIKit — классическое ООП: иерархия
UIResponder→UIView, делегаты, подклассы. - SwiftUI — декларативный и функциональный стиль:
View— value type,body— чистая функция от состояния. - Swift Concurrency — акторы: ООП-объекты с изоляцией состояния, то есть ООП, скрещённое с идеями FP о неизменяемости (
Sendable).
На что смотрит интервьюер
- Понимание, что парадигмы не исключают друг друга: модель — value types и чистые функции, инфраструктура — объекты и протоколы, UI — декларативно.
- Главный практический вывод: минимизировать разделяемое изменяемое состояние — именно оно делает ООП-код трудным в тестах и в конкурентности.