Абстрактный тип данных
5.6. Уровни абстракции
Абстракция может рассматриваться на разных уровнях. Высшие уровни абстракции - это представление пользователя о решении задачи, низшие уровни абстракции - это возможности языка программирования и его реализации для конкретного типа аппаратуры.
Рассмотрим в качестве примера абстракции автомобиль. При про-ектировании автомобиль может рассматриваться на более детальном уровне, т.е. как кузов, шасси, двигатель, салон. Проектировщики шасси будут оперировать терминами "передняя подвеска", "задняя подвеска", "коробка передач", "карданный вал" и т.п. Хорошей абстракцией может быть подвеска автомобиля. Для разработчика шасси она определяется типом, набором рычагов, пружинами, амортизаторами, сайлент-блоками, стабилизаторами и, конечно, их взаимным расположением. В этом случае полезной операцией будет расчет изменения положения и нагрузок при воздействии внешних сил. Такая абстракция полезна лишь при разработке самой подвески.
На более детальном уровне всю конструкцию подвески можно представить в виде набора рычагов с заданной длиной, коэффициентом жесткости и коэффициентом растяжения. Эта абстракция может использоваться для расчета любой механической конструкции, не обязательно связанной с автомобилем. Но даже это еще не уровень языка программирования.
Приведенный пример проектирования сверху вниз может применяться как при проектировании структур данных, так и при проектировании алгоритма управления. Проектирование архитектуры программы начинается с верхних уровней абстракции и постепенно переходит к нижним уровням.
Не все абстракции стоит всегда реализовывать на всех уровнях. Много компонент нижних уровней абстракции зачастую уже доступны в качестве библиотечных модулей. Использование готовых компонент экономит ресурсы для решения других задач.
Внимание!
Абстрактный тип данных должен проектироваться абстрактно, т.е. безотносительно к реализации. Только после того, как абстракция отражена в виде h-файла, можно приступать к самой реализации. Зачастую реализация будет накладывать ограничения на абстракцию. Полностью избавиться от учета особенностей реализации не всегда удается, но к этому надо стремиться. Например, использование динамической памяти может снимать ограничения на размеры, но обусловливать дополнительные проблемы при создании переменных.
Вопросы и задачи для самостоятельного решения
- Как используются абстрактные типы данных?
- Что необходимо задать, чтобы полностью определить абстрактный тип данных?
- Какие основные классы операций определяют для абстрактного типа данных.
- Определите набор операций и структуру данных для абстрактного типа данных "дек".
- Определите набор операций и структуру данных для абстрактного типа данных "линейный список".
- Определите набор операций и структуру данных для абстрактного типа данных "множество печатных символов".
- Определите набор операций и структуру данных для абстрактного типа данных "разряженный вектор произвольной длины".
- Напишите спецификацию на модуль, реализующий абстрактный тип данных: "бинарное дерево".