Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
39
Добавлен:
23.03.2015
Размер:
1.05 Mб
Скачать

Тема: Анализ создаваемых абстракций

Классы операций

Операции абстракции данных удобно распределить на четыре класса.

1. Примитивные конструкторы. Эти операции создают объекты соответствующего им типа, не используя никаких объектов в качестве аргумента. Примерами таких операций являются операции create для наборов intset и списков.

2. Конструкторы. Эти операции используют в качестве аргументов объекты соответствующего им типа и создают другие объекты такого же типа. Например, операции add и mul - конструкторы для полиномов, а операции cons и rest — конструкторы для списков.

3. Модификаторы. Эти операции модифицируют объекты со-ответствующего им типа. Например, операции insert и delete - модификаторы для наборов intset. Очевидно, что только изменяе-мые типы могут иметь модификаторы.

4. Наблюдатели. Эти операции используют в качестве аргументов объекты соответствующего им типа и возвращают результат другого типа. Они используются для получения информа­ции об объектах. Сюда относятся, например, операции size, member и choose для наборов intset и операции coeff, degree и equal для полиномов.

Обычно примитивные конструкторы создают не все, а только некоторые объекты. Например, операция poly$create создает только одночленные полиномы, а операция intset$create создает только пустой набор. Другие объекты создаются конструкторами или модификаторами. Например, операция poly$add может быть использована для получения полиномов, у которых количество членов больше одного, а операция intset$insert — для получения наборов с многими элементами.

Модификаторы играют ту же роль для изменяемых типов, что и конструкторы для неизменяемых. Изменяемый тип может иметь как конструкторы, так и модификаторы; например, наборы intset могут иметь операцию copy, которая создает новый набор, содержащий те же элементы, что и ее аргумент. Иногда наблюда-тели комбинируются с конструкторами или модификаторами: например, операция remh модифицирует массив и возвращает удаленный элемент.

Полнота

Тип данных является полным, если он обеспечивает достаточно операций для того, чтобы все требующиеся пользователю работы с объектами могли быть проделаны с приемлемой эффективностью. Строгое определение полноты дать невозможно, хотя существуют пределы относительно того, насколько мало операций может иметь тип, оставаясь при этом приемлемым. Например, для наборов intset мы предоставили только операции create, insert и delete, и программы не могут получить никакой информации относительно элементов набора (так как не имеется наблюдателей). С другой стороны, если мы добавим к этим трем операциям только одну операцию size, то сможем иметь информацию об элементах набора (например, можем проверять на принадлежность, удаляя целые числа и анализируя, изменился ли размер), но тип в этом случае получится неэффективным и неприемлемым.

В общем случае абстракция данных должна иметь операции по крайней мере трех из четырех рассмотренных нами в предыдущем разделе классов. Она должна иметь примитивные конструкторы, наблюдатели и либо конструкторы (если она неизменяемая), либо модификаторы (если изменяемая).

Полнота типа зависит от контекста использования, т. е. тип должен иметь достаточно богатый набор операций для его пред-полагаемого использования. Если тип предполагается использовать в ограниченном контексте (таком, как, например, одна программа), то должно быть обеспечено достаточно операций только для этого контекста. Если тип предназначен для общего использования, желательно иметь богатый набор операций. Вот почему встроенные типы языка CLU имеют много операций.

Чтобы решить, имеет ли абстракция данных достаточно опе-раций, установите прежде всего все, что пользователи могут пожелать делать с ней. Затем продумайте, как эти вещи могут быть осуществлены с использованием данного набора операций. Если что-то окажется слишком неэффективным или слишком громоздким (или и то и другое вместе), исследуйте, может ли этому помочь какая-нибудь дополнительная операция. Иногда существенное улучшение в производительности можно получить, просто открыв доступ к представлению. Например, мы можем исключить операцию member для наборов intset, так как эта операция может быть реализована вне типа при помощи других операций. Однако проверка на принадлежность набору - операция общего использования, и будет работать быстрее, если . выполняется внутри реализации. Следовательно, тип данных intset должен иметь эту операцию.

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

Соседние файлы в папке POSIBNIK