ПКРПСиБД LAB2 Захаров А.Е. (Лабораторная работа 2)
Описание файла
Файл "ПКРПСиБД LAB2 Захаров А.Е." внутри архива находится в папке "Лабораторная работа 2". Документ из архива "Лабораторная работа 2", который расположен в категории "". Всё это находится в предмете "распределённые ис и базы данных" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "распределённые ис и базы данных" в общих файлах.
Онлайн просмотр документа "ПКРПСиБД LAB2 Захаров А.Е."
Текст из документа "ПКРПСиБД LAB2 Захаров А.Е."
Национальный Исследовательский Университет
МОСКОВСКИЙ ЭНЕРГЕТИЧЕСКИЙ ИНСТИТУТ
Институт автоматики и вычислительной техники
Кафедра прикладной математики
Лабораторная работа № 2
Реализация шаблона проектирования
Курс «Проектирование крупных распределенных программных систем и баз данных»
Выполнил
студент группы А-13-08
Захаров Антон
Преподаватель
Куриленко Иван Евгеньевич
Москва, 2012
Цель работы
Научиться применять базовые шаблоны проектирования.
Порядок выполнения работы
-
С использованием одного из языков программирования из множества (C++, C#, Java) реализовать следующие шаблоны проектирования:
-
Неизменяемый объект
-
Маркерный интерфейс
-
Контейнер свойств
-
Шаблон делегирования
-
Разработать UML модель.
Требования
-
Наличие работающей демонстрационной программы с исходным кодом.
-
Наличие UML-модели в электронном виде, иллюстрирующей шаблон, полученной с помощью специализированного диаграммера (Rational Enterprise Architect, Visual Paradigm, Visual Studio).
-
Наличие отчёта в печатном виде, содержащего теоретическое введение, UML-модель и исходный код.
Неизменяемый объект
Основные шаблоны
Описание
Неизменяемый объект (англ. Immutable object) – шаблон для создания объектов, которые не могут быть изменены после их создания. Объект может быть неизменяемым как полностью, так и частично. В некоторых случаях объект считается неизменяемым с точки зрения пользователя класса, даже если изменяются его внутренние поля.
Уместность применения
Шаблон следует применять, если требуется обезопасить объект от явного и неявного изменения его свойств.
Преимущества, достигаемые при применении шаблона
-
Гарантия сохранения состояния объекта, в котором он находился на момент создания.
-
Поскольку нет опасности, что неизменяемые объекты изменят своё значение, можно свободно кэшировать ссылки на них и быть уверенным, что эта ссылка обратится к этому же значению позже. Соответственно, поскольку их свойства не могут измениться, можно кэшировать их поля и результаты их методов.
-
С неизменяемыми объектами легче работать, чем с изменяемыми. Они могут быть только в одном состоянии и поэтому всегда согласованы, и к ним легко организовать совместный доступ.
Недостатки шаблона
-
Если в какой-то момент времени существования объекта, возникнет необходимость дать право на изменение определённых свойств объекта объектам другого класса, придётся полностью отказаться от идеи неизменяемости.
-
Не возможно быть абсолютно уверенным, что не возникнет необходимости, описанной в 1 пункте.
Детали реализации
Шаблон реализуется следующим образом:
using System;
using System.Text;
public interface IImmutable
{
bool isImmutable { get; }
void makeImmutable();
}
public abstract class Immutable : IImmutable
{
private bool immutable;
public bool isImmutable {
get { return immutable; }
}
public void makeImmutable() {
immutable = true;
}
protected void checkImmutable() {
if (immutable)
throw new Exception("Ошибка! Нельзя менять значения свойств неизменяемых объектов");
}
}
namespace Lab2_1
{
public class Planet : Immutable
{
private string name;
private double mass;
private double g;
public string Name {
get { return name; }
set { checkImmutable(); name = value; }
}
public double M {
get { return mass; }
set { checkImmutable(); mass = value; }
}
public double G {
get { return g; }
set { checkImmutable(); g = value; }
}
public Planet(string name, double M, double g) {
this.name = name;
this.mass = M;
this.g = g;
makeImmutable();
}
}
class Program
{
static void Main(string[] args) {
Planet earth = new Planet("Земля", 5.9736 * Math.Pow(10, 24), 9.780327);
Console.WriteLine("Масса Земли " + earth.M + " кг");
Console.WriteLine("Пытаемся изменить массу планеты");
try {
earth.M = 10000000000;
}
catch (Exception e) {
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(e.Message);
Console.ResetColor();
}
Console.WriteLine("Масса Земли " + earth.M + " кг");
Console.ReadLine();
}
}
}
UML-диаграммы
Маркерный интерфейс
Основные шаблоны
Описание
Маркерные интерфейсы (англ. Marker interface) – интерфейсы без каких-либо методов, действующие как маркеры. Они лишь говорят разработчику (или компилятору, для некоторых языков программирования), что объекты классов, реализующие этот интерфейс, должены иметь отличительные черты, восприниматься по-другому. Маркерные интерфейсы также известных как "теги", поскольку они добавляют общий тег ко всем унаследованным классам, объединяя их в одну категорию.
Уместность применения
Маркерные интерфейсы имеет смысл применять, если в ходе разработки необходимо пометить все объекты некоторого класса (или классов) и иметь возможность в программе выделять их из множества других объектов.
Преимущества, достигаемые при применении шаблона
-
Применение маркерных интерфейсов даёт возможность разделять логику работы программы для разных групп классов.
-
Убирать и добавлять маркеры очень просто.
Недостатки шаблона
Так как интерфейс явно или неявно реализуется всеми классами-наследниками, не существует возможность «снять» маркер с объектов этих классов.
Детали реализации
Шаблон реализуется следующим образом:
namespace Lab2_2
{
interface IMathExceptionMarker { }
abstract class MyException
{
public string Message;
}
class DivException : MyException, IMathExceptionMarker
{
public DivException() { Message = "Деление на ноль!"; }
}
class OverflowException : MyException
{
public OverflowException() { Message = "Переполнение стека"; }
}
class LgException : MyException, IMathExceptionMarker
{
public LgException()
{
Message = "lg(x), x > 0!!";
}
}
class Program
{
static void Main(string[] args)
{
List
exceptions.Add(new DivException());
exceptions.Add(new OverflowException());
exceptions.Add(new LgException());
foreach (MyException e in exceptions)
{
if(!(e is IMathExceptionMarker))
Console.WriteLine(e.Message);
}
Console.ReadLine();
}
}
}
UML-диаграммы
Контейнер свойств
Основные шаблоны
Описание
Контейнер свойств (англ. Property Container) – шаблона, обеспечивающий динамическую расширяемость уже готового объекта.
Уместность применения
Шаблон следует применять, если набор свойств объекта нельзя фиксировать, требуется динамически добавлять и удалять свойства.
Преимущества, достигаемые при применении шаблона
Шаблон позволяет реализовать динамическое добавление свойств объекту в тех языках программирования, где эта возможность не является частью ядра языка. Например, в PHP любым объектам всегда можно на лету добавлять свойства.
Недостатки шаблона
Время доступа к динамически добавленным свойствам гораздо выше и зависит от числа таких свойств в объекте.
Детали реализации
Шаблон реализуется следующим образом:
using System;
using System.Collections;
class PropertyContainer
{
private SortedList list = new SortedList(0);
public PropertyContainer(SortedList list = null)
{
if (list != null)
this.list = list;
}
public PropertyContainer Add(string name, object value = null)
{
if (list.Contains(name))
throw new Exception("Свойство с именем '" + name + "' уже есть");
list.Capacity++;
list.Add(name, value);
return this;
}
public PropertyContainer Add(SortedList list)
{
for (int i = 0; i < list.Count; i++)
Add(list.GetKey(i).ToString(), list.GetByIndex(i));
return this;
}
public object Get(string name)
{
if (!list.Contains(name))
throw new Exception("Свойство с именем '" + name + "' не задано");
return list.GetByIndex(list.IndexOfKey(name));
}
public PropertyContainer Set(string name, object value)
{
if (!list.Contains(name))
throw new Exception("Свойство с именем '" + name + "' не задано");
list.SetByIndex(list.IndexOfKey(name), value);
return this;
}
public PropertyContainer Remove(params string[] names)
{
foreach (string name in names)
{
if (!list.Contains(name))
throw new Exception("Свойство с именем '" + name + "' не задано");
}
foreach (string name in names)
list.Remove(name);
list.Capacity -= names.Length;
return this;
}
}
namespace Lab2_3
{
class Program
{
static void Main(string[] args)
{
PropertyContainer container = new PropertyContainer();
container.Add("a", 1).Add("b", "Строка");
Console.WriteLine("Значения свойств:\na = " + container.Get("a") +
"\nb = " + container.Get("b"));
Console.ReadLine();
}
}
}
UML-диаграммы
Шаблон делегирования
Основные шаблоны
Описание
Шаблон делегирования (англ. Delegation pattern) – это способ, которым объект внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту.
Уместность применения
Шаблон даёт возможность изменить поведение конкретного экземпляра объекта вместо создания нового класса путем наследования. Таким образом, если при работе с объектом велика вероятность возникновения такой ситуации, следует использовать шаблон делегирования.
Преимущества, достигаемые при применении шаблона
Применение шаблона делегирования ускоряет процесс внесения серьёзных изменений в логику работы программы. Например, если используя данный шаблон, был написан класс, обеспечивающий хранение данных в XML файлах, то без труда можно начать хранить данные в БД. Для этого потребуется написать новый обработчик и назначить его ответственным за хранение данных, что гораздо проще, чем переписать весь исходный класс.
Недостатки шаблона
Шаблон обычно затрудняет оптимизацию по скорости в пользу улучшенной чистоты абстракции.
Детали реализации
Шаблон реализуется следующим образом:
using System;
using System.Text;
namespace Lab2_4
{