Учебники

Абстракция данных в C ++

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

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

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

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

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

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

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

Live Demo

#include <iostream>
using namespace std;

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

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

Ярлыки доступа обеспечивают принудительную абстракцию

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

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

  • Члены, определенные с частной меткой, не доступны для кода, который использует класс. Закрытые разделы скрывают реализацию от кода, который использует тип.

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

Члены, определенные с частной меткой, не доступны для кода, который использует класс. Закрытые разделы скрывают реализацию от кода, который использует тип.

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

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

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

  • Внутренние классы защищены от непреднамеренных ошибок на уровне пользователя, которые могут повредить состояние объекта.

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

Внутренние классы защищены от непреднамеренных ошибок на уровне пользователя, которые могут повредить состояние объекта.

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

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

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

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

Live Demo

#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 — это интерфейсы с внешним миром, и пользователь должен знать их, чтобы использовать класс. Общее количество закрытых членов — это то, что пользователю не нужно знать, но оно необходимо для правильной работы класса.

Разработка стратегии

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

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