При проектировании сложного ПО выполняют декомпозицию компонентов (в соотвеств с подходом) до получения простых элементов. При этом используют два способа декомпозиции: процедурный (структурный), объектный.
Результатом процедурной декомпозиции является иерархия подпрограмм (процедур), в которой верхние уровни - процедуры, связанные с принятием решения, а нижние уровни - процедуры обработки.
Результатом объектной декомпозиции является совокупность объектов, представляющих собой поля и методы, работающие с этими полями.
Таким образом, при любом способе декомпозиции получают набор процедур , которые в процессе реализации организуют в модули.
· Модули и их свойства.
Термин «модуль» используется в двух смыслах. Первоначально – это подпрограммы (они компилировались отдельно). В настоящее время - это набор программных ресурсов (констант, переменных, описаний типов, классов и подпрограмм) компилируемый автономно.
Чем выше степень независимости модулей, тем:
• легче разобраться в модуле, тестировать, отлаживать и модифицировать его;
• меньше «волновой» эффект - новые ошибки при исправлении старых
• проще организовать разработку ПО группой программистов.
Таким образом, уменьшение зависимости модулей улучшает технологичность проекта.
Степень независимости модулей (как подпрограмм, так и библиотек) оценивают двумя критериями: сцеплением и связностью.
· Сцепление модулей.
Сцепление - мера взаимозависимости модулей, определяющая, насколько хорошо модули отделены друг от друга. Модули независимы, если каждый из них не содержит о другом никакой информации. Чем больше информации о других модулях хранит модуль, тем больше он с ними сцеплен.
Различают пять типов сцепления модулей:
• по данным - модули обмениваются только скалярными данными ;
• по образцу - модули обмениваются структурами данных;
• по управлению - один модуль посылает другому сигнал (флаг), предназначенный для управления внутренней логикой модуля, что снижает наглядность взаимодействия модулей;
• по общей области данных - модули работают с общей областью данных. Этот тип сцепления считается недопустимым, поскольку: программы сложны при сопровождении; есть зависимость от истории вызовов; ошибка одного модуля может проявиться при выполнении другого (усложняется локализация ошибок); используются конкретные имена;
• по содержимому - один модуль содержит обращения к внутренним компонентам другого, это противоречит блочно-иерархическому подходу. Отдельный модуль в этом случае уже не является «черным ящиком»: его содержимое должно учитываться в процессе разработки другого модуля. Pascal не поддерживают данного типа сцепления, но в Ассемблере это возможно.
Как правило, модули сцепляются между собой несколькими способами. Качество ПО принято определяет-ся по типу сцепления с худшими характеристиками.
Так, если использовано сцепление по данным и сцепление по управлению, то определяющим считают сцепление по управлению.
· Связность модулей.
Связность – степень взаимосвязи элементов, реализуемых одним модулем.
Размещение сильно связанных элементов в одном модуле уменьшает межмодульные связи и взаимное влияние модулей.
Размещение же сильно связанных элементов в разные модули усиливает межмодульные связи и усложняет понимание их взаимодействия.
Объединение слабо связанных элементов также уменьшает технологичность модулей, так как ими сложнее мысленно манипулировать.
Различают следующие виды связности (в порядке убывания уровня):
• функциональную - все объекты модуля предназначены для выполнения одной функции ;
• последовательную - выход одной функции служит исходными данными для другой функции ;
• информационно - связанными считают функции, обрабатывающие одни и те же данные ;
• процедурную - функции или данные, которые являются частями одного процесса. Обычно модули с процедурной связностью функций получают, если в модуле объединены функции альтернативных частей программы.
• временную - функций подразумевает, что эти функции выполняются параллельно или в течение некоторого периода времени;
• логическую - объединении данных или функций в одну логическую группу;
• случайную - если связь между элементами мала или отсутствует.