Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
36
Добавлен:
23.03.2015
Размер:
933.38 Кб
Скачать

12.3. Пример задачи

Для иллюстрации вышесказанного мы исследуем программу, генерирующую индексы К.СК (ключевое слово в контексте) для наборов заголовков, с целью разработки неполной спецификации требований для этой программы. Индексы КСК и ^пользуются для просмотра базы данных с заголовками с целью нахождения интересующих заголовков. В общем случае база дан иых ограни­чена заголовками из некоторой области, например) научными исследованиями в области вычислительной техники -Назначение индекса заключается в ускорении поиска требуемых заголовков. Некоторые слова заголовка более полезны для этой 1Л_ели, нежели другие. Слова «с» и «для» бесполезны совсем, а слов а «компиля­тор» и «CLU», очевидно, полезны. Полезные слова называютсяключевыми словами.На выходе программы отыскиваемые заго­ловки отсортированы по ключевым словам. Пользою атель может затем просматривать отсортированный список, отыскивая слова, связанные с интересующей его темой. После нахожл.ения набора заголовков, содержащих требуемое ключевое слово, пользовагель может выбрать конкретные заголовки для более подробного рас­смотрения.

Для представления индекса имеются два способы: ключевые слова могут быть представлены «в контексте» или«внеконтекста». В КСК индексы ключевых слов остаются в файле на своих местах, но при этом подсвечиваются. Например, индекс КС^К для заго­ловков

Простой язык базы данных для персональных компьютеров Набор программ для создания переносных компиляторов Базы данных с тройным резервированием Облегчение процесса компилирования упорядочится следующим образом:

Набор программ для создания переносных компиляторов Облегчение процесса компилирования

Простой язык базы данных для персональных компьютеров Простой язык базы данныхдля персональных компьютеровБазы данных стройным резервированием

Мы хотим, чтобы программа создавала для базы да. иных индекс КСК на основании предоставленных пользователем заголовков. Она должна просмотреть всю базу данных и, используя пре-

^редварительные замечания о процессе разработки программ 263

доставленную пользователем информацию, найти ключевые слова, 1.а затем напечатать индекс. Это описание является типичным для1описаний задач, созданных до стадии анализа требований. Для ^получения обобщенного представления о задаче имеется доста­точное количество информации. Однако если мы попытаемся вник-'нуть в подробности, то увидим, что описание задачи расплыв-\чато и неточно.

Начнем с рассмотрения случая нормальной работы системы. Удобно пронумеровать всю информацию, связывающую пользова­теля и программу. Программа должна получать от пользователя следующее: 1)где находится база данных с заголовками; 2)какие слова являются ключевыми; 3)куда помещать полученный ин­декс КСК.

Пользователь должен узнать от программы 1)какую информацию хочет сообщить ему программа; 2)успешно или нет закончился процесс построения индекса КСК.

Как уже говорилось, хорошим способом определения метода получения такой информации является создание наброска сеанса связи с программой. Однако перед этим мы должны решить, какой способ взаимодействия с программой использовать. В общем случае существуют два способа взаимодействия с программой: пользователь либо ожидает, пока .программа запросит у него информацию, либо предоставляет информацию первым, например, в качестве аргументов при вызове программы. Примем пока вре­менное решение, считая, что данные пользователя будет запраши­вать сама программа.

Начнем теперь составлять набросок сеанса связи. Разумно предположить, что пользователь начнет работу с вызова программы. Этот процесс, очевидно, обусловлен имеющимся программным окружением, в котором запускается наша задача КСК. Предпо­ложим, что задача КСК вызывается командой

^runkck

(Здесь символ )обозначает подсказку операционной системы.)

Отметим, что мы решили вызывать программу КСК без пере­дачи ей каких-либо параметров. Это обусловлено двумя сообра­жениями, Во-первых, позволяет использовать минимальный воз­можный интерфейс между операционной системой и задачей КСК. Например, мы не должны беспокоиться о синтаксисе, используемом для передачи аргументов программам, и даже о самой возмож­ности такой передачи. Это делает нашу программу легко перено­симой с одной системы на другую, а следовательно, более устой­чивой к переменам в программном окружении.

Во-вторых, программа должна запрашивать необходимую ей информацию. Она может спросить, где находится база данных с заголовками или ключевыми словами. Поскольку эти данные

264 Глава 12

'Предварительные замечания о процессе разработки программ

изначально не имеют друг перед другом какого-либо преимуще­ства, то мы можем построить диалог таким образом, чтобы поиск информации при этом облегчался. Знание чего-либо о ключевых словах вряд ли поможет нам в получении доступа к базе данных, в то время как наличие такого доступа может облегчить работу с ключевыми словами. Предположим, что программа спрашивают пользователя, где находится база данных, а пользователь пре­доставляет ей эту информацию. Предположим, что база данных находится в файле, к которому можно обращаться по имени:

'}runkckВведите имя индексируемой базы данных: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. Проектирование

В предыдущих главах мы обсуждали спецификации и реализа­ции отдельных абстракций. Мы выделяли абстракции по той при­чине, что они являются рабочими кирпичиками, из которых соз­даются программы. Теперь мы обсудим, как создавать абстрак­ции и как соединять их вместе для построения программ.

Соседние файлы в папке Б. Лисков