- •Глава 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. Выбор подхода
12.3. Пример задачи
Для иллюстрации вышесказанного мы исследуем программу, генерирующую индексы К.СК (ключевое слово в контексте) для наборов заголовков, с целью разработки неполной спецификации требований для этой программы. Индексы КСК и ^пользуются для просмотра базы данных с заголовками с целью нахождения интересующих заголовков. В общем случае база дан иых ограничена заголовками из некоторой области, например) научными исследованиями в области вычислительной техники -Назначение индекса заключается в ускорении поиска требуемых заголовков. Некоторые слова заголовка более полезны для этой 1Л_ели, нежели другие. Слова «с» и «для» бесполезны совсем, а слов а «компилятор» и «CLU»,очевидно, полезны. Полезные слова называютсяключевыми словами.На выходе программы отыскиваемые заголовки отсортированы по ключевым словам. Пользою атель может затем просматривать отсортированный список, отыскивая слова, связанные с интересующей его темой. После нахожл.ения набора заголовков, содержащих требуемое ключевое слово, пользовагель может выбрать конкретные заголовки для более подробного рассмотрения.
Для представления индекса имеются два способы: ключевые слова могут быть представлены «в контексте» или«внеконтекста». В КСК индексы ключевых слов остаются в файле на своих местах, но при этом подсвечиваются. Например, индекс КС^К для заголовков
Простой язык базы данных для персональных компьютеров Набор программ для создания переносных компиляторов Базы данных с тройным резервированием Облегчение процесса компилирования упорядочится следующим образом:
Набор программ для создания переносных компиляторов Облегчение процесса компилирования
Простой язык базы данных для персональных компьютеров Простой язык базы данныхдля персональных компьютеровБазы данных стройным резервированием
Мы хотим, чтобы программа создавала для базы да. иных индекс КСК на основании предоставленных пользователем заголовков. Она должна просмотреть всю базу данных и, используя пре-
^редварительные замечания о процессе разработки программ 263
доставленную пользователем информацию, найти ключевые слова, 1.а затем напечатать индекс. Это описание является типичным для1описаний задач, созданных до стадии анализа требований. Для ^получения обобщенного представления о задаче имеется достаточное количество информации. Однако если мы попытаемся вник-'нуть в подробности, то увидим, что описание задачи расплыв-\чато и неточно.
Начнем с рассмотрения случая нормальной работы системы. Удобно пронумеровать всю информацию, связывающую пользователя и программу. Программа должна получать от пользователя следующее: 1)где находится база данных с заголовками; 2)какие слова являются ключевыми; 3)куда помещать полученный индекс КСК.
Пользователь должен узнать от программы 1)какую информацию хочет сообщить ему программа; 2)успешно или нет закончился процесс построения индекса КСК.
Как уже говорилось, хорошим способом определения метода получения такой информации является создание наброска сеанса связи с программой. Однако перед этим мы должны решить, какой способ взаимодействия с программой использовать. В общем случае существуют два способа взаимодействия с программой: пользователь либо ожидает, пока .программа запросит у него информацию, либо предоставляет информацию первым, например, в качестве аргументов при вызове программы. Примем пока временное решение, считая, что данные пользователя будет запрашивать сама программа.
Начнем теперь составлять набросок сеанса связи. Разумно предположить, что пользователь начнет работу с вызова программы. Этот процесс, очевидно, обусловлен имеющимся программным окружением, в котором запускается наша задача КСК. Предположим, что задача КСК вызывается командой
^run kck
(Здесь символ )обозначает подсказку операционной системы.)
Отметим, что мы решили вызывать программу КСК без передачи ей каких-либо параметров. Это обусловлено двумя соображениями, Во-первых, позволяет использовать минимальный возможный интерфейс между операционной системой и задачей КСК. Например, мы не должны беспокоиться о синтаксисе, используемом для передачи аргументов программам, и даже о самой возможности такой передачи. Это делает нашу программу легко переносимой с одной системы на другую, а следовательно, более устойчивой к переменам в программном окружении.
Во-вторых, программа должна запрашивать необходимую ей информацию. Она может спросить, где находится база данных с заголовками или ключевыми словами. Поскольку эти данные
264 Глава 12
'Предварительные замечания о процессе разработки программ
изначально не имеют друг перед другом какого-либо преимущества, то мы можем построить диалог таким образом, чтобы поиск информации при этом облегчался. Знание чего-либо о ключевых словах вряд ли поможет нам в получении доступа к базе данных, в то время как наличие такого доступа может облегчить работу с ключевыми словами. Предположим, что программа спрашивают пользователя, где находится база данных, а пользователь предоставляет ей эту информацию. Предположим, что база данных находится в файле, к которому можно обращаться по имени:
'}run kck Введите имя индексируемой базы данных: cs. titles
В этом месте пользователь вводит имя файла, завершая ввод нажатием клавиши возврата каретки, т. е. показывая, что введено полное имя.
Теперь программе необходима информация, которая позволит решить, какие слова являются ключевыми. Одним из вариантов будет требование к пользователю перечислить все ключевые слова и предположить, что все остальные слова не являются ключевыми. Альтернативой может служить указание списка неключевых слов. Из этих двух вариантов, вероятно, лучше выбрать последний. В обоих случаях ошибка, связанная с пропуском каких-либо слов, неизбежна. В случаях, когда ошибки избежать невозможно, мы должны выбирать такой случай, когда возможные последствия подобной ситуации будут легче всегда поправимы. Пропуск в списке одного неключевого слова приведет к тому, что некоторые заголовки будут упорядочены неподходящим образом. С другой стороны, пропуск одного из ключевых слов может привести к пропуску некоторых заголовков. Предположив, что программа KCK запрашивает неключевые слова, продолжим наш пример.
Введите, пожалуйста, список неключевых слов.
Слова должны разделяться запятой или нажатием клавиши возврата каретки, а список завершается нажатием на клавишу esc.
Неключевые слова: a, as, at, ...
В процессе разработки сеанса связи становится ясно, что составление этого списка представляет собой долгий и утомительный процесс, причем ошибки из-за пропусков вырастают в отдельную проблему. Очевидно, что мы должны проанализировать другие возможности. Например, если пользователь должен указывать как список ключевых слов, так и список неключевых, то программа могла бы сравнивать каждое елово в заголовке со словами из данных списков. При обнаружении слова, отсутствующего в обоих списках, она может затем спросить у пользователя, в ка-
кой список его помещать; таким образом удастся избежать ошибок, связанных с пропуском слов.
Возникает вопрос, почему пользователь вообще должен вводить списки. Не лучше ли будет, если программа начнет с просмотра заголовков и каждый раз при обнаружении нового слова будет запрашивать пользователя, в какой список помещать данное слово. Такой подход имеет два важных преимущества: он уменьшает число возможных пользовательских ошибок и сокращает количество вводимых с клавиатуры слов. При таком подходе сеанс связи примет следующий вид:
Для приводимой последовательности символов напечатайте k, если данное слово ключевое, и п — если нет. А: п
Простой: п база: k язык: k для: п
персональный: k компьютер: k практический: k
Анализ данного примера показывает, что если в нашей базе данных имеется много различных слов, то их нумерация будет утомительной. Особенно это скажется в том случае, когда пользователю будет необходимо получить несколько индексов, для чего потребуется повторять процесс для каждого набора заголовков. Однако размышления приводят к мысли, что эта проблема легко разрешима. Программа может сохранить списки ключевых и неключевых слов для их повторного использования. Перед запуском программа может спросить, использовать ли ранее определенный словарь, и если это так, то какой файл должен быть использован. Если программа обнаруживает слово, которое отсутствует в словаре, то она запрашивает, является ли это слово ключевым, и дополняет затем словарь соответствующей информацией. В конце работы программа спрашивает пользователя, сохранять ли словарь, и если сохранять, то в каком файле. Пример сеанса связи может иметь следующий вид:
P> run kck
Введите имя индексируемой базы данных: cs.titles Введите имя исходного словаря cs. diet
Для приводимой последовательности символов напечатайте k, если данное слово ключевое, и п — если нет.
Если вы хотите сохранить исправленный словарь, то введите у, в противном случае введите п: у Введите имя файла, в котором нужно сохранять новый словарь: mycs.dict
266 Глава 12
Предварительные замечания о процессе разработки программ
Теперь мы располагаем несколькими способами получения информации о ключевых словах, и в этот момент лучше всего проконсультироваться с заказчиком. Мы можем перечислить преимущества и недостатки каждого подхода, после чего ознакомить с ними заказчика. Предположим, что заказчик остановил свой выбор на последней рассмотренной альтернативе.
Возникает также другая проблема, заключающаяся в том, насколько сложной должна быть программа распознавания клю-чевых слов. Если пользователь уже указал, что «ассемблер» является ключевым словом, то должна ли программа считать слово «ассемблер» также ключевым? Если да, то как быть со словами «ассемблированный», «ассемблирование» и т.д.? Аналогично, если пользователь указал, что слово «есть» не является ключевым, то должна ли программа считать также неключевыми слова «был», «были» и т. д. ?Это достаточно сложная проблема. Необходим некий компромисс между простотой пользования и сложностями при создании программы. С этим компромиссом необходимо ознакомить заказчика и оставить за ним принятие окончательного решения. Мы будем считать, что такое соглашение уже достигнуто.
Рассмотрим теперь последнюю информацию, которую должен предоставить пользователь: куда выдавать выходные данные, полученные программой КСК. Предположим, что выходные данные записываются в файл, а имя файла запрашивается у пользователя:
Введите имя выходного файла: cs. titles, out
Пользователь может вывести этот файл на печать или просмотреть его на экране терминала при помощи утилит, имеющихся в операционной системе.
Мы рассмотрели передачу информации от пользователя к задаче КСК. Для завершения анализа требований нам необходимо уючнить содержимое базы данных с заголовками (предполагая, что она не содержит ошибок) и формат выходных данных (также полагая, что в процессе обработки ошибок не произошло). Мы не будем определять здесь эти форматы. Основной вопрос, относящийся к базе данных, состоит в том, какими возможностями мы располагаем в манипуляции ее содержимым. Является ли она уже существующей базой данных с организацией, не поддающейся изменениям, или же она строится исходя из наших требований? Что касается входных данных, то выбор формата не представляет существенных сложностей. Однако трудно изначально сказать, какие (форматы окажутся для пользователей более предпочтительными. Зачастую лучше всего выбрать сначала какой-нибудь простой формат, спроектировав при этом программу таким обра-8ом, чтобы ее можно было легко модифицировать.
Рассмотрим теперь ошибки. К одной из возможных ошибок относится неправильно заданное пользователем имя файла. В этом случае программа должна требовать задания корректного имени.
К другим ошибкам относятся неверные данные в базе данных, например синтаксически неверные слова. Предположим, что программа КСК не имеет возможности изменять значения в базе данных, что исключает возможность немедленного исправления пользователем ошибки. Как продолжать «обработку в подобном случае? Пользователь может захотеть продолжить работу, что .позволит обнаружить и другие возможные ошибки. Для принятия решения нам необходимо знать, сколько данных будет потеряно в случае подобных пропусков и насколько нужной окажется информация об ошибках. Индексы КСК обычно составляются анализом большого числа заголовков, и основное время работы программы уходит на просмотр этих файлов. Далее, маловероятно, что ошибка в одном слове повлияет на обработку прилежащих к нему слов или заголовков. Информация в индексе о заголовке, содержащем ошибку, возможно, окажется неверной, однако при этом информация об остальных заголовках будет правильной. Это позволяет нам принять следующее решение. Если пользователь решит продолжить работу, то мы пропустим содержащее ошибку слово, если оно участвует в составлении индекса, и продолжим нормальную обработку последующих слов. По окончании работы мы дадим возможность пользователю отменить вывод полученных данных:
Если вы хотите получить индекс, введите Y,в противном случае введите N.
Наконец, поместим содержащие пропущенные слова заголовка в конец файла (если таковые имеются). Это дает возможность пользователю при необходимости ознакомиться с ними.
Как пользователь сообщает о завершении процесса? Вероятно, для этого в каждом сеансе связи должен быть предусмотрен специальный ответ пользователя. Прерывание программы должно заканчиваться нормально: например, пользователю должна быть предоставлена возможность создания нового словаря и повторного запуска программы.
Что можно сказать о проверке ошибок в словаре ключевых слов и в словаре неключевых слов? Поскольку словарь создает программа КСК, то теоретически ошибки в нем должны отсутствовать. Однако пользователь может указать файл, который был создан не программой КСК, файл, созданный КСК, но по каким-то причинам измененный, или файл, созданный версией КСК, содержавшей ошибку. Легкость решения этих проблем во многом определяется форматом словаря. Этот формат не должен быть частью спецификации, но определяться разработчиками. Мы,
268 Глава 12
^Предварительные замечания о процессе рюработки программ
однако, можем потребовать, чтобы словарь представлял собой файл в коде ASCII,что позволило бы пользователям его легко анализировать. Мы можем также ввести дополнительную доступную пользователям программу, дающую им возможность просматривать словарь и исправлять ошибки. (Для этой цели может подойти имеющийся редактор текста.) Ошибки в словаре могут породить серьезные проблемы. Они ведут либо к пропускам, либо к ошибкам в индексе. Факт обнаружения в словаре ошибки должен сообщаться пользователю, которому должна быть также предоставлена возможность воспользоваться другим словарем-.
Наконец, предположим, что программа КСК переходит в некоторое непредвиденное состояние вследствие программного или аппаратного сбоя. В этом случае нужно попытаться сохранить исправленный словарь во временном файле (такая возможность имеется не всегда) и остановить обработку. Если у нас есть основания считать, что программные или аппаратные сбои будут достаточно часты, то рекомендуется периодически сохранять словарь в промежуточном файле.
Для завершения требований в спецификации для программы КСК мы должны определить все пропущенные детали и указать ограничения по эффективности. Потенциальные модификации должны предполагать легкое переформатирование выходных дан" ных.
12.4. Заключение
Мыначали эту главу с рассмотрения жизненного цикла программного обеспечения. Была подчеркнута важность проведения перед проектированием и реализацией тщательного анализа требований. Основная часть главы была посвящена именно этому анализу. В следующей главе будет рассмотрен процесс проектирования.
Обычно процесс анализа отталкивается от того факта, что предоставленная заказчиком спецификация требований не является полной и понятной. Цель анализа заключается в углублении нашего понимания и описания требуемой системы в сравнительно полной и точной форме. В процессе анализа необходимо консультироваться с заказчиками, поскольку они являются главными судьями в принятии окончательных решений.
В процессе анализа требований должен быть рассмотрен ряд следующих аспектов:
1.Поведение программы должно быть определено как для правильных, так и для неправильных входных значений.
2.Должны быть исследованы различные аспекты, связанные с программными и аппаратными ошибками, в частности ограничения по доступности и надежности.
3.Должны быть учтены пространственно-временные ограниче-ьция. Эффективность отнюдь не является отдельной дополнитель-цонхарактеристикой. Она должна учитываться с самого начала.
4.Необходимо учесть ограничения в сроках разработки. График поставки готового продукта заказчику может оказать большое влияние на весь процесс проектирования и реализации..
5.Полезно отдельно рассматривать те части спецификации, которые в дальнейшем могут быть изменены.
6.Желательно знать, является ли создаваемая система совершенно повой или же следующей в ряду аналогичных систем, с тем чтобы предусмотреть в ней возможности дальнейшей моди-фикации,
Процесс анализа требований сложен. Мы предложили пример подхода, основанный на несложных сценариях и проиллюстрировали это па примере. Однако наша беседа на эту тему еще не закончена. Пожалуй, самым трудным и одновременно самым важным делом в процессе работы является вовлечение в нее заказчиков. Обсуждение связанных с этим проблем выходит за рамки данной книги.
Дополнительная литература
Воет, Barry W., 1981. Software Engineering Economics. Englewood Cliffs, N.J.: Prentice-Hall.
De Macro, Т., 1979, Structured Anait/sis and System Specification. Englewood Cliffs, N.J.: Prentice-Hall.
Heninger, Kathryn L., 1980. Specifying software requirements for complex systems: New techniques and their application. IEEE Transactions on Software Engineering SE-6(1): 2—13.
Упражнения
12.1. Подготовьте полную и точную спецификацию требований для задачи КСК. Не забудьте рассмотреть вопросы, связанные с форматом входных и выходных данных, а также проблемы, связавные с возникновением ошибок. Сформулируйте разумные требования к эффективности. Вы можете считать, что имеется достаточно оперативной памяти для одновременного хранения в ней всех данных задачи, полагая, что память не теряется.
12.2. Программа xref создает индекс для документа: для каждого слова, содержащею более одной буквы, программа печатает эти слова и номера всех строк, в которых оно встречается, например:
компилятор 3, 17, 25,... Подготовьте для задачи xref полную и четкую спецификацию требований.
^ Проектирование
•13. Проектирование
В предыдущих главах мы обсуждали спецификации и реализации отдельных абстракций. Мы выделяли абстракции по той причине, что они являются рабочими кирпичиками, из которых создаются программы. Теперь мы обсудим, как создавать абстракции и как соединять их вместе для построения программ.