字段依赖性属性



我正在为设备SDK编写包装类,以使大型项目更容易处理它(例如,getParameter(string parameter)中的字符串中没有错字,并简化了为我们的目的调用的方法)。该设备具有我可以获得和设置的某些属性,但是仅在连接设备(因此该属性取决于字段device不为null并连接),而我无法包裹我的头部周围如何处理它。我读到,在Getters中投掷例外可能是个坏主意。我可以使属性无效,但我怀疑问题在于设计。

class MyClass
{
    private Device device; //SDK device
    public string Name
    {
        get //set is pretty much the same
        {
            if (!device.IsConnected)
                //return null and have nullable property? throw NotConnectedException?
            return device.getParameter("Name");
        }
    }
}

我可以将属性转换为方法,并提出异常,但是我的导师更喜欢它们作为属性。有人可以将我指向正确的方向吗?

我会提取连接到另一类的逻辑,以便您可以在以后轻松更改它,以便您不重复自己编写许多if (!device.IsConnected)...检查。

例如,如果您现在只能与连接并具有ErrorStatus = 0的设备一起使用该怎么办?您是否会更改每个属性中的每个条件?

我会写类似的东西:

class DeviceWrapperFactory
{
    public static DeviceWrapper Connect(Device device)
    {
        if (!_device.IsConnected)
        {
            // assume trying to reconnect here if possible
            // like "if (!device.TryToConnect())"
            throw new DeviceConnectionFailedException();
        }
        return new DeviceWrapper(_device);
    }
}
class DeviceWrapper
{
    private Device device;
    DeviceWrapper(Device device)
    {
        _device = device;
    }
    public string Name
    {
        get
        {
            return device.getParameter("Name");
        }
    }
}

这样,您将能够做:

try
{
    Console.WriteLine(DeviceWrapperFactory.Connect(usbDevice).Name);
    // or
    var usbDeviceWrapper = DeviceWrapperFactory.Connect(usbDevice);
    Console.WriteLine(usbDeviceWrapper.Name);
    Console.WriteLine(usbDeviceWrapper.AnotherProperty);
}
catch (DeviceConnectionFailedException dcfe)
{
    // ...
}

您可能还需要创建设备对象池而不是工厂或其他想要的东西。此示例只显示了这个想法。

这也取决于您的体系结构和Device类默认行为。如果它是始终连接的,除非出色的技术问题案例,否则您应该使用异常。如果您的设备可以连接或不连接,则有机会相等,则需要使用布尔或空。

通常,几乎永远不可能说哪种架构或方法更好。我们需要学习整个系统才能做出这样的决定。您需要尝试。

相关内容

  • 没有找到相关文章

最新更新