我正在为设备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
类默认行为。如果它是始终连接的,除非出色的技术问题案例,否则您应该使用异常。如果您的设备可以连接或不连接,则有机会相等,则需要使用布尔或空。
通常,几乎永远不可能说哪种架构或方法更好。我们需要学习整个系统才能做出这样的决定。您需要尝试。