Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Itogi_Shpory

.pdf
Скачиваний:
41
Добавлен:
18.03.2015
Размер:
2.33 Mб
Скачать

76. Применение наследования при проектировании

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

Иерархии классов(наследования, специализации/обобщения) разрабатываются снизу вверх, наоборот, и в обоих направлениях. При разработке сверху вниз, классы потомки (подклассы общего класса) наследуют свойства класса-родителя (общий класс), и помимо этого у них появляются свои специфичные характеристики. При этом, внутреннее устройство общего класса, видимо всем его подклассам. В качестве примера можно привести общий класс Животное, и наследуемые от него подклассы Кошка, Собака и т.д.

Абстрактные классы используются как шаблоны для создания классов. Нельзя создавать объекты на их основе. Абстрактные классы должны содержать как минимум одну операцию. Эта операция объявляется в абстрактном классе, но реализуется только в созданном на его основе подклассе.

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

77. Примеры наследования Примеры супер классов и подклассов (иерархии классов):

Супер класс – счет и подклассы Чековый Счет и Сберегательный Счет. Класс Счет имеет два атрибута, номер счета и баланс и некоторые операции () указаны на рисунке). Эти атрибуты и операции доступны подклассам (наследуются ими). Так же подклассы имеют свои собственные атрибуты и операции

- Пример абстрактного класса и подклассов. На основе абстрактного класса техническое обслуживание созданы подклассы замена масла, станционное ТО и тд. В абстрактном классе объявлены атрибуты и операции, которые реализованы в подклассах, созданных на его основе.

78.Спецификация интерфейса класса

Вспецификации интерфейса класса определяется интерфейс

скрывающего информацию класса, в том числе его операции. Спецификация должна включать:

1)описание информации, скрываемой классом;

2)критерий выделения данного класса;

3)предположения, сделанные при специфицировании класса (одновременный или последовательный доступ к операциям класса);

4)предположительные модификации(учет возможных изменений);

5)суперкласс (если есть);

6)унаследованные операции (если есть);

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

Пример специцикации класса Хранилище Показаний Датчиков

1)Класс содержит информацию о показаниях датчиков.

2)Класс абстрагирования данных

3)Операции могут одновременно вызываться разными классами

4)Только показания в форме да/нет, однако возможно и в виде чисел.

5)Отсутствует

6)Отсутствует

7)Операции

-читатьДатчик (возвращает значение датчика)

-обновитьДатчик (меняет значение датчика)

79. Детальное проектирование ПО

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

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

Детальный проект контроллера (из курсовой). Скудный пример. Неуверена что вообще нужен

80. Проектирование составных задач

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

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

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

-Темпоральная группировка и объекты интерфейса устройств. Рассмотрим

ввод/вывод с опросом с точки зрения разбиения на задачи и классы. Задача выделяется при помощи критерия периодической (если устройство одно) или темпоральной (если устройств несколько) группировки. Каждое пассивное устройство ввода/вывода инкапсулируется в класс интерфейса устройства. Необходимо определить операции, предоставляемые таким классом, и поместить класс внутрь задачи.

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

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

81. Синхронизация доступа к классам

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

Метод взаимного исключения основывается на взаимном исключении задач (выполняется либо чтение либо запись). Для этого используется двоичный семафор, который занимают обе задачи по очереди посредством операций запросить и освободить семафор.

Алгоритм нескольких читателей и писателей существует в нескольких вариантах.

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

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

Синхронизация нескольких читателей и писателей без ущемления писателей. В предыдущем варианте решения есть одно

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

82.Пример синхронизации доступа к классу

Вкачестве примера можно рассмотреть класс абстрагирования данных Хранилище Показаний Датчиков. Синхронизация подразумевает возможность параллельного доступа к данным класса. Следовательно, нам необходимо определить метод синхронизации доступа к классу: метод взаимного исключения или алгоритм писателей и читателей.

Класс Хранилище Показаний Датчиков имеет 2 операции:

- читатьДатчик(in IDдатчика, out значениеДатчика) – операция чтения показания датчика по его ID.

- обновитьДатчик(in IDдатчика, in значениеДатчика) – операция обновления (записи) значения датчика

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

Пример (псевдокод)

class ХранилищеПоказанийДатчиков private readWriteSemaphore : Semaphore := 1

public читатьДатчик (in идДатчика;out значениеДатчика) -- Критическая секция операции чтения.

acquire (readWriteSemaphore) ; - запрос семафора значениеДатчика := хранилищеПоказаний(идДатчика, значение); release(readWriteSemaphore); - освобождение семафора

end читатьДатчик;

--аналогично для операции обновления

public обновитьДатчик (in идДатчика,in значениеДатчика) -- Критическая секция операции записи.

acquire (readWriteSemaphore);

хранилищеПоказаний (идДатчика, значение) := значениеДатчика; release(readWriteSemaphore);

end обновитьДатчик;

83. Синхронизация методом взаимного исключения.

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

Пример (псевдокод)

class ХранилищеПоказанийДатчиков private readWriteSemaphore : Semaphore := 1

public читатьДатчик (in идДатчика;out значениеДатчика) -- Критическая секция операции чтения.

acquire (readWriteSemaphore) ; - запрос семафора значениеДатчика := хранилищеПоказаний(идДатчика, значение); release(readWriteSemaphore); - освобождение семафора

end читатьДатчик;

--аналогично для операции обновления

public обновитьДатчик (in идДатчика,in значениеДатчика) -- Критическая секция операции записи.

acquire (readWriteSemaphore);

хранилищеПоказаний (идДатчика, значение) := значениеДатчика; release(readWriteSemaphore);

end обновитьДатчик;

84.Синхронизация нескольких читателей и писателей

Вданном методе несколько читателей может одновременно иметь доступ к ресурсу (хранилищу) или но только 1 любой писатель может монопольно обращаться к хранилищу. Для этого применяются два двоичных семафора, инициализированных значением 1, и у которых есть операции запросить и освободить. Семафор readerSemaphore используется читателями, чтобы гарантировать взаимно исключающее обновление счетчика читателей. Семафор readWriteSemaphore задействован писателями для обеспечения взаимно исключающего доступа к хранилищу. Но к данному семафору обращаются также и читатели. Он захватывается первым читателем перед началом чтения из хранилища и освобождается последним читателем, закончившим чтение.

Ниже приведен псевдокод операций чтения и обновления: class ХранилищеПоказанийДатчиков

private числоЧитателей : Integer : = 0;//текущее число читателей readerSemaphore :. Semaphore := 1;//семафор для читателей readWriteSemaphore : Semaphore := 1;

public читатьДатчик (in идДатчика, out значениеДатчика)

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

acquire (readerSemaphore) ; //запрос семафора читателями Увеличить числоЧитателей;

if числоЧитателей = 1

then acquire (readWriteSemaphpre) ; release (readerSemaphore) ;//освободить семафор

значениеДатчика := хранилищеПоказаний (идДатчика, значение); acquire (readerSemaphore) ;

Уменьшить числоЧитателей; if числоЧитателей = 0

then release (readWriteSemaphore); release(readerSemaphore);

end читатьДатчик;

public обновитьДатчик (in идДатчика, in значениеДатчика) -- Критическая секция операции записи.

acquire (readWriteSemaphore) ;//запрос семафора хранилищеПоказаний (идДатчика, значение) :=значениеДатчика; release(readWriteSemaphore) ;//освобождение семафора

end обновитьАналоговыйДатчик;

85. Синхронизация нескольких читателей и писателей с помощью монитора

В качестве примера рассмотрим класс абстрагирования данных Хранилище Показаний Аналоговых Датчиков, имеющий 2 операции читать аналоговый датчик (вызывается задачами-читателями, которые хотят получить показания датчиков из хранилища) и обновить аналоговый датчик (вызывается задачами-писателями, которые хотят поместить в хранилище новое значение датчика, прочитанное из внешней среды).

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

86. Синхронизация нескольких читателей и писателей без ущемления писателей

Когда читатели постоянно отправляют запросы на чтение, писателю может быть отказано в доступе к хранилищу в течение неопределенного времени, то есть происходит ущемление писателя (writer starvation). Обойтись без ущемления писателей можно с помощью дополнительного семафора writer Waiting. Операция startWrite захватывает семафор writerWaiting до захвата семафора readWrite Semaphore. Операция startRead захватывает и освобождает семафор writerWaiting перед тем, как захватить reader Semaphore.

В случае, когда несколько читателей заняты чтением, а писатель в это же время хочет обновить данные, он захватывает семафор writerWaiting, но ждет, пока читатели освободят семафор readWriteSemaphore. Если же приходит новый читатель, он вызывает startRead и ждет, когда освободится семафор writerWaiting. В это время предыдущие читатели заканчивают свои операции, и последний освобождает семафор readWriteSemaphore, который переходит к ожидающему писателю, который освобождает семафор writerWaiting.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]