Как определить оптимальный уровень абстракции в коде?

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

Ответ

Уровень абстракции должен балансировать между гибкостью и простотой. Хорошая абстракция устраняет дублирование, не добавляя ненужной сложности.

Ключевые принципы:

  1. Избегайте преждевременной абстракции. Абстрагируйтесь только при появлении реального, а не предполагаемого дублирования.
  2. Следуйте принципу YAGNI (You Aren't Gonna Need It). Не добавляйте возможности "на будущее".
  3. Соблюдайте принцип единственной ответственности (SRP). Каждая абстракция должна решать одну четкую задачу.

Пример на Swift:

// Хорошо: Конкретная, понятная абстракция для сетевого слоя.
protocol NetworkService {
    func fetch<T: Decodable>(from endpoint: Endpoint) async throws -> T
}

// Плохо: Избыточно общая, усложняет понимание и использование.
protocol DataFetcher {
    associatedtype Request: Encodable
    associatedtype Response: Decodable
    func fetch(_ request: Request) async throws -> Response
}

Абстракция должна быть настолько общей, насколько это необходимо для текущих требований, и не более.