Что такое абстракция в объектно-ориентированном программировании (ООП)?

«Что такое абстракция в объектно-ориентированном программировании (ООП)?» — вопрос из категории ООП, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Цель: Управление сложностью путем разделения что объект делает и как он это делает.

Как реализуется:

  1. Абстрактные классы: Классы, которые не предназначены для создания экземпляров, а служат шаблоном для других классов. Они могут содержать абстрактные методы (без реализации).
  2. Интерфейсы: Контракты, которые определяют что должен делать класс, но не как. Класс, реализующий интерфейс, обязан предоставить реализацию всех его методов.

Практический пример на Python:

from abc import ABC, abstractmethod

# Абстракция: мы определяем общий интерфейс для всех устройств хранения
class StorageDevice(ABC):
    @abstractmethod
    def read(self, path):
        """Прочитать данные."""
        pass

    @abstractmethod
    def write(self, path, data):
        """Записать данные."""
        pass

# Конкретная реализация, скрывающая детали работы с файловой системой
class SSD(StorageDevice):
    def read(self, path):
        # Сложная логика обращения к контроллеру NAND-памяти
        print(f"Чтение с SSD из {path}")
        return "данные..."

    def write(self, path, data):
        # Логика wear leveling, записи блоков и т.д.
        print(f"Запись на SSD в {path}: {data}")

# Другая реализация
class CloudStorage(StorageDevice):
    def read(self, path):
        # Логика HTTP-запроса к API облака
        print(f"Загрузка из облака {path}")
        return "данные..."

    def write(self, path, data):
        # Логика сериализации и отправки по сети
        print(f"Выгрузка в облако {path}: {data}")

# Клиентский код работает с абстракцией, не зная деталей реализации
def backup_data(device: StorageDevice, data):
    device.write("/backup/file.txt", data)
    print("Резервная копия создана")

# Использование
ssd = SSD()
cloud = CloudStorage()

backup_data(ssd, "важные данные")   # Работает с SSD
backup_data(cloud, "важные данные") # Работает с облаком, используя тот же интерфейс

Выгода: Код backup_data не зависит от типа хранилища. Мы можем добавить новый тип (например, TapeDrive), и клиентский код не потребует изменений, если новый класс реализует абстрактный класс StorageDevice.

Видео-ответы