- •Глава II
- •12. Предварительные замечания о процессе разработки программ
- •12.1. Жизненный цикл математического обеспечения
- •12. Предварительные замечания о процессе разработки программ
- •12.1. Жизненный цикл математического обеспечения
- •12.2. Анализ требований
- •12.3. Пример задачи
- •13.1. Обзор процесса проектирования
- •13.2.1. Вводный раздел
- •13.2.2. Разделы абстракций
- •13.8. Абстракция строки
- •13.9. Обзор и обсуждение
- •14. Этап перехода от проектирования к реализации
- •14.1. Оценка проекта
- •14.1.1. Корректность и эффективность
- •14.1.2. Структура
- •15.2. Выбор подхода
13.8. Абстракция строки
Как обычно, в процессе реализации типа данных мы начинаем изучение абстракции строки с рассмотрения ее представления. Основная задача заключается в хранении слов, пробелов и символов табуляции таким способом, который бы сделал операцию выравнивания относительно простой и эффективной. В частности, мы должны по возможности избежать ненужной манипуляции символами. Поскольку самой важной операцией с этой точки зрения является операция выравнивания justify,то мы начнем рассмотрение именно с нее. Выравнивание состоит из следующих шагов:
1.Отыскание первого пробела, подлежащего выравниванию.
2.Расширение промежутков между словами. Удобно держать слова, пробелы и символы табуляции отдельно в представлении с тем, чтобы операция justifyмогла легко находить первый выравниваемый пробел и все пропуски, подлежащие расширению. Например, мы могли использовать массивarray[элемент], где
элемент == variant [word: string, tab, space: int]
Проектирование
max. tab-width
% Представление строки хранит пробелы, символы табуляции и слова отдельно; % смежные пробелы объединены.
% Пробелы и символы табуляции используются в качестве счетчика числа % пробелов в выходной строке.
% Хранится также длина строки и позиция крайнего правого символа табу-% ляции,
item == variant [word: string, tab, space: int] rep = record [length: int, % текущая длина строки right-tab: int, % индекс крайнего правого символа % табуляции или 0, если он от-% сутствует
stuff: array [item]] % Слова, пробелы и символы табуляции
% Хранится в виде константы для облегчения % дальнейших модификаций
% Типичная строка есть последовательность символов. % Функция абстракции есть: % if l.length = 0 then " "
% else chars (1.stuff [I ]) Ц ... II chars (top (1.stuff)) % где chars (item) есть
% символы в слове, если item есть слово % в противном случае п пробелов, где п есть целое число % для item, состоящего из пробелов или символов табуляции % Инвариант представления есть i. lengths сумме числа пробелов и символов табуляции+размер
слов & r.right-tab>=0 & low (r, stuff) = I
& r.right>0=>r.stuff [r.right-tab] есть
символ табуляции & и больше символов табуляции справа в r. stuff нет
& в r.stuff нет смежных пробелов
& целое число в каждом признаке пробела и символа табуляции ?> О & целое число в каждом элементе символа табуляции
<=: max- tab-width == I
& для каждого элемента символа табуляции в r .staff count по модулю max-tab-width == 1, где count есть число символов, считая от начала r.stuff и до конца, включая данный символ табуляции
Рис. 13.13. Реализация документации для абстракции строки.
Здесь мы храним информацию о смежных промежутках в одном элементе массива: intдля символа табуляции или пробела отслеживает, сколько пропусков должно быть сделано в выходной строке. Для повышения эффективности в представлении должна храниться также текущая длина строки. Кроме этого, выравнивание будет выполняться быстрее, если по мере добавления к строке символов табуляции мы будем следить за крайним правым символом табуляции. Подобная оптимизация оправдана в том случае, если символы табуляции встречаются редко. Как правило, так и бывает. Реализация абстракции lineприведена на рис. 13.13.
294 Глава IS
Проектирование