- •Минобрнауки россии
- •Оглавление
- •Введение
- •1 Требования к оформлению и содержанию курсовой работы
- •Методические аспекты автоматизированного проектирования ис
- •2.1 Автоматизированные информационные системы
- •2.2 Назначение case-технологий
- •Понятие о структурном анализе
- •Средства структурного анализа и их взаимоотношения
- •3 Проектирование информационной системы с использованием структурного подхода
- •3.1 Функциональная модель idef0
- •Моделирование потоков данных
- •3.3 Workrflow-модели
- •3.4 Поведенческие модели
- •Проектирование информационной системы с использованием объектно-ориентированного подхода
- •4.1 Структура Унифицированного языка моделирования
- •4.2 Семантика и синтаксис uml
- •4.3 Нотация uml
- •5 Моделирование использования
- •6 Моделирование структуры
- •6.1 Диаграммы классов
- •6.2 Диаграммы реализации
- •7 Моделирование поведения
- •7.1 Диаграмма автомата
- •7.2 Диаграмма деятельности
- •7.3 Диаграммы взаимодействия
- •Заключение
- •Библиографический список
- •Приложение а «Задания к курсовой работе»
- •1 Информационная система конструкторского бюро
- •2 Информационная система завуча школы
- •3 Информационная система выставки собак
- •4 Информационная система птицефабрики
- •5 Информационная система почты
- •6 Информационная система футбольных соревнований
- •Информационная система методиста
- •8 Информационная система диспетчера техобслуживания
- •9 Информационная система технического архива
- •10 Информационная система менеджера музыкальной групп
- •Приложение б «Примеры библиографических описаний»
- •1 Однотомные издания
- •1.1 Книги одного, двух и трех авторов
- •1.2 Книги четырех авторов
- •1.3 Книги более четырех авторов
- •5.2 Материалы, подготовленные составителями. Сборники с общим названием. Словари, справочники.
- •5.3 Сборники научных трудов. Тезисы докладов
- •5.4 Официальные документальные материалы. Материалы съездов, пленумов, конференций
- •6 Нормативно-технические и технические документы (госТы, стандарты, нормативы, нормы, инструкции, типовые проекты, чертежи, прейскуранты, каталоги и др.)
- •7 Патентные документы
- •Краткое описание
- •8 Депонированные работы и препринты
- •9 Неопубликованные документы
- •9.1 Отчет о научно-исследовательской работе
- •10.3 Статьи из сериального (периодического) издания (журнала, газеты)
- •10.4 ... Из трудов, ученых записок
- •10.5 Из материалов конференций, семинаров и т.Д.
- •Приложение в «Шаблон технического задания на разработку по» Техническое задание
6 Моделирование структуры
6.1 Диаграммы классов
В этом разделе рассматриваются способы ответа на вопрос из чего состоит система?
Фундаментальными понятиями объектно-ориентированного подхода являются понятия объекта и класса, которые являются абстракциями реальной или воображаемой сущности (набора сущностей). Класс анализа еще более абстрактная сущность, чем просто класс, и представляет собой набор из одного или более классов. Таким образом, класс анализа – это укрупненная абстракции, которая на концептуальном уровне (без точного определения атрибутов и операций) описывает некоторый фрагмент системы.
Существует три вида классов анализа:
граничный
управляющий
сущности
Диаграмма классов анализа по существу является прообразом классической диаграммы классов. Элементами, отображаемыми на диаграмме, являются классы и отношения между ними. При этом для отображения классов можно воспользоваться стандартным обозначением класса (прямоугольник) с указанием внутри него соответствующего стереотипа или соответствующими знаками-стереотипами.
Таблица 9 - Варианты отображения классов анализа
Варианты отображения |
Граничный класс |
Управляющий класс |
Класс сущности |
Графический стереотип |
«Нормативы» |
|
|
Стандартное обозначение со строкой-стереотипом |
|
|
|
Назначение классов анализа:
граничный класс – используется для моделирования взаимодействия между системой и актерами (пользователями, внешними системами или устройствами). Взаимодействие часто включает в себя получение или передачу информации, запросы на предоставление услуг и т.д. Граничные классы являются абстракциями диалоговых окон, форм, панелей, коммуникационных интерфейсов, интерфейсов периферийных устройств, интерфейсов API (application program interface, англ. – интерфейс прикладных программ) и т.д. Каждый граничный класс должен быть связан как минимум с одним актером;
управляющий класс – отвечает за координацию, взаимодействие и управление другими объектами, выполняет сложные вычисления, управляет безопасностью, транзакциями и т.п.
класс сущности – используется для моделирования долгоживущей, нередко сохраняемой информации. Классы сущности являются абстракциями основных понятий предметной области – людей, объектов, документов и т.д., как правило, хранимых в табличном или ином виде.
Связи между классами анализа отображаются с использованием отношений пяти видов:
ассоциаций
агрегаций
композиций
обобщения
зависимостей
Отношение ассоциации применительно к диаграмме классов анализа показывает, что объекты одного класса содержат информацию о существовании (наличии в памяти) объектов другого класса и между ними имеется некоторая логическая или семантическая связь. Если ассоциация указана сплошной линией без стрелок или в виде двунаправленной стрелки, то в объекты одного класса будут содержать ссылку на объекты другого и наоборот. Если ассоциация указана однонаправленной стрелкой, то ссылка будет содержаться только в объектах класса, из которого исходит стрелка. Отношение ассоциации может указываться между классами анализа как одного, так и разных типов.
Рисунок 44 - Пример ассоциации
О
тношение
агрегации
указывает на отношение «часть»-«целое»
и отображается сплошной линией с
незакрашенным ромбиком со стороны
«целого». Данное отношение, как и
ассоциация, означает, что объект-целое
содержит ссылку на объект-часть.
Объект-часть также может содержать
ссылку на объект-целое. Агрегации может
указываться только между классами
одного типа.
Рисунок 45 - Пример агрегации
Отношение композиции аналогично агрегации, в которой «части» не могут существовать отдельно от «целого». Применительно к классам (объектам) это означает, что при уничтожении объекта-«целого» должны быть уничтожены все связанные с ним объекты-«части». При этом допускается создание объектов-«частей» намного позже или уничтожение намного ранее объекта-«целого».
Рисунок 46 - Пример композиции
О
тношение
обобщения
является обычным таксонометрическим
отношением между более общим (абстрактным)
классом (родителем или предком) и его
частным случаем (дочерним классом или
потомком). Графически данное отношение
обозначается сплошной линией со стрелкой,
в виде незакращенного треугольника, от
потомка к родителю. Отношение обобщения
может быть только между классами одного
вида.
Рисунок 47 - Пример обобщения
Отношение зависимости применительно к диаграмме классов анализа означает, что в спецификации или теле методов объектов одного класса (зависимого) выполняется обращение к атрибутам, методам или непосредственного к объектам другого класса (независимого). Графически данное отношение обозначается штриховой стрелкой от зависимого класса к независимому. Данное отношение может указываться между классами анализа как одного, так и разных типов. Например, в теле метода инициализации init() класса IskraPUT выполняется обращение к методу getProperties(), определенному в классе System и считывающему системные параметры компьютера.
Рисунок 48 - Пример зависимости
В заключение этой части параграфа еще один простой пример диаграммы класса для системы управления банкоматом (рисунок 49).
Рисунок 49 - Диаграмма класса для системы управления банкоматом
Состав диаграммы аналогичен диаграмме классов анализа. В то же время классы анализа должны пройти процедуру строгой экспертизы на предмет их возможной декомпозиции на более мелкие и специализированные классы. При построении диаграммы окончательно должны быть определены атрибуты и операции классов.
Особенности задания атрибутов, методов и отношений между классами будут иллюстрироваться с учетом специфики (синтаксиса и семантики) языка программирования Java.
Графически класс отображается в виде прямоугольника, который может быть разделен горизонтальными линиями на секции. В этих секциях указывается имя, атрибуты (свойства) и операции (методы).
Рисунок 50 - Способы отображения класса
Секция атрибутов выделяется горизонтальной линией, даже если у класса отсутствуют атрибуты (характерно для классов-интерфейсов). На рисунке 30 приведен пример определения интерфейса без атрибутов, выполняющего доступ к характеристикам отрезка пути с однородными уровнями допускаемой скорости.
«interface» VdopRow |
|
getKmN() getKmK() getVkonLoc() getVkonVag() |
Рисунок 51 - Пример класса без атрибутов (интерфейса)
С точки зрения структурного подхода, атрибуты – это переменные, а методы – это функции, описанные в теле класса. Они могут быть доступны или не доступны для изменения (атрибуты) или выполнения (методы) внешними объектами.
Обязательным элементом обозначения класса на диаграмме является его имя. Оно должно быть уникальным в пределах пакета. Если класс является абстрактным, то его имя пишется курсивом. Абстрактный класс – это класс, на основе которого нельзя создать объекты. Такие классы используются в качестве шаблона для дочерних классов при наследовании.
В секции имени класса может быть указан стереотип (например, «entity», «boundary», «interface» и т.п.).
Во второй секции каждому атрибуту соответствует отдельная строка со следующей спецификацией:
[видимость] имя [: тип [‘[‘кратность‘]‘] [ = исходное значение]] [‘{‘строка-свойство’}’]
Квадратные скобки означают, что соответствующий элемент спецификации может отсутствовать. Таким образом, при описании обязательным является только имя атрибута.
Видимость (visibility, англ.) характеризует возможность чтения и модификации значения атрибута для объекта, описываемого класса, из объектов других классов. Модификация значения возможна лишь при условии, что атрибут не является константой. Видимость отображается с помощью следующих символов:
«+» – общедоступный атрибут (public, англ.) – доступен для чтения и модификации из объектов любого класса;
«#» – защищенный атрибут (protected, англ.) – доступен только объектам описываемого класса и его потомкам при наследовании;
«–» – закрытый атрибут (private, англ.) – доступен только объектам описываемого класса;
«~» – пакетный атрибут (package, англ.) – доступен только объектам классов, входящих в тот же пакет.
Имя (name, англ.) атрибута представляет собой строку текста, которая используется для его идентификации. Оно должно быть уникальным в пределах класса.
Тип (type, англ.) атрибута выбирается исходя из семантики значений, которые должны храниться в атрибуте, и, как правило, возможностей целевого языка программирования по представлению этих значений. Он соответствует одному из стандартных типов, определенных в этом языке (например, String, Boolean, Integer, Color и т.д.) или имени класса, на объекты которого в этом атрибуте будет храниться ссылка. Во втором случае класс, имя которого указано в качестве типа, должен быть определен на диаграмме или в модели.
Кратность (multiplicity, англ.) атрибута характеризует количество значений, которые можно хранить в атрибуте. Если кратность атрибута не указана, то по умолчанию принимается ее значение равное 1, т.е. атрибут является атомарным. Такой вариант допускает и отсутствие значения в атрибуте (null). Для атрибута, представляющего собой массив, множество, список и т.п., требуется указание кратности, которая записывается после типа в квадратных скобках. Варианты указания кратности, имеющие смысл, могут быть следующие:
[0..*] или [*] – количество хранимых значений может принимать любое положительное целое число, большее или равное 0. Такой вариант задания кратности характерен для множеств, списков и других атрибутов, допускающих добавление или удаление элементов;
[0..<число>] – количество хранимых значений, может быть не более указанного числа. Данный вариант применяется при описании массивов фиксированного размера. При этом не обязательно, чтобы все элементы массива имели конкретные значения;
[0..<число>] [0..<число>] – применяется при описании двумерных массивов. Аналогичным образом можно описать трехмерные, четырехмерные и т.д. массивы.
Исходное значение (default value, англ.) служит для задания некоторого начального значения атрибута в момент создания отдельного экземпляра класса (объекта).
Строка-свойство (property-string, англ.) описывает особенности реализации атрибута. В частности, в строке-свойстве можно указывать следующую информацию:
{final} или {readOnly} – атрибут является константой, т.е. доступен только для чтения;
{static} – атрибут в момент выполнения программы в конкретный момент времени будет иметь одно и то же значение для всех объектов класса;
{transient} – атрибут и его значение при записи объекта в БД или файл (сериализации объекта) не должно запоминаться;
{derived} – значение атрибута определяется по значениям других атрибутов (производный атрибут);
{unique} – значения неатомарного атрибута должны быть уникальны;
{ordered} или {unordered} – значения неатомарного атрибута должны быть отсортированы (ordered) или могут содержаться в произвольном порядке (unordered).
Допускается в строке-свойстве, через запятую, указывать сразу несколько модификаторов. Например, {ordered, unique} означает, что элементы массива должны быть уникальны и следовать в строго определенном порядке.
В таблице 10 приведены примеры указания спецификации атрибутов и соответствующий им код программы, автоматически генерируемый Case-средством для языка Java.
Таблица 10 - Примеры указания атрибутов
Спецификация атрибута в UML |
Генерируемый код для языка Java |
+ name : String |
public String name; |
+ pi : double = 3.1415 {final, static} |
public final static double pi = 3.1415; |
– coordinateXY : int[][] = {{1, 1}, {2, 4}, {3, 9}} |
private int[][] coordinateXY = {{1, 1}, {2, 4}, {3, 9}}; |
# visible : boolean = true |
protected boolean visible = true; |
– connect : ConnectDB = null; |
private ConnectDB connect = null; |
В Java типы, указанные с прописной буквы, называются примитивными (например, double или boolean). Значения атрибутов такого типа непосредственно хранится в объекте. Типы, указанные с заглавной буквы, называются ссылочными (например, String или ConnectDB). В атрибуте такого типа хранится ссылка на объект, созданный на базе соответствующего класса.
В третьей секции указывается перечень методов класса. Можно выделить шесть основных типов методов:
конструктор – метод, создающий и инициализирующий объект. В Java имя конструктора совпадает с именем класса;
деструктор – метод, уничтожающий объект. В некоторых языках программирования (в частности в Java) определение деструкторов не требуется, т.к. очистка памяти от неиспользуемых объектов (сборка мусора) выполняется автоматически;
модификатор – метод, который изменяет состояние объекта (значения атрибутов). Имена модификаторов начинаются, как правило, со слова set (установить, англ.). Например, установить атрибуту Name новое значение setName(newName : String);
селектор – метод, который может только считывать значения атрибутов объекта, но не изменяет их. Имена селекторов начинаются, как правило, со слов get (получить, англ.) или is при возврате логического результата. Например, считать значение атрибута Name - getName() или определить видимость на экране элемента графического интерфейса - isVisible();
итератор – метод, позволяющий организовать доступ к элементам объекта. Например, для объекта, представляющего собой множество Set или список List, это могут быть методы перейти к первому элементу first(), следующему next(), предыдущему previous() и т.п.;
событие – метод, запускаемый на выполнение автоматически при выполнении определенных условий.
Тип метода при построении диаграммы классов, как правило, указывается с помощью стереотипа.
Каждому методу соответствует отдельная строка со следующей спецификацией:
[видимость] имя ([список параметров]) [: тип] [‘{‘строка-свойство’}’]
Видимость и имя метода задаются по тем же правилам, что и для атрибутов класса.
Список параметров является перечнем разделенных запятой параметров метода, каждый из которых может быть представлен в следующем виде:
имя : тип [‘[‘кратность‘]‘] [ = значение по умолчанию]] [‘{‘строка-свойство’}’]
Имя и кратность параметра задаются по тем же правилам, что и для атрибутов класса.
Тип параметра – тип значений, которые может принимать параметр.
Значение по умолчанию – значение, которое передается в метод, если при вызове метода данный параметр не определен.
Тип метода – тип результата, возвращаемого методом. Если тип не указан, то метод не возвращает никакого результата и обозначается с помощью модификатора void.
Строка-свойство метода служит для указания специфических свойств метода. В частности, в строке-свойстве можно указывать следующую информацию:
{native} – реализация метода зависит от платформы (операционной системы);
{abstract} – метод в описываемом классе не имеет тела. Код метода должен быть определен в дочерних классах;
{synchronized} – при одновременном (параллельном) вызове метода с помощью разных сообщений, должна гарантироваться целостность объекта и корректность обработки информации;
В таблице 11 приведены примеры указания спецификации методов и соответствующий им код программы, автоматически генерируемый Case-средством для языка Java.
Таблица 11 - Примеры указания методов
Спецификация атрибута в UML |
Генерируемый код для языка Java |
«constructor» + TextFieldInt(value : int, length : int, alligment : int, fontField : Font) |
public TextFieldInt(int value, int length, int alligment, Font fontField) { } |
+ saveData() |
public void saveData() { return;} |
+ isVisible() : Boolean |
public boolean isVisible() { return false;} |
# init(text : String, icon : Icon) |
protected void init(String text, Icon icon) { return;} |
В Java методы, не возвращающие результата, обозначаются с помощью модификатора void. Для остальных методов обязательно должен указываться тип возвращаемого результата. Исключение составляют конструкторы, для которых тип результата не указывается, а возвращаемое значение является ссылкой на объект, который был создан при вызове конструктора.
Далее иллюстрируется связь между графическим отображением классов и отношений на диаграммах и исходными текстами программ. Современные Case-средства при разработке классов, как правило, работают в режиме синхронизации диаграмм и исходных текстов. Т.е. если меняется диаграмма классов, то это приводит к автоматической корректировке текста программы и наоборот.
Отношение ассоциации означает наличие атрибута, в котором будет храниться ссылка (ссылки) на объект (объекты) класса, в сторону которого направлена стрелка ассоциации.
Рисунок 52 - Интерпретация ассоциации в тексте программы
Г
рафический
символ класса Class_A
преобразуется в строки определения
самого класса «public
class
Class_A»
и его
конструктора «public
Class_A()
{}».
Аналогично для Class_B.
Ассоциация от Class_B
в сторону Class_A
преобразуется в строку «public
Class_A
object_A;»,
описывающую атрибут object_A, в котором
будет храниться ссылка на объект класса
Class_A.
Ввиду отсутствия указания кратности
отношения, она по умолчанию принимается
равной 1. На рисунке 53 приведен пример
двунаправленной ассоциации и кратностью
более 1.
Рисунок 53 - Интерпретация двунаправленной ассоциации
Наличие двунаправленной ассоциации или ассоциации без стрелок свидетельствует о наличии в обоих классах атрибутов, содержащих ссылки на объекты. Кратность более 1 подразумевает хранения не одной, а нескольких ссылок. Таким образом, один объект класса Class_A будет связан с несколькими объектами класса Class_B. Ссылки на эти объекты будут храниться в массиве object_B[]. Современные Case-средства позволяют вместо массива указывать другие варианты хранения набора объектов, такие как множества, списки, хешированные таблицы и т.д.
Отношения
агрегации
и композиции
являются частными случаями ассоциации.
В связи с этим интерпретация этих
отношений с точки зрения текста программы
совпадает с рассмотренной выше. Окончание
агрегации (
)
или композиции (
)
интерпретируется, как стрелка. Если
требуется хранить ссылки на объекты-части
в объекте-целом, то с обратной стороны
отношения показывается стрелка.
Рисунок 54 - Интерпретация композиции (агрегации) (а);
двунаправленной композиции (агрегации) (б)
Отношение обобщения в тексте программы на языке Java показывается ключевым словом «extends» (расширяет, англ.) в дочернем классе.
Рисунок 55 - Интерпретация обобщения
О
тношение
зависимости
не приводит к автоматической генерации
кода программы, но свидетельствует об
обращение из объекта зависимого класса
к атрибутам, методам или непосредственного
к объектам независимого класса. Данное
отношение в Case-средстве
может автоматически отображаться на
диаграмме при обратном проектировании
или при синхронизации диаграммы и текста
программы.
Рисунок 56 - Интерпретация зависимости
На рисунке 56 показан условный пример, свидетельствующий о наличии зависимости класса Class_B от класса Class_A. В строке «public obrabotka(Class_A object_A)» используется ссылка на объект класса Class_A. В строке «String name = object_A.name;» выполняется обращение к атрибуту объекта класса Class_A. В строке «int age = object_A.getAge();» выполняется обращение к методу объекта класса Class_A.
При одновременном наличии между классами отношений типа ассоциация и зависимость на диаграмме отображается ассоциация, как более сильная связь.
На диаграммах разного типа, в т.ч. и на диаграмме классов, для показа специфики связей, поведения или взаимодействия могут отображаться объекты. Вид объекта аналогичен классу, но при этом его имя должно быть подчеркнуто и, как правило, приведены атрибуты и их значения, вызвавшие необходимость отображения объекта на диаграмме.
Рисунок 57 - Пример объекта
