C++ Абстракция данных
Абстракция данных означает предоставление внешнему миру только ключевой информации и скрытие деталей базовой реализации — то есть представление только необходимой информации без раскрытия деталей.
Абстракция данных — это техника программирования (проектирования), основанная на разделении интерфейса и реализации.
Возьмём пример из реальной жизни, например телевизор. Вы можете включать и выключать его, переключать каналы, регулировать громкость и подключать внешние компоненты (такие как динамики, видеомагнитофон или DVD-плеер), но вы не знаете деталей его внутренней реализации. Иными словами, вы не знаете, как он принимает сигналы через кабели, как преобразует эти сигналы и в конце концов отображает их на экране.
Следовательно, можно сказать, что телевизор разделяет свою внутреннюю реализацию и внешний интерфейс. Вам не нужно знать, как он работает внутри; вы можете управлять телевизором напрямую через его внешние интерфейсы, такие как кнопка питания, пульт дистанционного управления и регулятор громкости.
Теперь вернёмся к сути. В программировании на C++ классы C++Абстракция данныхделают это возможным. Они предоставляют внешнему миру большое количество открытых методов для управления данными объекта, что означает, что внешний мир фактически не знает внутренней реализации класса.
Например, ваша программа может вызыватьsort()-функции, не зная алгоритма, используемого в функции для сортировки данных. Фактически базовая реализация сортировки функции может различаться в зависимости от версии библиотеки; пока интерфейс остаётся неизменным, вызов функции может продолжать работать нормально.
В C++ мы используемClassдля определения наших собственных абстрактных типов данных (ADTs). Можно использовать классыiostreamизcoutобъекты для вывода данных в стандартный вывод, как показано ниже:
Пример
Здесь вам не нужно понимать, какcoutотображает текст на экране пользователя. Вам достаточно знать открытый интерфейс; базовая реализация cout может быть свободно изменена.
Метки доступа обеспечивают абстракцию
В C++ мы используем метки доступа, чтобы определить абстрактный интерфейс класса. Класс может содержать ноль или более меток доступа:
- Члены, определённые с меткой public, доступны всем частям программы. Представление типа с точки зрения абстракции данных определяется его public-членами.
- Члены, определённые с меткой private, недоступны коду, который использует класс. Раздел private скрывает детали реализации от кода, который использует тип.
Не существует ограничений на то, как часто могут появляться метки доступа. Каждая метка доступа задаёт уровень доступа определений членов, непосредственно следующих за ней. Указанный уровень доступа остаётся в силе до тех пор, пока не встретится следующая метка доступа или пока не будет достигнута закрывающая правая фигурная скобка тела класса.
Преимущества абстракции данных
Абстракция данных имеет два важных преимущества:
- Внутреннее состояние класса защищено от повреждений, вызванных непреднамеренными ошибками на уровне пользователя.
- Реализация класса может со временем изменяться, чтобы отвечать на меняющиеся требования или реагировать на сообщения об ошибках, которые не требуют изменений в коде пользовательского уровня.
Если элементы данных определены только в private-секции класса, автор класса может изменять данные по своему усмотрению. Если реализация изменяется, нужно проверить только код класса, чтобы увидеть, к каким последствиям приводит изменение. Если данные являются public, любая функция, которая напрямую обращается к элементам данных старого представления, может быть затронута.
Примеры абстракции данных
В программе на C++ любой класс с public- и private-членами может служить примером абстракции данных. См. следующий пример:
Пример
Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:
Total 60
Класс выше складывает числа и возвращает сумму. Открытые членыaddNumиgetTotalявляются внешним интерфейсом; пользователям нужно знать их, чтобы использовать класс. Закрытые членыtotal— это вещи, которые пользователям не нужно знать, но которые необходимы для правильной работы класса.
Стратегия проектирования
Абстракция разделяет код на интерфейс и реализацию. Поэтому при проектировании компонентов интерфейс должен оставаться независимым от реализации, чтобы при изменении нижележащей реализации интерфейс оставался неизменным.
В этом случае, независимо от того, какая программа использует интерфейс, интерфейс не будет затронут; перекомпилировать нужно только последнюю реализацию.
Другие расширения