场依赖的财产

时间:2016-06-17 08:53:36

标签: c# properties visual-studio-2015 null

我正在为设备SDK编写一个包装类,以便大项目更容易处理它(例如,getParameter(string parameter)中的字符串上没有拼写错误,并简化了为我们的目的调用的方法)。设备有一些我可以获取和设置的属性,但仅当设备已连接时(因此该属性依赖于字段device不为空且已连接)并且我可以&# 39;围绕如何处理它。我读到在getter中抛出异常可能是个坏主意。我可以使属性可以为空,但我怀疑问题在于设计。

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");
        }
    }
}

我可以将属性转换为方法,并抛出异常,但我的导师首选它们作为属性。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

我会提取连接到另一个类的逻辑,以便将来可以轻松地更改它,这样您就不会重复自己编写许多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类默认行为。如果始终连接,除了特殊技术问题情况外,您应该使用例外。如果你的设备可以连接或者没有连接,那么你需要使用布尔值或空值。

一般来说,几乎不可能说出哪种架构或方法更好。我们需要学习整个系统来做出这样的决定。你需要尝试。