Ответ
Уровень абстракции должен балансировать между гибкостью и простотой. Хорошая абстракция устраняет дублирование, не добавляя ненужной сложности.
Ключевые принципы:
- Избегайте преждевременной абстракции. Абстрагируйтесь только при появлении реального, а не предполагаемого дублирования.
- Следуйте принципу YAGNI (You Aren't Gonna Need It). Не добавляйте возможности "на будущее".
- Соблюдайте принцип единственной ответственности (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
}
Абстракция должна быть настолько общей, насколько это необходимо для текущих требований, и не более.