Программная инженерия. Часть 6.

В современной интерпретации АТД принимают п. 1 — 4 определения Хоара, при этом, однако, желательно заменить термин «значение» на менее конкретный термин «объект». Можно принять также п. 5—б, уточнив, что свойства и представления данных определяются программистом. П. 5—7 заменяются следующими положениями:

  • все свойства объектов АТД определяются семантикой его основных операций. Операции над объектами АТД делятся на основные (принадлежащие типу) и дополнительные (внешние). Любое взаимодействие с объектом АТД, в том числе и необходимое для реализации дополнительных операций, осуществляется только с помощью основных операций;
  • программист может строить АТД, имеющие те и только те свойства, которые необходимы для решения задачи;
  • определение АТД должно быть оформлено как модуль, спецификации которого содержат описания основных операций, а тело определяет представление данных и способ реализации основных операций. Определенные в теле понятия недоступны за пределами АТД.

Рассмотрим выполнение этих положений в языке АДА. Требованию модульности удовлетворяют пакеты языка АДА, но для них не выполнен п. 1 определения типов, так как пакет описывает некоторый объект, а не класс объектов. Недопустимы, например, переменные и выражения, значениями которых являлись бы пакеты. Встроенные типы языка АДА, как и типы языка ПАСКАЛЬ, не являются АТД. Всем требованиям АТД, кроме модульности, удовлетворяют только приватные (личные) типы языка АДА. Используя их совместно с пакетами, программист может строить АТД с требуемыми свойствами.

Приватные типы языка АДА из-за их неудобства почти не используются при программировании. Это означает, что формальное соответствие концепциям АТД может быть практически бесполезным, важен способ реализации концепции и обеспечиваемый уровень сервиса. Например, вместо полного описания всех операций и их реализации удобнее использовать описания вида «как массив, но....» или «как целое, но...». Признаком качественной реализации концепции АТД можно считать предоставление пользовательским типам данных такого же сервиса, как и встроенным типам, в частности возможностей определения для пользовательских типов операций присваивания, индексации, выборки компонентов. В идеальной реализации концепции абстрактными должны быть все типы данных.

Допустимы различные модификации концепции АТД. Например, по аналогии с языком СИМУЛА и так называемым «объектным программированием», можно разбить множество основных операций на собственные операции объектов (операции, считающиеся составной частью объектов) и операции, общие для всех объектов данного типа. Подобное деление существенно для операций «с памятью», таких, как датчики псевдослучайных чисел. Концепции АТД не противоречит также введение в язык классов объектов, более общих, чем типы данных. Например, можно заметно уменьшить число повторных объявлений, если при описании формальных параметров дополнительных подпрограмм использовать классы «любой целочисленный», «любой приближенный», «любой арифметический» и т. д. Необходимо, однако, чтобы объединяемые в класс типы данных имели непустое пересечение множеств основных операций.