可以在类中使用null接口对象的最佳实践

问题描述 投票:0回答:1

我创建了一个代表组件的类。该组件有宽度,高度,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也是如此。

c# events interface class-design cad
1个回答
1
投票

这种情况下的最佳实践取决于您的设计目标。

如果你想自动更新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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.