Абстракция данных в 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++ метки доступа определяют абстрактный интерфейс класса. Класс может содержать ноль или более меток доступа:
Члены с меткой public доступны во всей программе. Вид абстракции типа определяется его публичными членами.
Члены с меткой private недоступны коду, использующему класс. Приватные разделы скрывают реализацию от кода, использующего тип.
Нет ограничений на частоту появления меток доступа. Каждая метка задаёт уровень доступа для следующих определений членов до следующей метки или закрывающей фигурной скобки класса.
Преимущества абстракции данных
Абстракция данных даёт два важных преимущества:
Внутренности класса защищены от случайных пользовательских ошибок, которые могли бы повредить состояние объекта.
Реализация класса может эволюционировать со временем в ответ на изменяющиеся требования или баг-репорты без необходимости менять пользовательский код.
Определяя члены данных только в приватной секции, автор класса свободен в изменениях данных. Если реализация меняется, нужно проверить только код класса. Если данные публичны, любая функция, напрямую обращающаяся к старым членам данных, может сломаться.
Пример абстракции данных
Любая программа на C++, где реализован класс с публичными и приватными членами, является примером абстракции данных. Пример:
Live Demo#include <iostream>
using namespace std;
class Adder {
public:
// конструктор
Adder(int i = 0) { total = i; }
// интерфейс для внешнего мира
void addNum(int number) { total += number; }
// интерфейс для внешнего мира
int getTotal() { return total; };
private:
// скрытые данные от внешнего мира
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 — интерфейсы для внешнего мира, пользователю нужно знать их. Приватный член total — то, что пользователю не нужно знать, но необходимо для работы класса.
Стратегия проектирования
Абстракция разделяет код на интерфейс и реализацию. При проектировании компонента нужно держать интерфейс независимым от реализации, чтобы при изменении реализации интерфейс оставался нетронутым.
В этом случае программы, использующие эти интерфейсы, не затрагиваются и им нужен лишь рекомпиляция с новой реализацией.
Язык C
- Понимание типов данных C++: основы, модификаторы и лучшие практики
- Освоение операторов C++: полное руководство с практическими примерами
- Классы и объекты в C++: практическое руководство по объектно-ориентированному программированию
- Шаблоны классов в C++: практическое руководство
- Тип данных char в C++: объявление, ASCII и методы преобразования
- Абстракция в Java: упрощение кода и повышение читаемости
- Структуры данных в Java: основные классы и Collections Framework
- Классы хранения в C++: область видимости, время жизни и использование
- Структуры данных в C++: массивы, структуры и эффективное программирование
- Полиморфизм в C++: практическое руководство