Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на госэкзамен / модул_программ.doc
Скачиваний:
43
Добавлен:
02.05.2014
Размер:
98.3 Кб
Скачать

Классы прочности модулей

Назовем эти классы в порядке возрастания прочности или связности. Вы должны понимать, что чем к большему по номеру классу относится конкретный программный модуль, тем он “доброкачественнее”.

Чтобы отнести модуль к тому или иному классу, нужно проанализировать выполняемую им функцию (или функции).

1. Прочность по совпадению.

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

Например,

Модуль Разные_функции (какие-то параметры)

поздравить С Новым годом ( . . . . );

проверить исправность аппаратуры (. . . .);

измерить температуру (. . . . .);

запастись продуктами (. . . . );

вывести собаку на прогулку (. . . .)

конец модуля.

Элементы такого модуля не связаны ни потоком данных, ни потоком управления. Один и тот же параметр модуля в его функциях может быть использован для разных целей, поэтому, чтобы таким модулем мог кто-нибудь воспользоваться, он должен представлять собой “белый ящик”, (его реализация должна быть полностью видима). Такие модули труднее сопровождать, чем программу совсем без модульности. Связанные по совпадению модули могут появляться либо в результате бездумного перевода существующего монолитного кода в модули, либо корректировки модулей большей связности путем добавления флагов.

2. Прочность по логике - при каждом вызове выполняется некоторая функция из набора функций модуля. Как следует из этого определения, прочный по логике модуль выполняет несколько функций, и требуемая в конкретный момент функция выбирается (определяется) вызывающим модулем.

Пример: библиотека стандартных программ, реализующих численные методы или

Модуль Пересылка сообщения( … )

переслать по электронной почте(. . );

переслать по факсу (. . );

послать в телеконференцию (. . . );

переслать по ftp-протоколу(. . . )

конец модуля.

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

Основная проблема с модулями этого класса – это использование одного и того же сопряжения в разных программах. Правила этого сопряжения должны быть выдержаны как в вызывающем модуле, так и вызываемых модулях. Другая не менее важная проблема – запутанная внутренняя структура со множеством переходов, похожая на итальянское спагетти (такая структура является следствием экономии на операторах программы). Связанные по логике модули являются сложными для понимания и сопровождения.

3. Временная связность – модуль выполняет несколько функций, отнесенных разработчиком к одному классу потому, что они необходимы в один и тот же период работы системы.

Например: autoexec.bat или модуль инициализации магнитной ленты:

Модуль Инициализация МЛ

Перемотать магнитную ленту 1;

Счетчик магнитной ленты 1 := 0;

Перемотать магнитную ленту 2;

Счетчик магнитной ленты 2 := 0;

Таблица текущих записей := пробел. . . пробел;

Таблица количества записей :=0. . . 0;

Переключатель1 := выкл;

Переключатель 2 := вкл;

конец модуля

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

Для таких модулей основная проблема состоит в том, что они неявно связаны с другими модулями и при изменениях прочных по классу модулей часто возникают ошибки, когда эти связи не учитываются. Другая особенность – невозможность использования некоторых функций модуля отдельно от других. Так, если возникает необходимость перемотки и установки значений только для магнитной ленты 2, то использовать вышеприведенный модуль невозможно. Необходимо либо написать другой модуль для работы только с магнитной лентой 2, либо ввести флаги, указывающие инициализируемую часть. Второй путь будет хуже первого (лучшее решение – создавать отдельные модули инициализации для магнитной ленты 1 и магнитной ленты 2). Модули с временной связностью обладают плохой характеристикой сопровождаемости.

4. Процедурно-прочный модуль (процедурная связность) – выполняет несколько функций относящихся к одной функциональной процедуре решения задачи. Такой модуль состоит из элементов, реализующих независимые действия, для которых задан порядок работы, то есть порядок передачи управления. Зависимости по данным между элементами нет. Например,

Модуль вычисления средних значений

используется таблица-1, таблица-2;

вычислить среднее по таблица-1;

вычислить среднее по таблица 2;

вернуть среднее_табл1, среднее_табл2;

конец модуля.

Модули с процедурной связностью находятся на границе между плохой и хорошей сопровождаемостью. Чтобы проиллюстрировать возможные проблемы, положим, что таблицы 1 и 2 имеют одинаковое количество элементов, например, 300. Нетрудно себе представить программиста, который реализовал данный модуль следующим образом:

Модуль вычисления средних значений

используется таблица-1, таблица-2;

сумма_табл1 := 0;

сумма_табл2 := 0;

для i:=1 до 300

сумма_табл1:= сумма_табл1 + таблица-1(i);

сумма_табл2:= сумма_табл2 + таблица-2(i);

конец для

среднее_табл1:= сумма_табл1/300;

среднее_табл2:= сумма_табл2/300;

вернуть среднее_табл1, среднее_табл2;

конец модуля.

Для процедурной связности этот пример типичен – независимый (на уровне проблемы) код стал зависимым (на уровне реализации). Представим себе ситуацию, что после сдачи заказчику выясняется, что фактический размер таблицы –2 не превышает 100 элементов. Возникшая вроде бы ниоткуда задача сопровождения становится не совсем тривиальной.

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

Соседние файлы в папке Ответы на госэкзамен