Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Локализация изменений программного кода



Изменение в способе реализации полей и методов класса не должно приводить к необходимости изменения основного кода.

 
 

 

Пример

Определить класс, описывающий положение точки на плоскости. Предусмотреть следующие операции:

- Изменение координат точки

- Выдача расстояния от точки до начала координат

 
 

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

class Точка

{

private double k1, k2; //координаты точки

 

//открытый метод для изменения координат

public void Установить(double x, double y)

{

k1 = x;

k2 = y;

}

 

//открытый метод для вычисления расстояния

public double Вычислить()

{

return Math.Sqrt(k1 * k1 + k2 * k2);

}

 

class Program

{

public static void Main()

{

Точка t; double d;

t = new Точка();

t.Установить(3.0, 4.0); // вместо t.k1 =3.0; t.k2=4.0

d = t.Вычислить(); //=> 5

t.Установить(4.0, 3.0);

d = t.Вычислить();

}

}

 

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

Как быть разработчикам класса Program?

Если доступ к полям класса Точка выполянется через специальные методы, то разработчики класса Точка должны оставить параметры неизменными, но изменить их реализацию. В этом случае код класса Program не требует никаких изменений.

 

 

class Точка

{

private double k1, k2; //координаты точки

 

//открытый метод для изменения координат

public void Установить(double x, double y)

{

k2 = Math.Sqrt(x*x+y*y);

k1 = Math.Atan ((y, x));

}

 

//открытый метод для вычисления расстояния

public double Вычислить()

{

return Math.Sqrt(k1 * k1 + k2 * k2);

}

 

Защита полей от вмешательства извне

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

 

Пример

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

 
 

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

 

class Точка

{

private double fi, d;

 

public Точка(double fi)

{ this.fi = fi; }

 

public void Установить(double d)

{ this.d=d; }

 

public double ВычислитьFI()

{return fi; }

 

public double ВыдатьD()

{ return d; }

}

 

class Program

{

public static void Main()

{

Точка t; double fi;

t = new Точка(Math.PI/2);

t.Установить(5.0);

fi=t.ВычислитьFI();

}

}

}

 

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

Пример аналогичен предыдущему, реализован через открытые поля для чтения.

 

class Точка

{

public readonly fi;

private double d;

 

public Точка(double fi)

{ this.fi = fi; }

 

public void Установить(double d)

{ this.d=d; }

 

public double ВычислитьFI()

{return fi; }

 

public double ВыдатьD()

{ return d; }

}

 

class Program

{

public static void Main()

{

Точка t; double fi;

t = new Точка(Math.PI/2);

t.Установить(5.0);

fi=t.fi; //45 градусов

}

}

}

 

Возможно использование открытых статических полей только для чтения. Такие поля должны иметь инициализатор. Значение поля устанавливается до создания объекта и изменение его (даже с помощью конструктора) невозможно.

 

Свойства

 
 

Свойство – это метод для установки и-или получения закрытого поля. С этой точки зрения свойство относится к интерфейсной части класса.

 

Определение свойства:


public_Тип возвращаемого значения_Имя свойства

// параметров нет, поэтому скобок после имени нет и быть не может

 

{ set {код для установки поля}

 

неявный параметр (value)

get {код для чтения поля}

}

 

Свойства используются для поддержки инкапсуляции, создания виртуальных полей (т.е. реально полей нет, но у пользователя создается впечатление, что они есть; на самом деле значение вычисляется).

 

Пример

Определить класс Точка на плоскости в прямоугольных координатах, точка может располагаться только выше оси х или на ней.

 
 

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

 

class Точка

{

private double x, y;

 

public double xp

{

set { x = value; }

get { return x; }

}

 

public double yp

{

set

{

if (value > = 0)

y = value;

else y = 0;

}

get { return y; }

}

 

public double Dp

{

get { return Math.Sqrt(x * x + y * y); }

}

}

 

class Program

{

public static void Main()

{

Точка t;

t = new Точка();

t.xp = 3.0;

t.yp = 4.0;

t.Dp; // => 5.0

}

}

 


АГРЕГАЦИЯ


Поделиться:



Последнее изменение этой страницы: 2017-04-12; Просмотров: 269; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.021 с.)
Главная | Случайная страница | Обратная связь