Основы объектно-ориентированного проектирования


Взгляд изнутри - часть 4


Создание такого списка оставлено в качестве упражнения (см. У5.7). Следует его выполнить, если хотите достигнуть полного понимания концепций.

Ранние утверждения в инварианте не зависели от реализации. Добавим теперь утверждения, описывающие особенности реализации:

empty = (zeroth_element.right = Void) zeroth_element /= Void; previous /= Void (active = Void) = after; (active = previous) = before (not before) implies (previous.right = active) (previous = zeroth_element) = (before or is_first) is_last = ((active /= Void) and then (active.right = Void))

Большинство из запросов реализуются непосредственно - before возвращает булево значение (index = 0) и after - (index = count + 1). Элемент в позиции курсора дается:

item: G is -- Значение элемента в позиции курсора require readable: readable do Result := active.item end

Процедура search подобна go и оставлена читателю. Следует также написать процедуру i_th (i: INTEGER), возвращающую элемент в позиции i. Следует позаботиться об отсутствии абстрактного побочного эффекта, допуская конкретный побочный эффект.

Последняя категория компонентов включает процедуры вставки и удаления:

remove is -- Удаляет элемент в позиции курсора и передвигает курсор к правому соседу. -- (Если нет правого соседа, то становится истинным after). require readable: readable do active := active.right previous.put_right (active) count := count - 1 ensure same_index: index = old index one_less_element: count = old count - 1 empty_implies_after: empty implies after end


Процедура выглядит тривиальной, но это благодаря технике левого стража как физического объекта, что позволяет избежать тестов в форме previous /= Void и first_element /= Void. Стоит рассмотреть более сложное и менее эффективное тело процедуры, полученное без этого упрощения. Внимание: отвергнутая версия!

active := active.right if previous /= Void then previou.sput_right (active) end count := count - 1 if count = 0 then first_element := Void elseif index = 1 then first_element := active -- Иначе first_element не изменяется end

Утверждения помогают понять намерения и избежать ошибок.Следует поупражняться в овладении этой техникой, написав процедуры put_left и put_right.




Начало  Назад  Вперед



Книжный магазин