Костерин В В
Шрифт:
К внутренним спецификациям относятся описания состава внутренних частей программы, описания их взаимосвязи, а также внутренние функциональные спецификации.
Внутренние функциональные спецификации включают описания алгоритмов как всей программы, так и ее частей с учетом спецификации внутренних данных программы (переменных, особенно структурированных).
Изложенные далее абстракции процедуры, данных и объектов лежат в основе многих методов разработки программного обеспечения. В общем случае любую программу можно представить набором процедурных абстракций (рис. 1.2). Анализируя рис. 1.2, можно получить обобщенную абстракцию процедуры, изображенную на рис. 1.3. Абстракции процедур наиболее полно воплотились в технологии структурного программирования.
Разделяя в программе тело процедуры и обращения к ней, язык высокого уровня реализует два важных метода абстракции: абстракцию через параметризацию и абстракцию через спецификацию.
Рис. 1.2. Абстракция программы как набора процедур, обрабатывающих данные
Рис. 1.3. Абстракция процедуры
Абстракция через параметризацию позволяет, используя параметры, представить фактически неограниченный набор различных вычислений одной процедурой, которая есть абстракция всех этих наборов. Например, необходима процедура сортировки массива целых чисел А. При дальнейшей разработке программы возможно возникновение потребности в сортировке другого массива, но уже с другим именем. Использование абстракции через параметризацию обобщает процедуру сортировки и делает ее более универсальной.
Абстракция через спецификацию позволяет абстрагироваться от процесса вычислений, описанных в теле процедуры, до уровня знания лишь того, что данная процедура должна в итоге реализовать. Это достигается путем задания для каждой процедуры спецификации, описывающей эффект ее работы, после чего смысл обращения к данной процедуре становится ясным через анализ этой спецификации, а не самого тела процедуры.
При анализе спецификации для уяснения смысла обращения к процедуре нужно придерживаться следующих двух правил.
Правило 1. После выполнения процедуры можно считать, что выполнено конечное условие. Выполнение конечного условия при соблюдении начальных условий — это собственно то, ради чего и построена процедура. Если это процедура поиска максимального значения в массиве, то конечное условие — факт, что максимальный элемент найден. Если это процедура вычисления квадратного корня, то конечное условие — нахождение квадратного корня.
Правило 2. Можно ограничиться только той информацией, которую подразумевает конечное условие.
Эти правила демонстрируют два преимущества абстракции через спецификацию. Первое состоит в том, что программисты, использующие данную процедуру, не обязаны знакомиться с текстом ее тела. Следовательно, им не нужно уяснять, например, подробности алгоритма отыскания квадратного корня, устанавливая, действительно ли возвращенный результат — искомое число.
Второе правило показывает, что на самом деле имеем дело с абстракцией: абстрагируясь от тела процедуры, можно не обращать внимания на несущественную информацию. Именно такое «игнорирование» информации и отличает абстракцию от декомпозиции. Конечно, анализируя тело процедуры, можно извлечь некоторое количество информации, не следующей из конечного условия (как, например, то, что найденный элемент первый или последний в рассмотренном выше примере). В спецификации подобная информация о возвращаемом результате отбрасывается.
Абстракции через параметризацию и через спецификацию являются мощным средством для создания программ. Они позволяют определить два вида абстракций: процедурную абстракцию и абстракцию данных. В общем случае каждая процедурная абстракция и абстракция данных используют оба способа.
Например, абстракцию SQRT (извлечение квадратного корня) можно сравнить с операцией: она абстрагирует отдельное событие или задачу. Мы будем ссылаться к абстракциям такого рода, как к процедурным абстракциям. Отметим, что абстракция SQRT включает в себя как абстракцию через параметризацию, так и абстракцию через спецификацию.
На процедурной абстракции основана разработка структуры программы в технологии структурного программирования. Базовая компонента технологии структурного программирования — модуль, которому обычно соответствует подпрограмма (процедура или функция на языках программирования высокого уровня).
Рассматривая программу не как набор процедур, а прежде всего как некоторые наборы данных, каждый из которых имеет разрешенную группу процедур, получаем абстрактное представление программы, представленное на рис. 1.4. Анализ рис. 1.4 позволяет также получить абстракцию данных, показанную на рис. 1.5.
В технологии абстрактных данных Дейкстры применяется функциональная модель в виде набора диаграмм потоков данных (далее — ДПД; DFD — Data Flow Diagram), которые описывают смысл операций и ограничений. ДПД отражает функциональные зависимости значений, вычисляемых в системе, включая входные значения, выходные значения и внутренние хранилища данных. ДПД — это граф, на котором показано движение значений данных от их источников через преобразующие их процессы к их потребителям в других объектах. Фрагменты ДПД показаны на рис. 1.6.