Лабораторная работа 2 (ПКРПСиБД LAB2 Захаров А.Е.)

Посмотреть архив целиком

Национальный Исследовательский Университет

МОСКОВСКИЙ ЭНЕРГЕТИЧЕСКИЙ ИНСТИТУТ

Институт автоматики и вычислительной техники

Кафедра прикладной математики





Лабораторная работа № 2

Реализация шаблона проектирования

Курс «Проектирование крупных распределенных программных систем и баз данных»




Выполнил

студент группы А-13-08

Захаров Антон


Преподаватель

Куриленко Иван Евгеньевич












Москва, 2012

Цель работы

Научиться применять базовые шаблоны проектирования.

Порядок выполнения работы

  1. С использованием одного из языков программирования из множества (C++, C#, Java) реализовать следующие шаблоны проектирования:

  • Неизменяемый объект

  • Маркерный интерфейс

  • Контейнер свойств

  • Шаблон делегирования

  1. Разработать UML модель.

Требования

  • Наличие работающей демонстрационной программы с исходным кодом.

  • Наличие UML-модели в электронном виде, иллюстрирующей шаблон, полученной с помощью специализированного диаграммера (Rational Enterprise Architect, Visual Paradigm, Visual Studio).

  • Наличие отчёта в печатном виде, содержащего теоретическое введение, UML-модель и исходный код.

Неизменяемый объект

Основные шаблоны

Описание

Неизменяемый объект (англ. Immutable object) – шаблон для создания объектов, которые не могут быть изменены после их создания. Объект может быть неизменяемым как полностью, так и частично. В некоторых случаях объект считается неизменяемым с точки зрения пользователя класса, даже если изменяются его внутренние поля.

Уместность применения

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

Преимущества, достигаемые при применении шаблона

  1. Гарантия сохранения состояния объекта, в котором он находился на момент создания.

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

  3. С неизменяемыми объектами легче работать, чем с изменяемыми. Они могут быть только в одном состоянии и поэтому всегда согласованы, и к ним легко организовать совместный доступ.

Недостатки шаблона

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

  2. Не возможно быть абсолютно уверенным, что не возникнет необходимости, описанной в 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) – интерфейсы без каких-либо методов, действующие как маркеры. Они лишь говорят разработчику (или компилятору, для некоторых языков программирования), что объекты классов, реализующие этот интерфейс, должены иметь отличительные черты, восприниматься по-другому. Маркерные интерфейсы также известных как "теги", поскольку они добавляют общий тег ко всем унаследованным классам, объединяя их в одну категорию.

Уместность применения

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

Преимущества, достигаемые при применении шаблона

  1. Применение маркерных интерфейсов даёт возможность разделять логику работы программы для разных групп классов.

  2. Убирать и добавлять маркеры очень просто.

Недостатки шаблона

Так как интерфейс явно или неявно реализуется всеми классами-наследниками, не существует возможность «снять» маркер с объектов этих классов.

Детали реализации

Шаблон реализуется следующим образом:


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<MyException> exceptions = new List<MyException>();

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);






Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.