logo
Лекции_ПиОА[1]

4.2. Основные характеристики программного модуля

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

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

2. Прочность модуля  это мера его внутренних связей. Чем выше прочность модуля, тем больше связей он может спрятать от внешней по отношению к нему программы и тем больший вклад в упрощение программы он внесет. Для оценки степени прочности используется упорядоченный набор классов модулей. Самой слабой степенью прочности обладает модуль, прочный по совпадению. Это модуль, между элементами которого нет осмысленных связей. Такой модуль выделяется при обнаружении в разных местах программы повторения одной и той же последовательности операторов. Изменение этой последовательности в одном месте приводит к изменению самого модуля, что делает его использование в других местах ошибочным. Этот класс модулей не рекомендуется использовать. Из остальных к использованию рекомендуются только два высших класса. Рассмотрим эти классы.

1) Функционально прочный модуль  это модуль, выполняющий одну определенную функцию. Такой модуль могут использовать и другие модули.

2) Информационно прочный модуль  это модуль, выполняющий несколько операций (функций) над одной и той же структурой данных или информационными объектами, которые считается неизвестными вне рамок модуля. Для каждой из этих операций в модуле имеется свой вход со своей формой обращения к нему. Этот класс модулей обладает высшей степенью прочности. Информационно прочный модуль реализует, например, абстрактный тип данных.

3. Сцепление модуля  это мера его зависимости по данным от других модулей. Сцепление характеризуется способом передачи данных. Чем слабее сцепление модуля, тем сильнее его независимость. Для оценки степени сцепления используется упорядоченный набор видов сцепления. Худшим видом является сцепление по содержимому. Таким является сцепление двух модулей, когда один из них имеет прямые ссылки на содержимое другого модуля, например, его константу. Такое сцепление недопустимо. Не рекомендуется использовать также сцепление по общей области, когда несколько модулей используют одну и ту же область памяти. Такое сцепление реализовано, например, в языке ФОРТРАН в форме блоков COMMON. Единственным видом сцепления модулей, который рекомендуется для использования, является параметрическое сцепление, когда данные передаются модулю при обращении к нему как значения его параметров, или как результат его обращения к другому модулю для вычисления некоторой функции. Такой вид сцепления модулей реализован в языках программирования, использующих обращения к процедурам (функциям).

4. Рутинность модуля  это его независимость от предыстории обращений к нему. Модуль называется рутинным, если результат (эффект) обращения к нему зависит только от значений его параметров. Модуль называется зависящим от предыстории, если результат обращения к нему зависит от его внутреннего состояния, изменяемого в результате предыдущих обращений. Такие модули могут провоцировать появление в программах неуловимых ошибок. Однако во многих случаях зависящий от предыстории модуль является лучшей реализаций информационно прочного модуля. Следует использовать рутинный модуль, если это не приводит к плохим сцеплениям модулей. Зависящие от предыстории модули следует использовать в случае, когда это необходимо для обеспечения параметрического сцепления. При этом в спецификации модуля необходимо формулировать эту зависимость, чтобы прогнозировать его поведение при последующих обращениях к нему.