Выделение частного класса данных
| Выделение частного класса данных | |
|---|---|
| Описан в Design Patterns | Нет |
Выделение частного класса данных (англ. Private class data) — структурный шаблон проектирования, используемый для сокрытия атрибутов и их манипуляциям.
Описание
[править | править код]Обычно классы всегда изначально выглядят чёткими и понятными: они выполняют свои функции и не влияют на выполнение функций других классов, но при разработке программы добавляется новая логика, в результате некоторые классы ошибочно получают массу дополнительных обязанностей. На помощь приходит частный метод рефакторинга, известный под названием «Extract Class», который позволяет соблюсти «Принцип единственной ответственности», тем самым делая классы более надёжными и устойчивыми к изменениям.
Примеры реализации
[править | править код]Чтобы применить этот шаблон проектирования к нужному классу, необходимо:
- Создать новый класс, который будет иметь одну ответственность, используя методы рефакторинга: выделения поля и выделения метода.
- Создать связь между старым и новым классом.
Вносить изменения нужно постепенно, проверяя результат после каждого хода, чтобы избежать необходимости исправлять множество ошибок в конце. Когда процесс завершён, после проверки новых классов, следующим шагом становится старый класс: возможно, его обязанности изменились, и теперь логично назвать его по-другому.
namespace Private_class_data
{
class Program
{
static void Main(string[] args)
{
var radius = new double();
var color = new Color();
var origin = new Point();
var circle_before = new before.Circle(radius, color, origin);
var circle_after = new after.Circle(radius, color, origin);
}
}
class Color
{
}
class Graphics
{
}
class Point
{
}
}
namespace Private_class_data.before
{
class Circle
{
private double radius;
private Color color;
private Point origin;
public Circle(double radius, Color color, Point origin)
{
this.radius = radius;
this.color = color;
this.origin = origin;
}
public double Circumference
{
get { return 2 * Math.PI * this.radius; }
}
public double Diameter
{
get { return 2 * this.radius; }
}
public void Draw(Graphics graphics)
{
//...
}
}
}
namespace Private_class_data.after
{
class CircleData
{
private double radius;
private Color color;
private Point origin;
public CircleData(double radius, Color color, Point origin)
{
this.radius = radius;
this.color = color;
this.origin = origin;
}
public double Radius
{
get { return this.radius; }
}
public Color Color
{
get { return this.color; }
}
public Point Origin
{
get { return this.origin; }
}
}
class Circle
{
private CircleData circleData;
public Circle(double radius, Color color, Point origin)
{
circleData = new CircleData(radius, color, origin);
}
public double Circumference
{
get { return 2 * Math.PI * this.circleData.Radius; }
}
public double Diameter
{
get { return 2 * this.circleData.Radius; }
}
public void Draw(Graphics graphics)
{
//...
}
}
}