Как вы проверяете соответствие принципам SOLID во время код-ревью?

«Как вы проверяете соответствие принципам SOLID во время код-ревью?» — вопрос из категории Архитектура, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Проверка SOLID во время код-ревью:

1. Single Responsibility (единственная ответственность)

// ❌ Нарушение: класс делает слишком много
class UserManager {
    func saveToDatabase() { ... }
    func sendEmail() { ... }
    func generateReport() { ... }
}

// ✅ Исправление: разделение ответственности
class UserRepository { func save() { ... } }
class EmailService { func send() { ... } }
class ReportGenerator { func generate() { ... } }

2. Open/Closed (открыт для расширения, закрыт для изменений)

protocol PaymentProcessor {
    func process(amount: Double)
}

class CreditCardProcessor: PaymentProcessor { ... }
class PayPalProcessor: PaymentProcessor { ... }
// Новый платежный метод добавляется без изменения существующего кода

3. Liskov Substitution (подстановка Лисков)

  • Проверяю, что наследники не нарушают контракт базового класса/протокола.
  • Наследник должен обрабатывать все случаи, которые обрабатывает родитель.

4. Interface Segregation (разделение интерфейсов)

// ❌ Слишком общий протокол
protocol Worker {
    func work()
    func eat()
    func sleep()
}

// ✅ Специализированные протоколы
protocol Workable { func work() }
protocol Eatable { func eat() }

5. Dependency Inversion (инверсия зависимостей)

// ❌ Зависимость от конкретной реализации
class DataService {
    private let database = MySQLDatabase()
}

// ✅ Зависимость от абстракции
protocol Database { func save(data: Any) }
class DataService {
    private let database: Database
    init(database: Database) { self.database = database }
}

На код-ревью: даю конкретные примеры нарушений и предлагаю варианты рефакторинга.