Лучшая практика в этой ситуации зависит от ваших целей проектирования.
Если вы хотите автоматически обновить IShape
и производительность критична, то ручное выписывание ваших сеттеров с нулевой проверкой даст вам обоим. Наличие события, на которое подписывается IShape, заставляет вас вызывать событие, которое стоит дороже, чем проверка на ноль. И это имеет преимущество в сохранении беспорядка внутри класса, так как вам нужно только назначить myComponent.X = 20
;
Наличие события имеет свои преимущества. Если вы посмотрите шаблон наблюдателя, вы сможете найти много хороших материалов по этому вопросу. Если у вас есть более одного IShape
, который подписался бы на ваш Component
, скажем, как из Visio, так и из AutoCad одновременно, это будет путь.
Теперь с точки зрения производительности, если вы обновляете менее нескольких тысяч компонентов в секунду и вам нужен более чистый код, я бы просто вызвал Update_Shape()
, когда вы хотите синхронизировать значения. Если вы назначаете несколько значений одновременно, вы можете заключить их в действие, которое автоматически синхронизирует значения после его завершения.
var c = new Component();
c.Shape = new Shape();
c.UpdateShapes(s => {
s.Height = 100;
s.Width = 100;
s.X = 5;
});
public class Component
{
public IShape Shape { get; set; }
public string Name { get; set; }
public double Width { get; set; }
public double Height { get; set; }
public double X { get; set; }
public double Y { get; set; }
public void UpdateShapes(Action<Component> update)
{
update(this);
SyncronizeShapes();
}
public void SyncronizeShapes()
{
if (Shape != null)
{
Shape.Name = Name;
Shape.Width = Width;
Shape.Height = Height;
Shape.X = X;
Shape.Y = Y;
}
}
}