tehnologia (1018792), страница 10
Текст из файла (страница 10)
Подобные настройки также снижают наглядность взаимодействия модулей ипотому обеспечивают еще худшие характеристики технологичности разрабатываемогопрограммного обеспечения по сравнению с предыдущими типами связей.Например, функция MinMax предполагает сцепление по управлению, так как значениепараметра flag влияет на логику программы: если функция MinMax получает значениепараметра flag, равное true, то возвращает максимальное значение из двух, а если false, томинимальное:Function MinMax(a, b:integer; flag:boolean):integer;beginif (a>b) and (flag) then MinMax: =aelse MinMax: =b;end;Сцепление по общей области данных предполагает, что модули работают с общейобластью данных. Этот тип сцепления считается недопустимым, поскольку:• программы, использующие данный тип сцепления, очень сложны для понимания присопровождении программного обеспечения;• ошибка одного модуля, приводящая к изменению общих данных, может проявитьсяпри выполнении другого модуля, что существенно усложняет локализацию ошибок;• при ссылке к данным в общей области модули используют конкретные имена, чтоуменьшает гибкость разрабатываемого программного обеспечения.49Например, функция МахА, использующая глобальный массив А, сцеплена с основнойпрограммой по общей области:Function MaxA:integer;Var i:word;beginМахА: =a[Low(a)];for i:= Low(a)+1 to High(a) doif a[i]>MaxA then MaxA:=a[i];end;Следует иметь в виду, что «подпрограммы с памятью», действия которых зависят отистории вызовов, используют сцепление по общей области, что делает их работу в общемслучае непредсказуемой.
Именно этот вариант используют статические переменные С иC++.В случае сцепления по содержимому один модуль содержит обращения к внутреннимкомпонентам другого (передает управление внутрь, читает и/или изменяет внутренниеданные или сами коды), что полностью противоречит блочно-иерархическому подходу.Отдельный модуль в этом случае уже не является блоком («черным ящиком»): егосодержимое должно учитываться в процессе разработки другого модуля. Современныеуниверсальные языки процедурного программирования, например Pascal, данного типасцепления в явном виде не поддерживают, но для языков низкого уровня, напримерАссемблера, такой вид сцепления остается возможным.В табл.
2.1 приведены характеристики различных типов сцепления по экспертнымоценкам [21, 30]. Допустимыми считают первые три типа сцепления, так как использованиеостальных приводит к резкому ухудшению технологичности программ.Таблица 2.1ТипсцепленияПо даннымПо образцуПо управлениюПо общей областиПо содержимомуСцепление,балл134610Устойчивостьк ошибкамдругихмодулейХорошая*СредняяСредняяПлохаяПлохаяНаглядность(понятность)ВозможностьизмененияВероятностьиспользованияХорошаяХорошая*ПлохаяПлохаяПлохаяХорошаяСредняяПлохаяСредняяПлохаяБольшаяСредняяМалаяМалаяМалая* Зависит от количества параметров интерфейса.50Как правило, модули сцепляются между собой несколькими способами.
Учитывая это,качество программного обеспечения принято определять по типу сцепления с худшимихарактеристиками. Так, если использовано сцепление по данным и сцепление поуправлению, то определяющим считают сцепление по управлению.В некоторых случаях сцепление модулей можно уменьшить, удалив необязательныесвязи и структурировав необходимые связи. Примером может служить объектноориентированное программирование, в котором вместо большого количества параметровметод неявно получает адрес области (структуры), в которой расположены поля объекта, иявно – дополнительные параметры. В результате модули оказываются сцепленными пообразцу.Связность модулей. Связность – мера прочности соединения функциональных иинформационных объектов внутри одного модуля.
Если сцепление характеризует качествоотделения модулей, то связность характеризует степень взаимосвязи элементов,реализуемых одним модулем. Размещение сильно связанных элементов в одном модулеуменьшает межмодульные связи и, соответственно, взаимовлияние модулей. В то же времяпомещение сильно связанных элементов в разные модули не только усиливаетмежмодульные связи, но и усложняет понимание их взаимодействия. Объединение слабосвязанных элементов также уменьшает технологичность модулей, так как такимиэлементами сложнее мысленно манипулировать.Различают следующие виды связности (в порядке убывания уровня):• функциональную;• последовательную;• информационную (коммуникативную);• процедурную;• временную;• логическую;• случайную.При функциональной связности все объекты модуля предназначены для выполненияодной функции (рис. 2.1, а): операции, объединяемые для выполнения одной функции, илиданные, связанные с одной функцией.
Модуль, элементы которого связаны функционально,имеет четко определенную цель, при его вызове выполняется одна задача, например,подпрограмма поиска минимального элемента массива. Такой модуль имеет максимальнуюсвязность, следствием которой являются его хорошие технологические качества: простотатестирования, модификации и сопровождения. Именно с этим связано одно из требованийструктурной декомпозиции «один модуль – одна функция».Из тех же соображений следует избегать неструктурированного распределения функциимежду модулями – библиотеками ресурсов.
Например, если при проектировании текстовогоредактора предполагается функция редак-51тирования, то лучше организовать модуль – библиотеку функций редактирования, чемпоместить часть функций в один модуль, а часть в другой.При последовательной связности функций выход одной функции служит исходнымиданными для другой функции (рис. 2.1, б). Как правило, такой модуль имеет одну точкувхода, т.е. реализует одну подпрограмму, выполняющую две функции. Считают, что данные,используемые последовательными функциями, также связаны последовательно. Модуль споследовательной связностью функций можно разбить на два или более модулей, как споследовательной, так и с функциональной связностью.
Такой модуль выполняет несколькофункций, и, следовательно, его технологичность хуже: сложнее организовать тестирование, апри выполнении модификации мысленно приходится разделять функции модуля.Информационно связанными считают функции, обрабатывающие одни и те же данные(рис. 2.1, в). При использовании структурных языков программирования раздельноевыполнение функций можно осуществить только, если каждая функция реализуется своейподпрограммой. Хотя раньше в подобных случаях обычно использовали разные точки входав модуль, оформленный как одна подпрограмма.Несмотря на объединение нескольких функций, информационно связанный модульимеет неплохие показатели технологичности. Это объясняется тем, что все функции,работающие с некоторыми данными, собраны в одно52место, что позволяет при изменении формата данных корректировать только один модуль.Информационно связанными также считают данные, которые обрабатываются однойфункцией.Процедурно связаны функции или данные, которые являются частями одного процесса(рис.
2.1, г). Обычно модули с процедурной связностью функций получают, если в модулеобъединены функции альтернативных частей программы. При процедурной связностиотдельные элементы модуля связаны крайне слабо, так как реализуемые ими действиясвязаны лишь общим процессом, следовательно, технологичность данного вида связи ниже,чем предыдущего.Временная связность функций подразумевает, что эти функции выполняютсяпараллельно или в течение некоторого периода времени (рис. 2.1, д).
Временная связностьданных означает, что они используются в некотором временном интервале. Например,временную связность имеют функции, выполняемые при инициализации некоторогопроцесса. Отличительной особенностью временной связности является то, что действия,реализуемые такими функциями, обычно могут выполняться в любом порядке. Содержаниемодуля с временной связностью функций имеет тенденцию меняться: в него могутвключаться новые действия и/или исключаться старые. Большая вероятность модификациифункции еще больше уменьшает показатели технологичности модулей данного вида посравнению с предыдущим.Логическая связь базируется на объединении данных или функций в одну логическуюгруппу (рис. 2.1, е).
В качестве примера можно привести функции обработки текстовойинформации или данные одного и того же типа. Модуль с логической связностью функцийчасто реализует альтернативные варианты одной операции, например, сложение целых чисели сложение вещественных чисел. Из такого модуля всегда будет вызываться одна какая-либоего часть, при этом вызывающий и вызываемый модули будут связаны по управлению.Понять логику работы модулей, содержащих логически связанные компоненты, как правило,сложнее, чем модулей, использующих временную связность, следовательно их показателитехнологичности еще ниже.В том случае, если связь между элементами мала или отсутствует, считают, что ониимеют случайную связность.
Модуль, элементы которого связаны случайно, имеет самыенизкие показатели технологичности, так как элементы, объединенные в нем, вообще несвязаны.Обратите внимание, что в трех предпоследних случаях связь между несколькимиподпрограммами в модуле обусловлена внешними причинами. А в последнем – вообщеотсутствует. Это соответствующим образом проецируется на технологическиехарактеристики модулей. В табл. 2.2 представлены характеристики различных видовсвязности по экспертным оценкам [21, 30].Анализ табл. 2.2 показывает, что на практике целесообразно использоватьфункциональную, последовательную и информационную связности.53Таблица 2.2ВидсвязностиФункциональнаяПоследовательнаяИнформационнаяПроцедурнаяВременнаяЛогическаяСлучайнаяСцепление, Наглядность Возможность Сопровождаемостьбалл(понятность) изменения10ХорошаяХорошаяХорошая9ХорошаяХорошаяХорошая8СредняяСредняяСредняя5СредняяСредняяПлохая3СредняяСредняяПлохая1ПлохаяПлохаяПлохая0ПлохаяПлохаяПлохаяКак правило, при хорошо продуманной декомпозиции модули верхних уровнейиерархии имеют функциональную или последовательную связность функций и данных.