Для чего изучать структуры и абстрактные типы данных?¶
Чтобы управлять сложностью задач и процессом их решения, учёные-информатики используют абстракции, позволяющие им сфокусироваться на картине в целом, без блуждания в деталях. Создавая модель предметной области, мы можем использовать лучший и более эффективный процесс поиска решения. Такие модели позволяют нам описывать данные, которыми будут манипулировать наши алгоритмы, намного более подходящим для данной задачи образом.
Ранее мы ссылались на процедурную абстракцию, как на процесс сокрытия деталей конкретной функции, чтобы дать пользователю (или клиенту) возможность рассматривать её на очень высоком уровне. Сейчас мы переключаем наше внимание на аналогичную идею абстракции данных. Абстрактный тип данных, иногда обозначаемый аббревиатурой АТД, это логическое описание того, как мы рассматриваем данные и разрешённые для них операции, безотносительно их реализации. Это значит, что мы сосредотачиваемся только на том, что данные из себя представляют, а не на том, как они в итоге будут сконструированы. Обеспечивая такой уровень абстракции, мы достигаем инкапсуляции данных. Идея здесь в том, что, инкапсулируя детали реализации, мы скрываем их от взгляда пользователя. Это называется сокрытием информации.
Рисунок 2 наглядно демонстрирует, что такое абстрактный тип данных и как он работает. Пользователь взаимодействует с интерфейсом, используя операции, определённые в абстрактном типе данных. По сути, абстрактный тип данных - это оболочка, с которой контактирует клиент. Реализация скрыта на уровень ниже, и её детали совершенно не беспокоят пользователя.
Реализация абстрактного типа данных, часто называемая структурой данных, требует, чтобы мы смотрели на данные с физической точки зрения, используя при этом некий набор из конструкций программирования и примитивных типов данных. Как мы уже обсуждали ранее, разделение этих двух точек зрения приводит нас к определению сложных моделей данных для наших задач без углубления в подробности того, как эти модели в итоге будут реализованы. Так обеспечивается независящий от реализации взгляд на данные. Так как обычно существует множество различных способов воплотить абстрактный тип данных, независимость реализации позволяет программисту изменять её детали, не меняя при этом способа взаимодействия пользователя с данными. Таким образом, пользователь остаётся сфокусированным только на процессе решения задачи.