Компонентный подход. Модульность Сложность системы
![]() |
Компонентно-ориентированная модель реализуется по принципу, представленному на рисунке 25. Она широко использует программные модули.
Рис. 25
![]() |
Зависимость стоимости системы от количества модулей может быть представлена диаграммой рис. 26.
Рис. 26
При реализации модульных систем применяется принцип информационной закрытости. Содержание (процедуры, данные) модулей должно быть скрыто друг от друга. Это означает следующее: все модули независимы, обмениваются только той информацией, которая необходима для работы. Доступ к операциям и структурам модуля ограничен. Достоинства такого подхода - возможность работы разных команд и простая модификация системы. Идеальный модуль – «черный ящик».
Связность модуля (cohesion) – внутренняя характеристика модуля, характеризующая меру прочности соединения функциональных и информационных объектов внутри одного модуля. При проектировании модулей нужно стремиться к высокой связности, так как чем выше связность, тем лучше спроектирован модуль.
Существует 7 типов связности:
1. По совпадению (CC=0)
2.Логическая (CC=1)
3.Временная (CC=3)
4.Процедурная (CC=5) – рис. 27
5.Коммуникативная (Информационная) (CC=7) – рис. 28
6.Последовательная (CC=9) – рис. 29
7.Функциональная связность (CC=10) – рис. 30.
![]() |
![]() |
Рис. 27
Рис. 28
Рис. 2
![]() |
9
Рис. 30
![]() |
Характеристики мер связности модулей приведены в таблице.
Связанность (сцепление, coupling) модулей является мерой их взаимозависимости. При создании систем необходимо стремиться к максимальной независимости модулей, т.е. связанность модулей должна быть минимальной.
Сцепление может быть следующих типов:
1) По данным (рис. 31);
2) По образцу (рис. 32);
3) По управлению (рис. 33);
4) По общей области (рис. 34);
5) По содержимому (рис. 35).
![]() |
![]() |
Рис. 31
Рис. 32
![]() |
Рис. 33
Рис. 34
Рис. 3
![]() |
5
Характеристики иерархической структуры программы – высота и ширина. Высота равна количеству уровней иерархии (на рис. 36 их 3), а ширина определяется по формуле, приведенной ниже.
![]() |
Рис. 36
Сложность программной системы
Оценивается методом тестирования базового пути. При этом строится потоковый граф, который имеет следующие свойства:
1) Отображает управляющую структуру;
2) Узлы (вершины) графа = линейным участка;
3) Дуги = поток управления;
4) Узлы могут быть операторные и предикатные;
5) Предикатный узел = простое условие;
6) Регионы – отдельные подграфы;
7) Окружающая среда.
![]() |
Условный оператор на графе отображается как показано на рис. 37.
Рис. 37
Условие с операцией Or представляется графом рис. 38.
![]() |
Рис. 38
Наиболее часто используется понятие цикломатической сложности, которая определяет:
● Количество независимых путей в базовом множестве алгоритма;
● Верхнюю оценку количества тестов, которая гарантирует однократное выполнение всех операторов.
![]() |
Все независимые пути образуют базовое множество. Для графа рис. 38 таких путей 3 (см. рис. 39)..
Рис. 39
Способы расчета:
1. Количество регионов потокового графа;
2. V(G)=E-N+2, где E — кол-во дуг, N — кол-во узлов;
3. V(G)=p+1, где p — кол-во предикатных узлов.
Автоматизация сборки
Работа с проектом состоит из следующих этапов.
● Создать каталог / структуру каталогов
● Создать файл / множество файлов
● Написать код
● Проверить его
● Откомпилировать код
● Запустить и проверить модуль / систему
● Собрать модули в исполняемые файлы
● Создать дистрибутив.
Для сборки используются скрипты
● В Windows
– BAT (Batch, DOS)
– CMD (Command, Windows NT)
– PowerShell (Windows 2003)
● В Linux / Unix
– sh
– bash и т.п.
![]() |
Пример BAT файла приведен на рис. 40.
Рис. 40
PowerShell исполбзует Командлеты (англ. cmdlets) — это специализированные команды, которые реализуют различную функциональность. Они именуются по правилу Глагол-Существительное, например Get-ChildItem, благодаря чему их назначение понятно из названия. Командлеты выводят результаты в виде объектов или их коллекций. Дополнительно они могут получать входные данные в такой же форме и, соответственно, использоваться как получатели в конвейере. Хотя PowerShell позволяет передавать по конвейеру массивы и другие коллекции, командлеты всегда обрабатывают объекты поочередно. Для коллекции объектов обработчик командлета вызывается для каждого объекта в коллекции по очереди.
В PowerShell, как и в оболочках UNIX/Linux, присутствует конвейер. Он служит для передачи выходных данных одного командлета во входные данные другого. PowerShell включает язык сценариев с динамическими типами, на котором можно реализовывать сложные операции с использованием командлетов. Язык сценариев поддерживает переменные, функции, конструкции ветвления (if-then-else) циклы (while, do, for и foreach), структурированную обработку ошибок и множество других возможностей, включая интеграцию с .NET.
Ant
Apache Ant (англ. ant — муравей и акроним — «Another Neat Tool») — утилита для автоматизации процесса сборки программного продукта. Является платформонезависимой аналогом Ant был создан в рамках проекта Jakarta. Это — самостоятельный проект первого уровня Apache Software Foundation. Первая версия была разработана инженером Sun Microsystems Джеймсом Дэвидсоном (James Davidson).
Управление процессом сборки происходит посредством XML- сценария, также называемого Build-файлом. В первую очередь, этот файл содержит определение проекта, состоящего из отдельных целей (Targets). Цели сравнимы с процедурами в языках программирования и содержат вызовы команд-заданий (Tasks). Каждое задание представляет собой неделимую, атомарную команду, выполняющую некоторое элементарное действие. Между целями могут быть определены зависимости — каждая цель выполняется только после того, как выполнены все цели, от которых она зависит (если они уже были выполнены ранее, повторное выполнение не производится). Типичными примерами целей являются clean (удаление промежуточных файлов), compile (компиляция всех классов), deploy (развёртывание приложения на сервере). Конкретный набор целей и их взаимосвязи зависят от специфики проекта.
Краткий список заданий (команд).
Javac компиляция Java-кода
Copy копирование файлов
Delete удаление файлов и директорий
Move перемещение файлов и директорий
Replace замещение фрагментов текста в файлах
JUnit автоматический запуск юнит-тестов
Exec выполнение внешней команды
Zip создание архива в формате Zip
CVS выполнение CVS-команды
Mail отправка электронной почты
Xslt наложение XSLT-преобразования.
Пример простого сценария сборки приведен ниже.
Первая строка содержит общую информацию о собираемом проекте.
<project name=”simpleCompile” default=”deploy” basedir=”.”>
Самые важные атрибуты элемента project это default (по умолчанию) и basedir (базовая директория). Атрибут default указывает на target (задание), определенное для выполнения по умолчанию.
Ant работает из командной строки, поэтому вполне реально указать только подмножество необходимых задач из всего файла сборки. Например, запустив следующую команду:
% ant -buildfile simple.xml init
Запустив такую команду, обработчик Ant'а выполнит только задание (target) с атрибутом name, которого равно init. Итак, в нашем примере заданием по умолчанию является deploy. Следующий пример команды запуска Ant выполнит именно задание указанное по умолчанию, так как нет указания в командной строке на какое-либо конкретное задание:
% ant -buildfile simple.xml
<target name=”init”>
<target name=”clean” dependens= ”init”>
В общем случае элемент target содержит пять атрибутов: name, if, unless, depends и description. Обязательным атрибутом является name, когда как остальные — необязательные.
Указывая значение атрибута depends, вы можете указать Ant'у, что данное задание зависит от других заданий и не может быть выполнено пока не выполнятся все задания из указанных в атрибуте. В приведенном выше примере, задание clean не запустится до тех пор, пока не завершится задание init. Атрибут depends может включать несколько значений имен заданий через запятую, тем самым указывая, что зависит от нескольких заданий. Атрибуты if и unless дают вам возможность указать задания, которые выполнятся если указанное свойство установлено (в случае if) или наоборот, в случае unless не установлено. Вы можете использовать команду available для установки свойств, как показано в следующем примере, либо в командной строке.
<available classname="org.whatever.Myclass"
property="Myclass.present"/>
Задание init из нашего примера содержит установку четырех свойств вида:
<property name="sourceDir" value="src" />
Очень часто property (свойствам) присваивают часто используемые директории или файлы. Атрибуты элемента property это пары name(имя) и value(значение). Установка свойств позволит логически подвязать необходимые директории или файлы вместо их прямого использования. Если нужно сослаться на свойство с именем sourceDir где-либо позднее в файле, вы можете использовать следующий синтаксис, указывающий Ant'у подставить соответствующее значение установленное в элементе property ранее: ${sourceDir}. Пример:
<javac srcdir="${src.dir}"
destdir="${build.classes}"
classpath="${classpath}"
debug="on"
deprecation="off"
optimize="on">
<include name="**/*.java"/>
<exclude name="**/Script.java"
unless="bsf.present" />
<exclude name="**/version.txt" />
< /javac>