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

Абстракция данных - это метод программирования (и проектирования), который основан на разделении интерфейса и реализации.

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

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

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

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

В C ++ мы используем классы для определения наших собственных абстрактных типов данных (ADT). Вы можете использовать объект cout класса ostream для потоковой передачи данных на стандартный вывод следующим образом:

#include <iostream>
using namespace std;

int main() {
   cout << "Hello C++" <<endl;
   return 0;
}

Здесь вам не нужно понимать, как cout отображает текст на экране пользователя. Вам нужно знать только открытый интерфейс, а базовая реализация «cout» может быть изменена.

Доступ к ярлыкам для выполнения абстракции

В C ++ мы используем метки доступа для определения абстрактного интерфейса для класса. Класс может содержать ноль или более ярлыков доступа -

  • Члены, определенные с помощью общедоступного ярлыка, доступны для всех частей программы. Представление абстракции данных типа определяется его публичными членами.
  • Члены, определенные с помощью частного ярлыка, недоступны для кода, который использует класс. Частные разделы скрывают реализацию от кода, который использует этот тип.

Нет ограничений на то, как часто может появляться метка доступа. Каждая метка доступа указывает уровень доступа следующих определений элементов. Указанный уровень доступа остается в силе до тех пор, пока не встретится следующая метка доступа или не увидит закрытие правой скобки тела класса.

Преимущества абстракции данных

Абстракция данных обеспечивает два важных преимущества -

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

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

Пример абстракции данных

Любая программа на C ++, где вы реализуете класс с общедоступными и частными членами, является примером абстракции данных. Рассмотрим следующий пример:

#include <iostream>
using namespace std;

class Adder {
   public:
      // constructor
      Adder(int i = 0) {
         total = i;
      }
      
      // interface to outside world
      void addNum(int number) {
         total += number;
      }
      
      // interface to outside world
      int getTotal() {
         return total;
      };
      
   private:
      // hidden data from outside world
      int total;
};

int main() {
   Adder a;
   
   a.addNum(10);
   a.addNum(20);
   a.addNum(30);

   cout << "Total " << a.getTotal() <<endl;
   return 0;
}

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

Total 60

Класс выше добавляет числа вместе и возвращает сумму. Публичные участники - addNum и getTotal - это интерфейсы для внешнего мира, и пользователь должен знать их, чтобы использовать класс. Общее количество пользователей - это то, о чем пользователю не нужно знать, но необходимо, чтобы класс работал правильно.

Стратегия проектирования

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

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