我创建了一个代表组件的类。该组件有宽度,高度,x坐标,y坐标等。当我操纵宽度,高度,x和y时,我想将逻辑保留在类中。但是Component Class中有一个具有相似值的接口对象。该界面可用于与不同类型的CAD软件对话。但是Shape接口可以为null。
所以我的问题是什么是最好的方法呢?在下面的例子中,当我改变“Y”时,我应该在形状界面中检查null吗?或者Component Class有事件处理程序,Shape接口应该注册它们。那么设计这种方法的最佳实践是什么,以及哪种方法可以提供最佳性能?
欣赏它!
public class Component
{
private double _y;
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 => _y;
set
{
_y = value;
if (Shape != null) Shape.Y = value;
}
}
public void Update_Shape()
{
//used to update the Shape Interface after it is assigned
}
}
public interface IShape
{
string Name { get; set; }
double Width { get; set; }
double Height { get; set; }
double X { get; set; }
double Y { get; set; }
}
更新:为了提供更多详细信息,我的界面将能够与Microsoft Visio和AutoCad通信。它们仅用于数据的可视化表示,不控制多少形状或它们的位置。因此,在我的应用程序中,用户可以在应用程序中移动或更改宽度/高度。如果他们当时打开Visio,我希望它也更新Visio形状。如果它没有打开,那么它无关紧要(它最终会在以后更新)。 AutoCad也是如此。
这种情况下的最佳实践取决于您的设计目标。
如果你想自动更新IShape
并且性能至关重要,那么用空检查手动写出你的setter会给你们两个。拥有IShape订阅的事件会导致您必须调用比检查null更昂贵的事件。这样可以保持课堂内的混乱,因为你只需要分配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;
}
}
}