Interested Article - Выделение частного класса данных
- 2020-10-30
- 1
Выделение частного класса данных (англ. 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)
{
//...
}
}
}
См. также
- 2020-10-30
- 1