Диаграмма классов (class diagram) — диаграмма языка UML, на которой представлена совокупность декларативных или статических элементов модели, таких как классы с атрибутами и операциями, а также связывающие их отношения.
Диаграмма классов предназначена для представления статической структуры модели системы в терминологии классов объектно-ориентированного программирования. При этом диаграмма классов может содержать интерфейсы, пакеты, отношения и даже отдельные экземпляры классификаторов, такие как объекты и связи. Когда говорят о данной диаграмме, имеют в виду статическую структурную модель проектируемой системы, т.е. графическое представление таких структурных взаимосвязей логической модели системы, которые не зависят от времени.
Класс
Класс (class) — абстрактное описание множества однородных объектов, имеющих одинаковые атрибуты, операции и отношения с объектами других классов.
Графически класс в нотации языка UML изображается в виде прямоугольника, который дополнительно может быть разделен горизонтальными линиями на разделы или секции (рис.28). В этих секциях могут указываться имя класса, атрибуты и операции класса.
Рис. 28. Варианты графического изображения класса на диаграмме классов
На начальных этапах разработки диаграммы отдельные классы могут обозначаться простым прямоугольником, в котором должно быть указано имя соответствующего класса (рис. 28 а). По мере проработки отдельных компонентов диаграммы описание классов дополняется атрибутами (рис. 28 б) и операциями (рис. 28 в). Четвертая секция (рис. 28 г) не обязательна и служит для размещения дополнительной информации справочного характера, например, об исключениях или ограничениях класса, сведения о разработчике или языке реализации. Предполагается, что окончательный вариант диаграммы содержит наиболее полное описание классов, которые состоят из трех или четырех секций.
Даже если секции атрибутов и операций пусты, в обозначении класса они должны быть выделены горизонтальной линией, с тем чтобы отличить класс от других элементов языка UML. Примеры графического изображения конкретных классов приведены на рис 29. В первом случае для класса Окружность (рис. 29 а) указаны только его атрибуты – точка на координатной плоскости, которая определяет расположение ее центра и длина радиуса окружности. Для класса Окно (рис. 29 б) указаны только его операции, при этом секция его атрибутов оставлена пустой. Для класса Счет (рис. 29 в) дополнительно изображена четвертая секция, в которой указано требование – реализовать резервное копирование объектов этого класса.
Рис. 29. Примеры графического изображения конкретных классов
Имя класса
Имя класса должно быть уникальным в пределах пакета, который может содержать одну или несколько диаграмм классов. Имя указывается в самой верхней секции прямоугольника, поэтому она часто называется секцией имени класса. В дополнение к общему правилу именования элементов языка UML, имя класса записывается по центру секции имени полужирным шрифтом и должно начинаться с заглавной буквы. Рекомендуется в качестве имен классов использовать существительные, записанные по практическим соображениям без пробелов. Необходимо помнить, что имена классов образуют словарь предметной области при ООАП.
В секции имени класса могут также находиться стереотипы или ссылки на стандартные шаблоны, от которых образован данный класс и, соответственно, от которых он наследует атрибуты и операции. В этой секции может также приводиться информация о разработчике данного класса и статус состояния разработки. Здесь также могут записываться и другие общие свойства этого класса, имеющие отношение к другим классам диаграммы или стандартным элементам языка UML.
Класс может иметь или не иметь экземпляров или объектов. В зависимости от этого в языке UML различают конкретные и абстрактные классы.
Конкретный класс (concrete class) — класс, на основе которого могут быть непосредственно созданы экземпляры или объекты.
Рассмотренные выше обозначения относятся к конкретным классам. От них следует отличать абстрактные классы.
Абстрактный класс (abstract class) — класс, который не имеет экземпляров или объектов.
Для обозначения имени абстрактного класса используется наклонный шрифт (курсив). В языке UML принято общее соглашение о том, что любой текст, относящийся к абстрактному элементу, записывается курсивом. Это имеет принципиальное значение, поскольку является семантическим аспектом описания абстрактных элементов языка UML.
В некоторых случаях необходимо явно указать, к какому пакету относится тот или иной класс. Для этой цели используется специальный символ разделитель – двойное двоеточие - (::). Синтаксис строки имени класса в этом случае будет следующий: <Имя пакета>::< Имя класса >. Другими словами, перед именем класса должно быть явно указано имя пакета, к которому его следует отнести. Например, если определен пакет с именем Банк, то класс Счет в этом банке может быть записан в виде: Банк::Счет.
Атрибуты класса
Атрибут (attribute) — содержательная характеристика класса, описывающая множество значений, которые могут принимать отдельные объекты этого класса.
Атрибут класса служит для представления отдельного свойства или признака, который является общим для всех объектов данного класса. Атрибуты класса записываются во второй сверху секции прямоугольника класса. Эту секцию часто называют секцией атрибутов.
В языке UML принята определенная стандартизация записи атрибутов класса, которая подчиняется некоторым синтаксическим правилам. Каждому атрибуту класса соответствует отдельная строка текста, которая состоит из квантора видимости атрибута, имени атрибута, его кратности, типа значений атрибута и, возможно, его исходного значения. Общий формат записи отдельного атрибута класса следующий:
<квантор видимости> <имя атрибута> [кратность]:
<тип атрибута> = <исходное значение> {строка-свойство}.
Видимость (visibility) — качественная характеристика описания элементов класса, характеризующая потенциальную возможность других объектов модели оказывать влияние на отдельные аспекты поведения данного класса.
Видимость в языке UML специфицируется с помощью квантора видимости (visibility), который может принимать одно из 4-х возможных значений и отображаться при помощи специальных символов.
- Символ " + " – обозначает атрибут с областью видимости типа общедоступный (public). Атрибут с этой областью видимости доступен или виден из любого другого класса пакета, в котором определена диаграмма.
- Символ " # " – обозначает атрибут с областью видимости типа защищенный (protected). Атрибут с этой областью видимости недоступен или не виден для всех классов, за исключением подклассов данного класса.
- Символ " - " – обозначает атрибут с областью видимости типа закрытый (private). Атрибут с этой областью видимости недоступен или не виден для всех классов без исключения.
- И, наконец, символ " ~ " - обозначает атрибут с областью видимости типа пакетный (package). Атрибут с этой областью видимости недоступен или не виден для всех классов за пределами пакета, в котором определен класс -владелец данного атрибута.
Квантор видимости может быть опущен. Его отсутствие означает, что видимость атрибута не указывается. Эта ситуация отличается от принятых по умолчанию соглашений в традиционных языках программирования, когда отсутствие квантора видимости трактуется как public или private. Однако вместо условных графических обозначений можно записывать соответствующее ключевое слово: public, protected, private, package.
Имя атрибута представляет собой строку текста, которая используется в качестве идентификатора соответствующего атрибута и поэтому должна быть уникальной в пределах данного класса. Имя атрибута - единственный обязательный элемент синтаксического обозначения атрибута, должно начинаться со строчной (малой) буквы и не должно содержать пробелов.
Кратность (multiplicity) — спецификация области значений допустимой мощности, которой могут обладать соответствующие множества.
Кратность атрибута характеризует общее количество конкретных атрибутов данного типа, входящих в состав отдельного класса. В общем случае кратность записывается в форме строки текста из цифр в квадратных скобках после имени соответствующего атрибута, при этом цифры разделяются двумя точками: [нижняя граница.. верхняя граница], где нижняя и верхняя границы положительные целые числа. Каждая такая пара служит для обозначения отдельного замкнутого интервала целых чисел, у которого нижняя (верхняя) граница равна значению нижней границы (верхней). В качестве верхней границы может использоваться специальный символ " * " (звездочка), который означает произвольное положительное целое число, т.е. неограниченное сверху значение кратности соответствующего атрибута.
Интервалов кратности для отдельного атрибута может быть несколько. В этом случае их совместное использование соответствует теоретико-множественному объединению соответствующих интервалов. Значения кратности из интервала следуют в монотонно возрастающем порядке без пропуска отдельных чисел, лежащих между нижней и верхней границами. При этом придерживаются следующего правила: соответствующие нижние и верхние границы интервалов включаются в значение кратности.
Если в качестве кратности указывается единственное число, то кратность атрибута принимается равной данному числу. Если же указывается единственный знак " * ", то это означает, что кратность атрибута может быть произвольным положительным целым числом или нулем. В языке UML кратность широко используется также для задания ролей ассоциаций, составных объектов и значений атрибутов. Если кратность атрибута не указана, то по умолчанию в языке UML принимается ее значение равное [1..1], т.е. в точности 1.
Тип атрибута представляет собой выражение, семантика которого определяется некоторым типом данных, определенным в пакете Типы данных языка UML или самим разработчиком. В нотации UML тип атрибута иногда определяется в зависимости от языка программирования, который предполагается использовать для реализации данной модели. В простейшем случае тип атрибута указывается строкой текста, имеющей осмысленное значение в пределах пакета или модели, к которым относится рассматриваемый класс.
Исходное значение служит для задания начального значения соответствующего атрибута в момент создания отдельного экземпляра класса. Здесь необходимо придерживаться правила принадлежности значения типу конкретного атрибута. Если исходное значение не указано, то значение соответствующего атрибута не определено на момент создания нового экземпляра класса. С другой стороны, конструктор объекта может переопределять исходное значение в процессе выполнения программы, если в этом возникает необходимость.
При задании атрибутов могут быть использованы дополнительные синтаксические конструкции — это подчеркивание строки атрибута, пояснительный текст в фигурных скобках и косая черта перед именем атрибута. Подчеркивание строки атрибута означает, что соответствующий атрибут общий для всех объектов данного класса, т.е. его значение у всех создаваемых объектов одинаковое (аналог ключевого слова static в некоторых языках программирования).
Пояснительный текст в фигурных скобках может означать две различные конструкции. Если в этой строке имеется знак равенства, то вся запись Строка-свойство служит для указания дополнительных свойств атрибута, которые могут характеризовать особенности изменения значений атрибута в ходе выполнения программы. Фигурные скобки как раз и обозначают фиксированное значение соответствующего атрибута для класса в целом, которое должны принимать все вновь создаваемые экземпляры класса без исключения. Это значение принимается за исходное значение атрибута, которое не может быть переопределено в последующем. Отсутствие строки-свойства по умолчанию трактуется так, что значение соответствующего атрибута может быть изменено в программе.
Знак " / " перед именем атрибута указывает на то, что данный атрибут является производным от некоторого другого атрибута этого же класса.
Производный атрибут (derived element) — атрибут класса, значение которого для отдельных объектов может быть вычислено посредством значений других атрибутов этого же объекта.
Операции класса
Операция (operation) - это сервис, предоставляемый каждым экземпляром или объектом класса по требованию своих клиентов, в качестве которых могут выступать другие объекты, в том числе и экземпляры данного класса.
Операции класса записываются в третьей сверху секции прямоугольника класса, которую часто называют секцией операций. Совокупность операций характеризует функциональный аспект поведения всех объектов данного класса. Запись операций класса в языке UML также стандартизована и подчиняется определенным синтаксическим правилам. При этом каждой операции класса соответствует отдельная строка, которая состоит из квантора видимости операции, имени операции, выражения типа возвращаемого операцией значения и, возможно, строка-свойство данной операции. Общий формат записи отдельной операции класса следующий:
<квантор видимости> <имя операции>(
список параметров):
<выражение типа возвращаемого значения>
{строка-свойство}
Квантор видимости, как и в случае атрибутов класса, может принимать одно из четырех возможных значений и, соответственно, отображается при помощи специального символа либо ключевого слова. Символ " + " обозначает операцию с областью видимости типа общедоступный (public). Символ " # " обозначает операцию с областью видимости типа защищенный (protected). Символ " - " используется для обозначения операции с областью видимости типа закрытый (private). И, наконец, символ " ~ " используется для обозначения операции с областью видимости типа пакетный (package).
Квантор видимости для операции может быть опущен. В этом случае его отсутствие просто означает, что видимость операции не указывается. Вместо условных графических обозначений также можно записывать соответствующее ключевое слово: public, protected, private, package.
Имя операции представляет собой строку текста, которая используется в качестве идентификатора соответствующей операции и поэтому должна быть уникальной в пределах данного класса. Имя операции - единственный обязательный элемент синтаксического обозначения операции, должно начинаться со строчной (малой) буквы, и, как правило, записываться без пробелов.
Список параметров является перечнем разделенных запятой формальных параметров, каждый из которых, в свою очередь, может быть представлен в следующем виде:
<направление параметра> <имя параметра>:
<выражение типа> =
<значение параметра по умолчанию>.
Параметр (parameter) — спецификация переменной операции, которая может быть изменена, передана или возвращена.
Параметр может включать имя, тип, направление и значение по умолчанию. Направление параметра — есть одно из ключевых слов in, out или inout со значением in по умолчанию, в случае если вид параметра не указывается. Имя параметра есть идентификатор соответствующего формального параметра, при записи которого следуют правилам задания имен атрибутов. Выражение типа является спецификацией типа данных для допустимых значений соответствующего формального параметра. Наконец, значение по умолчанию в общем случае представляет собой некоторое конкретное значение для этого формального параметра.
Выражение типа возвращаемого значения также указывает на тип данных значения, которое возвращается объектом после выполнения соответствующей операции. Две точки и выражение типа возвращаемого значения могут быть опущены, если операция не возвращает никакого значения. Для указания нескольких возвращаемых значений данный элемент спецификации операции может быть записан в виде списка отдельных выражений.
Операция с областью действия на весь класс показывается подчеркиванием имени и строки выражения типа. В этом случае под областью действия операции понимаются все объекты этого класса. В этом случае вся строка записи операции подчеркивается.
Строка-свойство служит для указания значений свойств, которые могут быть применены к данной операции. Строка-свойство может отсутствовать, если свойства не специфицированы.
Список формальных параметров и тип возвращаемого значения не обязателен. Квантор видимости атрибутов и операций может быть указан в виде специального значка или символа, которые используются для графического представления моделей в инструментальном средстве. Еще раз следует напомнить, что имена операций, так же как атрибутов и параметров, записываются со строчной (малой) буквы, а их типы параметров — с заглавной (большой) буквы. При этом обязательной частью строки записи операции является наличие имени операции и круглых скобок.
Объектная модель данных OLE DB. Основные понятия.
OLEDB (Object Linking and Embedding Database - связывание и встраивание объектов баз данных) - представляет собой интерфейс прикладного программирования (API), который позволяет приложениям СОМ (Component Object Model - объектная модель компонентов) "потреблять" данные от источника данных OLE DB.
Источник OLE DB включает данные, хранимые в различных форматах (не только в формате баз данных SQL). Приложение использует провайдер OLE DB для доступа к источнику данных. Провайдер OLE DB представляет собой компонент COM, позволяющий принимать вызовы OLE DB API и выполнять все необходимое для обработки запроса к источнику данных. Раньше интерфейс прикладного программирования OLE DB рекомендовался к использованию с базами данных, отличных от баз данных Microsoft SQL Server, а также и к базам Microsoft SQL Server, если недостаточно функциональности, даваемой ADO.
ADO (ActiveX Data Object) основана на объектной модели, в которой объекты имеют наборы коллекций, методов и свойств, обеспечивающие поддержку баз данных. Объекты ADO функционируют на уровне OLE DB. Технология ADO обеспечивает установление соединений ODBC и работу с уровнем OLE DB.
С помощью ADO открывается подключение к базе данных, после чего нужные данные извлекаются и помещаются в набор записей, состоящих из полей. Затем эти данные подвергаются манипуляциям и обновлениям на сервере, после чего подключение закрывается. Кроме того, ADO предлагает так называемый отключенный набор записей, который используется в том случае, когда удержание подключения к базе данных в открытом состоянии в течение длительного времени нежелательно. Существенная проблема - неприемлемо большой размер отключенного набора данных. Основные компоненты ADO - Connection, Command, RecordSet, Field.
Объектная модель ADO.NET существенно отличается от объектов, доступных в ADO, и ADO.NET является не надстройкой над ADO, а отдельной технологией.
Инфраструктура ADO.NET поставляется с тремя пространствами имен клиента базы данных: одно предназначено для работы с Microsoft SQL Server, второе - для источников данных ODBC, третье - для любой базы данных, доступной через OLE DB.
Пространства имен, предназначенные для доступа к данным.NET.
System. Data - все обобщенные классы доступа к данным.
System.Data.Common - классы, разделяемые (или переопределяемые) индивидуальными поставщиками данных.
System.Data.EntityClient - классы Entity Framework.
System.Data.Linq.SqlClient - классы поставщика LINQ to SQL.
System.Data.Odbc - классы поставщика Odbc.
System.Data.OleDb - классы поставщика OleDb.
System.Data.ProviderBase - новые базовые классы и классы фабрик подключений.
System.Data.Sql - новые обобщенные интерфейсы и классы для доступа к данным SQL Server.
System.Data.SqlClient - классы поставщика SQL Server.
System.Data.SqlTypes - типы данных SQL Server.
Концепция доступа к данным в ADO.NET основана на использовании двух компонентов:
- НАБОРА ДАННЫХ (представляется объектом класса DataSet) со стороны клиента. Это локальное временное хранилище данных;
- ПРОВАЙДЕРА ДАННЫХ (представляется объектом класса DataProvider). Это посредник, обеспечивающий взаимодействие приложения и базы данных со стороны базы данных (в распределенных приложениях – со стороны сервера).
ADO.NET. Объектная модель
Объектная модель ADO.NET предполагает существование (при написании приложения для работы с базой данных — использование) двух множеств классов, выполняющих четко определенные задачи при работе с базой данных: классы отсоединенных объектов и классы подсоединенных объектов.
Классы подсоединенных объектов обеспечивают установление соединения с базой данных и управление базой со стороны приложения, эти классы являются специфическими для разных типов баз данных (например, мы будем писать Connection, но на самом деле есть три класса SqlConnection, OleDbConnection, ODBCConnection, которые имеют схожую функциональность, но отличаются внутренней реализацией). Классы отсоединенных объектов обеспечивают сохранение, использование и преобразование полученной от базы данных информации на стороне приложения. Классы отсоединенных объектов являются разделяемыми, то есть не зависят от типа источника данных (OLE DB, ODBC или SQL Server).
Классы подсоединенных объектов
Command - используется как оболочка для операторов SQL или вызова хранимых процедур.
CommandBuilder - используется для генерирования команд SQL (таких как INSERT, UPDATE, DELETE) из оператора SELECT.
Connection - используется для подключения к базе данных и подобна подключению ADO.
DataAdapter - используется для хранения команд select, insert, update, delete, которые затем применяются для наполнения DataSet и обновления БД.
DataReader - используется для однонаправленных подключенных объектов чтения данных.
Parameter - используется для определения параметров хранимой процедуры.
Transaction - используется для транзакции базы данных, помещенной в оболочку объекта.
Классы отсоединенных объектов
DataSet - предназначен для использования в отключенном режиме, содержит набор DataTable и отношений между этими таблицами.
DataTable - контейнер данных, который состоит из одного или более экземпляров DataColumn, и после заполнения будет иметь одну или более строк DataRow, содержащих данные.
DataRow - множество значений, имитирующих строку из таблицы БД или электронной таблицы.
DataColumn - определение столбца (имя-тип данных).
DataRelation - отношение между двумя классами DataTable внутри класса DataSet, используется для описания отношений внешнего ключа и отношения "главная - подробности".
Constraint - определяет правило для класса DataColumn (или набора столбцов), например, требование уникальности.
DataColumnMapping - отображает имя таблицы из базы данных на DataTable внутри DataSet.
Библиотеки ADO.NET можно применять тремя способами:
- в подключенном режиме;
- в отключенном режиме;
- с помощью технологии Entity Framework.
При использовании подключенного уровня (connected layer) кодовая база явно подключается к соответствующему хранилищу данных и отключается от него. При таком способе использования ADO.NET обычно происходит взаимодействие с хранилищами данных с помощью объектов подключения, объектов команд и объектов чтения данных.
Автономный уровень (disconnected layer) позволяет работать с набором объектом DataTable (содержащемся в DataSet), который представляет на стороне клиента копию внешних данных. При получении DataSet с помощью соответствующего объекта адаптера данных подключение открывается и закрывается автоматически. Такой подход позволяет быстро освобождать подключения для других вызовов и повышает масштабируемость системы. Получив объект DataSet, вызывающий код может просматривать и обрабатывать данные без затрат на сетевой трафик.
Entity Framework (начиная с.NET 3.5SP1) позволяет скрыть многие низкоуровневые детали работы с базами данных и обрабатывать данные при помощи генерации LINQ - запроса.