- •4.9.1. Изменяемость
- •4.9.2. Классы операций
- •98 Глава 4
- •4.9.3. Полнота
- •100 Глава 4
- •4.9.5. Операции egual, similar и copy
- •102 Глава 4
- •104 Глава 4
- •5. Исключительные ситуации
- •108 Глава 5
- •110 Глава 5
- •6.2.1. Сигнализация об исключительных ситуациях
- •5.2.2. Обработка исключительных ситуаций
- •112 Глава 5
- •5.2.3. Предложение resignal
- •6.2.4. Необрабатываемые исключительные ситуации
- •114 Глава 5
- •6.2.3. Предложение resignal
- •5.2.4. Необрабатываемые исключительные ситуации
- •116 Глава 5
- •118 Глава 5
- •118 Глава 5
- •120 Глава 5
- •122 Глава 5
- •124 Глава 5
- •128 Глава 6
- •130 Глава 6
- •6.2.1. Реализация итераторов
- •6.2.2. Использование итераторов
- •132 Глава 6
- •134 Глава 6
- •136 Глава 6
- •138 Глава 6
- •140 Глава 7
- •142 Глава 7
- •7.2. Абстракция данных
- •144 Глава 7
- •146 Глава 7
- •148 Глава 7
- •150 Глава 7
- •7.4. Генераторы
- •162 Глава 7
- •154 Глава 7
- •156 Глава 7
- •162 Глава 8
- •164 Глава 8
- •166 Глава 8
- •168 Глава 8
- •170 Глава 9
- •172 Глава 9
- •174 Глава 9
- •176 Глава 9
- •9.1.3. Пример
- •178 Глава 9
- •180 Глава 9
- •182 Глава 9
- •184 Глава 9
- •186 Глава 9
- •188 Глава 9
- •190 Глава 9
- •192 Глава. 9
- •194 Глава 9
162 Глава 8
рования. Они обычно имеют больший размер, чем дефинитивные спецификации, и часто ведут к избыточности.У Например, операционная спецификация операции search указывает, какой индекс должен быть возвращен в том случае, если х встречается в массиве а более одного раза. В качестве другого примера можно рассмотреть попытку написать операционную спецификацию для процедуры извлечения квадратного корня.
Хорошей проверкой на обобщенность является анализ каждого требования спецификации в предложениях requires и effects и уточнение их реальной необходимости. Если это не так, то они должны быть исключены или ослаблены. Помимо этого, к любой части спецификации, являющейся более операционной, нежели дефинитивной, следует относиться g осторожностью.
8.2.3. Простота
Когда мы говорим о том, что делает программу «хорошей», то мы рассматриваем не только выполняемые ею вычисления, но и особенности самого текста программы, например, насколько удачно она разбита на модули и насколько хорошо составлены комментарии. Аналогично при анализе спецификации мы должны рассмотреть не только свойства набора спецификаторов, но и свойства самой спецификации, например, насколько она удобна для чтения.
Хорошая спецификация должна облегчать работу е другими людьми.УСпецификация может быть достаточно ограниченной и достаточно обобщенной^ т. е. иметь необходимый смыслы/однако этого недостаточно. Если этот смысл трудно понимаем читателями программы, то польза от такой спецификации весьма невелика.
Имеются два пути, ведущие к непониманию спецификации. Одни читатели могут изучать ее и прийти к тому, что они не понимают спецификацию. Например, читатель второй спецификации elems на рис. 8.1 может быть смущен тем фактом, что элемент встречается в портфеле более одного раза. Это не очень хорошо, однако гораздо менее опасно, чем в том случае, когда люди считают, что они поняли спецификацию, а в действительности это не так. В таком случае пользователь и разработчик понимают спецификацию каждый по-своему, что ведет к модулям, которые не могут работать совместно. Например, разработчик процедуры elems может решить выдавать каждый элемент столько раз, сколько раз он встречается в портфеле, а пользователь при этом считает, что элемец^выд^ется только один раз. „ Простота^' Шляется важным, однако аморфным критерием.'. Легко сказать, что хорошую спецификацию будет легче понять, и гораздо сложнее сказать, как достичь этого. Имеется множество факторов, оказывающих влияние на простоту, среди которых
Спецификации
W,'' \
раткость, избыточность и структурированность/являются, пожалуй, наиболее важными.
'-Наиболее краткое представление не всегда является наилучшим, однако на начальном этапе оно, как правило, является лучшим. Имеется ряд соображений, оправдывающих увеличение спецификации добавлением к ней избыточной информации или уровней структурированности, однако важно избегать ненужного многословия. Обычно по мере возрастания объема спецификации увеличивается вероятность появления в ней ошибок, а также появляется возможность ее неверного трактования. </ Важно не путать объем с полнотой^Спецификации, порожденные «потоком сознания», приводят к неполноте и громоздкости.. Созданные без учета критериев спецификации, подобно программам, имеют размеры, большие необходимыхх/Вместо внесения добавлений в спецификацию разумнее^отложить локальные изменения и\ изыскать пути подтверждения достоверности этой информации. Написание короткой полной спецификации занимает больше времени, чем написание длинной и полной, однако автор спецификации может оставить эту задачу читателям спецификации.
Любая содержащая избыточный терст спецификация является менее точной, чем она могла бы бытб^Избыточность не должна присутствовать без серьезных причин и может быть оправдана в двух ситуациях: в случае, если велика вероятность неправильного понимания спецификации, и в случае необходимости выявления ошибок. V ... .
Роль, выполняемая спецификацией, во многом схожа с ролью, выполняемой записной книжкой. Она '(предназначена не только для содержания информации, но и для эффективной работы с этой информацией. Избыточность может быть использована для снижения вероятности пропуска важных подробностей.УСтарая поговорка «скажи им, что ты хочешь им сказать, и скажи им, что ты им сказал» имеет некоторую педагогическую ценность. ^Идея состоит в том, чтобы^представить информациюнесколькими способами, внося избыточность без повторений. Рассмотрим, например, '' • , •.. ,
р = proc(sl, s2: set) returns (b: bool) . effects b имеет значение true, если si есть подмножество s2, и false —в противном случае.
р== proc(sl, s2: set) returns (b: bool)
effects b = yx [x ^ si имплицирует x ^ s2]. p = proc (si, s2: set) returns (b: bool)
effects b имеет значение true, если si есть подмножество s2, и false —в пр»« тивном случае, т.е. b = ух [х (- si имплицирует х ^ s2].
Первая спецификация кратка и вполне понятна большинству читателей. Однако некоторые из них могут задаться вопросом: 6*
