Функциональная связность


Связность модуля

Связность модуля (Cohesion) – это мера зависимости его частей [58], [70], [77]. Связность – внутренняя характеристика модуля. Чем выше связность модуля, тем лучше результат проектирования, то есть тем «черней» его ящик (капсула, защитная оболочка модуля), тем меньше «ручек управления» на нем находится и тем проще эти «ручки».

Для измерения связности используют понятие силы связности (СС). Существует
7 типов связности:

1) связность по совпадению(СС=0) – в модуле отсутствуют явно выраженные внутренние связи.

2) логическая связность (СС=1) – части модуля объединены по принципу функционального подобия. Например, модуль состоит из разных подпрограмм обработки ошибок. При использовании такого модуля клиент выбирает только одну из подпрограмм.

Недостатки:

- сложное сопряжение;

- большая вероятность внесения ошибок при изменении сопряжения ради одной из функций.

3) временная связность (СС=3) – части модуля не связаны, но необходимы в один и тот же период работы системы.

Недостаток: сильная взаимная связь с другими модулями, отсюда – сильная чувствительность к внесению изменений.

4) процедурная связность (СС=5) – части модуля связаны порядком выполняемых ими действий, реализующих некоторый сценарий поведения.

5) коммуникативная связность (СС=7) – части модуля связаны по данным (работают с одной и той же структурой данных).

6) информационная (последовательная) связность (СС=9) – выходные данные одной части используются как входные данные в другой части модуля.

7) функциональная связность (СС=10) – части модуля вместе реализуют одну функцию.

Отметим, что типы связности 1, 2, 3 – результат неправильного планирования архитектуры, а тип связности 4 – результат небрежного планирования архитектуры приложения. Общая характеристика типов связности представлена в табл. 1.1.

Таблица 1.1 Характеристика связности модуля

Тип связности Сопровождаемость Роль модуля
Функциональная Лучшая сопровождаемость «Черный ящик»
Информационная (последовательная) Не совсем «черный ящик»
Коммуникативная «Серый ящик»
Процедурная Худшая сопровождаемость «Белый» или «просвечивающий ящик»
Временная «Белый ящик»
Логическая
По совпадению

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

- вычислять синус угла;

- проверять орфографию;

- читать запись файла;

- вычислять координаты цели;

- вычислять зарплату сотрудника;

- определять место пассажира.

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

Некоторые из функционально связных модулей очень просты (например, Вычислять синус угла или Читать запись файла), другие сложны (например, Вычислять координаты цели). Модуль Вычислять синус угла, очевидно, реализует единичную функцию, но как может модуль Вычислять зарплату сотрудника выполнять только одно действие? Ведь каждый знает, что приходится определять начисленную сумму, вычеты по рассрочкам, подоходный налог, социальный налог, алименты и т.д.! Дело в том, что, несмотря на сложность модуля и на то, что его обязанность исполняют несколько подфункций, если его действия можно представить как единую проблемную функцию (с точки зрения клиента), тогда считают, что модуль функционально связен.

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