我正在为设备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");
}
}
}
我可以将属性转换为方法,并抛出异常,但我的导师首选它们作为属性。有人能指出我正确的方向吗?
答案 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
类默认行为。如果始终连接,除了特殊技术问题情况外,您应该使用例外。如果你的设备可以连接或者没有连接,那么你需要使用布尔值或空值。
一般来说,几乎不可能说出哪种架构或方法更好。我们需要学习整个系统来做出这样的决定。你需要尝试。