Выделение частного класса данных
Выделение частного класса данных (англ. Private class data) — структурный шаблон проектирования, используемый для сокрытия атрибутов и их манипуляциям.
Выделение частного класса данных | |
---|---|
Описан в Design Patterns | Нет |
Описание
Обычно классы всегда изначально выглядят чёткими и понятными. Они выполняют свою работу и не лезут в обязанности других классов. Однако при разработке программы добавляется новая логика. В результате некоторые классы ошибочно получают массу дополнительных обязанностей. На помощь приходит частный метод рефакторинга, известный под названием «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)
{
//...
}
}
}