Понятие технологичности программного обеспечения.



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

технологичность программного обеспечения определяется проработанностью его моделей, уровнем независимости модулей, стилем программирования и степенью повторного использования кодов.

Чем лучше проработана модель разрабатываемого ПО, тем четче определены подзадачи и структуры данных, хранящие входную, промежуточную и выходную информацию, тем проще их проектирование и реализация и меньше вероятность ошибок, для исправления которых потребуется существенно изменять программу.

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

Стиль программирования, под которым понимают стиль оформления программ и их «структурность», также существенно влияет на читаемость программного кода и количество ошибок программирования.

Увеличение степени повторного использования кодов предполагает как использование ранее разработанных библиотек подпрограмм или классов, так и унификацию кодов текущей разработки.: если степень повторного использования кодов повышается искусственно (например, путем разработки «суперуниверсальных» процедур), то технологичность проекта может существенно снизиться.

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

Модули и их свойства.

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

В настоящее время используют два способа декомпозиции разрабатываемого ПО, связанные с соответствующим подходом:

· процедурный (или структурный - по названию подхода);

· объектный.

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

Результатом объектной декомпозиции явл-я совок-ть объектов, кот затем реализуют как переменные некоторых специально разрабатываемых типов (классов), представляющих собой совокупность полей данных и методов, работающих с этими полями.

при любом способе декомпозиции получают набор связанных с соответствующими данными подпрограмм, которые в процессе реализации организуют в модули.

Модули. Модуль- автономно компилируемая прог-я единица. «модуль»: 1) когда размер программ был сравнительно невелик, и все подпрограммы компилировались отдельно, модцль - подпрограмма, т.е. последовательность связанных фрагментов программы, обращение к которой выполняется по имени. 2), когда размер программ значительно вырос, появилась возможность создавать библиотеки ресурсов: констант, переменных, описаний типов, классов и подпрограмм, «модуль» - автономно компилируемый набор программных ресурсов.

Данные модуль может получать и/или возвращать через общие области памяти или параметры.

Первоначально к модулям (подпрограммы) предъявлялись следующие требования:

-отдельная компиляция; -одна точка входа; -одна точка выхода;

-соответствие принципу вертикального управления;

-возможность вызова других модулей;

-небольшой размер (до 50-60 операторов языка);

-независимость от истории вызовов; -выполнение одной функции.

Требования одной точки входа, одной точки выхода, вызваны тем, что в то время из-за серьезных ограничений на объем оперативной памяти программисты были вынуждены разрабатывать программы с максимально возможной повторяемостью кодов. В результате подпрограммы, имеющие несколько точек входа и выхода, были не только обычным явлением, но и считались высоким классом программирования. Минус: программы было очень сложно модифицировать, понять, отладить.

когда основные требования структурного подхода стали поддерживаться языками программирования, и модуль= отдельно компилируемую библиотеку ресурсов, требование независимости модулей стало основным. что чем выше степень независимости модулей, тем:

· легче разобраться в отдельном модуле и всей программе и, соответственно, тестировать, отлаживать и модифицировать ее;

· меньше вероятность появления новых ошибок при исправлении старых или внесении изменений в программу, т. е. вероятность появления «волнового» эффекта;

· проще организовать разработку программного обеспечения группой программистов и легче его сопровождать.

=> уменьшение зависимости модулей улучшает технологичность проекта. Степень независимости модулей (как подпрограмм, так и библиотек) оценивают двумя критериями: сцеплением и связностью.

Сцепление модулей.

Сцепление является мерой взаимозависимости модулей, которая определяет, насколько хорошо модули отделены друг от друга. Модули независимы, если каждый из них не содержит о другом никакой информации. Чем больше информации о других модулях хранит модуль, тем больше он с ними сцеплен.

пять типов сцепления модулей: 1по данным; 2по образцу; 3по управлению;

 4по общей области данных; 5по содержимому.

Сцепление по данным - модули обмениваются данными, представленными скалярными значениями. При небольшом кол-ве передаваемых пар-ов этот тип обеспечивает наилучшие технологические характеристики ПО.

Например, функция Мах предполагает сцепление по данным через параметры скалярного типа:

Function Max(a, b: integer):integer;

Begin

if a>b then Max:=a else Max: =b;

end;

 

Сцепление по образцу - модули обмениваются данными, объединенными в структуры. обеспечивает неплохие хар-ки, но они хуже, чем у предыдущего типа, тк конкретные передаваемые данные «спрятаны» в структуры, и потому уменьшается «прозрачность» связи м/у модулями. Кроме того, при изменении структуры передаваемых данных необходимо модифицировать все использующие ее модули.

Так, функция MaxEl,предполагает сцепление по образцу (параметр а – открытый массив).

 

Function МахEl(а:array of integer):integer;

Var i:word;

Begin       MaxEl: =a[0]; for i:=l to High(a) do if a[i]>MaxEl

then MaxEl: =a[i]; end;

 

При сцеплении по управлению один модуль посылает другому некоторый инф-ый объект (флаг), предн. для управления внутренней логикой модуля. Таким способом часто выполняют настройку режимов работы ПО. Подобные настройки снижают наглядность взаимодействия модулей и потому обеспечивают еще худшие хар-ки технологичности разрабатываемого ПО по сравнению с пред типами связей.

Например, функция MinMax предполагает сцепление по управлению, тк значение параметра flag влияет на логику программы: if функция MinMax получает значение пар-ра flag, = true, то возвращает максимальное значение из двух, а если false, то минимальное:

 

Function MinMax(a, b:integer; flag:boolean):integer;

begin

if (a>b) and (flag) then MinMax: =a

else MinMax: =b;  end;

 

Сцепление по общей области данных - модули работают с общей областью данных. Этот тип считается недопустимым, тк:

-программы, использующие данный тип сцепления, очень сложны для понимания при сопровождении программного обеспечения;

-ошибка одного модуля, приводящая к изменению общих данных, может проявиться при выполнении другого модуля, что существенно усложняет локализацию ошибок;

-при ссылке к данным в общей области модули используют конкретные имена, что уменьшает гибкость разрабатываемого программного обеспечения.

Например, функция МахА, использующая глобальный массив А, сцеплена с основной программой по общей области:

 

Function MaxA:integer;

Var i:word;

Begin МахА: =a[Low(a)];

for i:= Low(a)+1 to High(a) do

if a[i]>MaxA then MaxA:=a[i]; end;

 

 «подпрограммы с памятью», действия которых зависят от истории вызовов, используют сцепление по общей области, что делает их работу в общем случае непредсказуемой. Именно этот вар-т исп-т стат-ие переменные С и C++.

В случае сцепления по содержимому один модуль содержит обращения к внутренним компонентам другого (передает управление внутрь, читает и/или изменяет внутренние данные или сами коды), что полностью противоречит блочно-иерархическому подходу. Отдельный модуль в этом случае уже не является блоком («черным ящиком»): его содержимое должно учитываться в процессе разработки другого модуля. Современные универсальные языки (Pascal), данного типа сцепления в явном виде не поддерживают, но для языков низкого уровня, (Ассемблер), такой вид сцепления остается возможным.

модули сцепляются м/у собой нес-ми способами. => кач-во ПО принято определять по типу сцепления с худшими характеристиками.

 

 

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

Связность –мера прочности соединения функциональных и информационных объектов внутри одного модуля. виды связности (в порядке убывания уровня):

· функциональную;

· последовательную;

· информационную (коммуникативную);

· процедурную;

· временную;

· логическую;

· случайную.

При функциональной связности все объекты модуля пред-ны для выполнения одной функции (рис.а): операции, объединяемые для выполнения одной функции, или данные, связанные с одной функцией. Модуль, элементы кот связаны функц-о, имеет четко определенную цель, при его вызове выполняется одна задача(подпрограмма поиска минимального элемента массива). Такой модуль имеет макс связность, => хорошие технологические кач-ва: простота тестирования, модификации и сопровождения. Именно с этим связано одно из требований структурной декомпозиции «один модуль – одна функция».

При последовательной связности функций выход одной функции служит исходными данными для другой функции (рис. 2.1, б)., такой модуль имеет одну точку входа, т.е. реализует одну подпрограмму, выполняющую две функции. данные, используемые послед-ми ф-ми, также связаны последовательно. Модуль с последовательной связностью функций можно разбить на два или более модулей, как с последовательной, так и с функциональной связностью. Такой модуль выполняет нес-ко ф-ий, =>, его технологичность хуже: сложнее организовать тестирование, при выполнении модификации мысленно приходится разделять функции модуля.

Информационно связанными считают функции, обрабатывающие одни и те же данные (рис. 2.1, в). При использовании структурных языков программирования раздельное выполнение функций можно осуществить только, если каждая функция реализуется своей подпрограммой. Несмотря на объединение неск-их ф-ий, информационно связанный модуль имеет неплохие показатели технологичности. Тк все функции, работающие с некоторыми данными, собраны в одно место, что позволяет при изменении формата данных корректировать только один модуль. Информационно связанными также считают данные, которые обрабатываются одной функцией.

Процедурно связаны функции или данные, которые являются частями одного процесса (рис. 2.1, г). получают, если в модуле объединены функции альтернативных частей программы. При процедурной связности отдельные элементы модуля связаны крайне слабо, тк реализуемые ими действия связаны лишь общим процессом, => технологичность данного вида связи ниже, чем предыдущего.

Временная связность - функции выполняются // или в течение некоторого периода времени (рис. 2.1, д). Временная связность данных означает, что они используются в некотором временном интервале( вр-ю связность имеют фу-и, выполняемые при инициализации некоторого процесса). Отличие: действия, реализуемые такими функциями, обычно могут выполняться в любом порядке. Содержание модуля с временной связностью функций имеет тенденцию меняться: в него могут включаться новые действия и/или исключаться старые. Большая вероятность модификации функции еще больше уменьшает показатели технологичности модулей данного вида по сравнению с предыдущим.

Логическая связь базируется на объединении данных или функций в одну логическую группу (рис. 2.1, е). В качестве примера можно привести функции обработки текстовой информации или данные одного и того же типа. Модуль с логической связностью часто реализует альтернативные варианты одной операции, ( сложение целых чисел и сложение вещественных чисел). Из такого модуля всегда будет вызываться одна какая-либо его часть, при этом вызывающий и вызываемый модули будут связаны по управлению. Понять логику работы модулей труднее, чем модулей, использующих временную связность => показатели техн-сти еще ниже.

В том случае, если связь между элементами мала или отсутствует, считают, что они имеют случайную связность. Модуль, элементы которого связаны случайно, имеет самые низкие показатели технологичности, так как элементы, объединенные в нем, вообще не связаны.

 

 


Дата добавления: 2018-02-15; просмотров: 197; ЗАКАЗАТЬ РАБОТУ