Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методич.указания к заданиям по ТП.doc
Скачиваний:
4
Добавлен:
06.05.2019
Размер:
897.02 Кб
Скачать

Объекты, классы и язык uml

.NET технология позволяет разрабатывать программу, интегрировав её из компонентов, написанных на разных языках программирования, например, на С++.NET и С#.

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

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

Для графического представления объектно-ориентированных систем в настоящее время используется язык UML.

Унифицированный язык моделирования UML (Unified Modeling Language) предназначен для описания объектно-ориентированных систем в виде совокупности диаграмм, раскрывая статическую и динамическую суть системы как модели, состоящей из взаимодействующих объектов.

Перед применением языка UML необходимо проанализировать проектируемую систему, выявить основные сущности и понятия, образовать набор классов, из которых будет создаваться всё множество объектов системы. Затем приступают к разработке диаграмм языка UML: диаграмм вариантов использования, представляющих систему с точки зрения пользователя, диаграмм классов, представляющих классы и их статическую взаимосвязь, диаграмм последовательности, изображающих динамическое функционирование объектов во времени, и др.

На рис. 2.1 изображен класс на языке UML. Класс представляется в виде прямоугольника, разделённого на три части, в которых размещается имя класса, перечень атрибутов и, наконец, перечень функций класса. Перед именами данных и функций ставятся символы “– “ и “+”, указывающие на доступ private и public соответственно.

Рис. 2.1. Класс CBall

Из рис. 2.1 видно, что на языке UML представлен класс, имеющий имя CBall, закрытые данные х и у и открытые функции Set, Move и Show. Важно, что это представление класса не зависит от языков программирования и, в частности, от С++, С++.NET и С#.

Рис. 2.2. Объекты класса CBall

На рис. 2.2 изображены объекты класса CBall на языке UML. В прямоугольнике помещается имя объекта, отделённое от класса этого объекта двоеточием. Если объект безымянный, то ставится двоеточие перед именем класса. Имя объекта и класса подчёркиваются.

Рис. 2.3. Класс MyClass наследует класс BaseClass, содержит объект класса OtherClass и использует класс UsedClass

Нотация на рисунке 2.3 показывает наследование одного класса из другого класса, обладание классом объекта другого класса и использование в одном классе другого класса.

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

О многогранности описания разрабатываемой системы на этом языке можно судить по перечню описывающих её диаграмм языка UML: диаграмма взаимодействия (interaction diagram), диаграмма деятельности (activity diagram), диаграмма использования (use case diagram), диаграмма классов (class diagram), диаграмма компонентов (component diagram), диаграмма кооперации (collaboration diagram), диаграмма объектов (object diagram), диаграмма последовательности (sequence diagram), диаграмма развёртывания (deployment diagram), диаграмма состояний (statechart diagram).

В задачи книги не входит подробное изложение языка UML. Познакомиться с нотацией этого языка можно по книге Рамбо Дж., Якобсона А. и Буча Г. “UML: специальный справочник”.

Диаграммы класса языка UML должны использоваться при описании поэтапной разработки программ.

.NET Компонентно-ориентированное программирование

.NET компонент – это управляемый или ref класс .NET платформы.

Интерфейс IComponent является базовым интерфейсом для всех компонентов, определяя их единообразное поведение.

Класс Component – базовый класс для всех компонентов в среде CLR (Common Language Runtime). Наследуемый этим классом класс MarshalByRefObject позволяет также использовать объект компонента как удалённый, то есть вызывать интерфейсные функции объекта компонента, размещённого в одном приложении, посредством объекта-посредника (proxy - прокси), размещённого в другом приложении того же самого или другого компьютера.

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

Интерфейс IContainer – базовый интерфейс контейнера, содержит свойство Components и две функции: Add() и Remove().

Класс Container контейнера наследует интерфейсы IContainer и IDisposable. Он переопределяет свойство Components и виртуальные функции Add(), Remove() и Dispose() интерфейсов IContainer и IDisposable.

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

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

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

Освобождение управляемых и неуправляемых ресурсов возлагается на сам объект компонента и должно осуществляться перед завершением его работы. Для этого введена специальная функция Dispose().

Шаблон функции Dispose.

///////////////

// C# Шаблон функции Dispose() на C#

. . .

private bool disposed= false;

public event EventHandler Disposed= null;

. . .

public void Dispose ( )

{

Dispose (true);

GC.SupressFinalize (this);

}

protected virtual void Dispose (bool disposing )

{

if (! this.disposed) // Если первый вызов функции Dispose, то

{

if (Disposed != null)

Disposed (this, EventArgs.Empty); // Сгенерировать событие Disposed

if (disposing)

{

// Здесь освободить управляемые ресурсы

}

// Здесь освободить неуправляемые ресурсы

}

disposed= true;

}

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

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

Класс Monitor одержит статические функции Enter(), TryEnter(), Wait(), Puls(), PulsAll() и Exit().

Объект класса Mutex, используемый для создания объектов, синхронизирующих взаимодействия между потоками и процессами. Класс Mutex включает статическую функцию WaitOne() приостанавливающую выполнение данного потока, пока не освободится ожидаемый этим потоком разделяемый ресурс, и статическую функцию ReleaseMutex() позволяющую потоку открыть используемый этим потоком разделяемый ресурс другому потоку.

Сериализация – это представление объекта в виде, необходимом для сохранения его в файле и извлечения его из этого файла, или для передачи объекта по каналу из одного приложения или домена в другое приложение или домен.

Удалённый объект располагается в приложении, называемом сервером, а приложение, использующее этот объект, называется клиентом. Процедура “переноса” удалённого объекта из сервера на клиент называется отдалением (remoting).

Располагая интерфейсом удалённого объекта, прокси (transporant proxy и real proxy) на клиенте воспринимает вызовы от клиента удалённому объекту, из которых формируются объекты сообщений, содержащие всю необходимую информацию о вызове, и эти объекты передаются по выстроенной цепочке приёмников (sinks), форматеров (formatters) и каналов (transfer channels) к серверу. Здесь, на сервере, объект-сообщение, снова, пройдя через форматер и приёмники, преобразуется в последнем приёмнике (StackBuilderSink) в нормальный стековый вызов, на который среагирует удалённый объект. Результат выполнения вызова удалённым объектом также преобразуется в объект сообщения, который отправится обратно к ожидающему его прокси на стороне клиента. Итак, вызов из клиента выполнился удалённым объектом на сервере.

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