Давайте вспомним основные принципы ООП:

  1. Инкапсуляция
  2. Наследование
  3. Полипорфизм
  4. Абстракция

Если с первыми тремя более менее все понятно, то Абстракцию всегда, либо забывают назвать, либо не понимают что она означает.

Давайте сперва просто определимся с понятием, что такое абстракция.

Абстракция — это способ представления объекта в программе. Придание объекту характеристик которые отличают его от остальных(То что делает телефон телефоном а не чем-то другим). То есть выделение основных характеристик объекта.

Основная цель абстракции заключается в представлении объекта с минимальным набором тех полей и методов, которые необходимы для решения конкретных задач. Например, мы воспринимаем телефон не как совокупность электронных компонентов, а как устройство для связи, с его основной функцией — возможностью совершать звонки и отправлять сообщения.

Пример плохой абстракции

Представим, что мы разрабатываем приложение, в котором нам нужно описать сущность "Автомобиль". Плохая абстракция могла бы выглядеть так:

class Car {
    var numberOfWheels: Int
    var color: String
    var engineCapacity: Double
    var numberOfDoors: Int
    var brand: String
    var model: String
    var seatMaterial: String
    var trunkCapacity: Double
    var hasSpoiler: Bool
    var sunroof: Bool
    var serialNumber: String
    var fuelInjectorModel: String
    var engineSerialNumber: String
    
    func drive() {
        // Реализация движения
    }
    
    func openTrunk() {
        // Открытие багажника
    }
    
    func checkFuelInjector() {
        // Проверка инжектора топлива
    }
}

Здесь класс Car включает в себя слишком много деталей, многие из которых либо избыточны, либо не имеют отношения к основным задачам, которые должен решать объект типа "Автомобиль". Например, такие свойства, как engineSerialNumber или fuelInjectorModel, скорее всего, не нужны для повседневного использования автомобиля, и их можно скрыть. Наличие множества полей делает абстракцию тяжелой и усложняет работу с объектом, так как каждое свойство и метод должны быть учтены, даже если они не нужны для текущей задачи.

Хорошая абстракция

Вот как могла бы выглядеть более удачная абстракция для класса Car:

class Car {
    var brand: String
    var model: String
    var color: String
    
    func drive() {
        // Реализация движения
    }
    
    func openTrunk() {
        // Открытие багажника
    }
}

В данном примере мы выделяем только основные характеристики автомобиля: его бренд, модель и цвет. Методы drive() и openTrunk() представляют основные действия, которые выполняет автомобиль. Детали вроде серийного номера двигателя или модели инжектора были исключены, так как они не имеют большого значения для пользователя в большинстве случаев. Такое упрощение делает абстракцию легкой и удобной для работы, особенно если наша задача — просто описать автомобиль как средство передвижения, а не разбираться в его внутреннем устройстве.

Абстракция, таким образом, помогает сфокусироваться на основных свойствах объекта, которые важны в контексте решаемой задачи, и скрыть ненужные детали, чтобы избежать усложнения кода.