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


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


Без тестов!) require not_after: not after do index := index + 1 previous := active active := active.right ensure moved_by_one: index = old index + 1 end



Удобно определить go_before, устанавливающую курсор на левом страже:

go_before is -- Передвигает курсор к before do index := 0 previous := zeroth_element active := zeroth_element ensure before: before previous_is_zeroth: previous = zeroth_element previous_is_active: active = previous end


Процедура go определяется в терминах go_before и forth:

go (i: INTEGER) is -- Передвигает курсор к i-й позиции require not_offleft: i >= 0 not_offright: i <= count + 1 do from if i < index then go_before end invariant index <= i variant i - index until index = i loop forth end ensure moved_there: index = i end

Мы старательно избегали проходов по списку. Процедуре go, единственной из рассмотренных, необходим цикл. Для симметрии следует добавить finish, перемещающую курсор к последней позиции, реализуемую вызовом go (count + 1).

Хотя и нет настоящей независимости, удобно (Принцип Списка Требований) экспортировать go_before. Тогда для симметрии следует включить и go_after, выполняющую go (count + 1), и экспортировать ее.

Также для симметрии добавлена процедура back, содержащая цикл, подобный go:

back is -- Передвинуть курсор к предыдущей позиции require not_before: not before do check index - 1 >= 0 end go (index - 1) ensure index = old index - 1 end

Приятно иметь симметрию между back и forth, однако в ней таится угроза, поскольку клиент может беззаботно вызывать back, не думая, что ее реализация содержит цикл, в котором index - 1 раз вызывается forth. Если работа с левой частью списка проводится от случая к случаю, то однонаправленный список является подходящим, если же одинаково часто необходимо обращаться к элементам слева и справа от текущего, то необходимо перейти к двунаправленному списку. Соответствующий класс может быть построен как наследник LINKED_LIST (наследование используется корректно, так как двунаправленный список одновременно является и однонаправленным).


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



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