Оценка качества модульной программы
При проектировании модульной программы возникает необходимость оценки качества каждого модуля и всей программы, построенной по модульному принципу. Как уже отмечалось, одной из наиболее простых, но важных характеристик модуля является его сложность, которая в простейшем случае определяется числом строк кода (или числом операторов). Другой оценкой сложности модуля, которая широко используется на практике, выступает число условных операторов IF, которые позволяют оценить число путей выполнения программы. При разработке каждого модуля это число не должно превышать 10. Опыт разработки программной Продукции приводит к выводу, что схема модуляризации удовлетворительна, если минимальна сложность каждого модуля и если сложность равномерно распределена по всей программе. Следует избегать "зон повышенной сложности", т.е. модулей с существенно большей сложностью.
Кроме размера модуля, на сложность программы и простоту ее восприятия оказывают существенное влияние связи между внутренними элементами каждого модуля и связи между модулями. Модули связываются с помощью данных, а также структурой управления в программе. Явная связь между модулями появляется, когда между ними передаются данные в виде параметров, а косвенная связь, когда модули ссылаются на одни и те же данные. Для снижения сложности программы связи между модулями необходимо минимизировать. Степень независимости между модулями принято описывать с помощью сцепления (coupling). При малом сцеплении модуль может быть легко понят без изучения другого, либо изменен без изменений в других модулях.
Три фактора оказывают влияние на сцепление модулей:
1. Число элементов данных, передаваемых между ними (чем больше передается данных, тем сильнее сцепление).
2. Количество управляющих данных, передаваемых между модулями.
3. Число глобальных элементов данных, которые совместно используются модулями.
Первый фактор — это число параметров, которые передаются в вызываемый модуль.
Часто передача многих параметров показывает, что модуль выполняет не одну, а несколько функций. На сложность программы оказывает влияние не только число, но и тип передаваемых данных. Целесообразно в качестве передаваемых параметров использовать не структурные, а простые данные.
Совместно используемые данные — данные, которые явно упоминаются в модуле, а не передаются в виде параметров. Наиболее ярким примером служат глобальные данные. Использование глобальных данных усложняет понимание и особенно изменение отдельных модулей, так как их данные могут использоваться незаметным образом и разными путями. Между модулями различают несколько типов сцепления (5—7). Наилучшим, наиболее слабым, является сцепление по данным, причем данные передаются явно в качестве параметров в виде простых переменных или массивов и используются непосредственно для решения функциональной задачи модуля, а не для управления. Несколько хуже, когда модули связаны между собой через сложный структурный элемент данных (например, запись). При этом вызываемый модуль использует только отдельные элементы записи. Такой вид сцепления называют сцеплением по образцу- Существенно более сильное сцепление между модулями, когда они используют одну и ту же область глобальных данных (сцепление по общей области).
Другим показателем или мерой качества схемы модуляризации является связность (cohesion), которая определяет, как сильно между собой связаны элементы внутри модуля. Наиболее сильная и наилучшая связность — функциональная, которая характеризуется тем, что каждый элемент модуля служит необходимой и существенной частью для выполнения одной, и только одной функции. Такой модуль не может быть разбит на два других модуля, так как он выполняет одну специфическую функцию. Всего принято рассматривать 7 уровней связности. Ориентировочно функциональный уровень связности на практике можно определить, если описать функцию модуля в виде одного повелительного предложения.
Обычно через сцепление и связность оценивается качество схемы модуляризации, но они могут быть также использованы и для оценки степени приспособленности программы к изменениям. На простоту изменения программы влияют как внутренняя структура каждого модуля, так и межмодульные связи. Хорошая программа должна иметь высокую связность каждого модуля и слабое сцепление модулей между собой.