C# 场相关性质
我正在为设备SDK编写一个包装类,以使大型项目更容易处理它(例如,在C# 场相关性质,c#,properties,visual-studio-2015,null,C#,Properties,Visual Studio 2015,Null,我正在为设备SDK编写一个包装类,以使大型项目更容易处理它(例如,在getParameter(string parameter)中不要键入字符串,并简化为我们的目的而调用的方法)。设备有一些属性,我可以获取和设置,但是只有在设备已连接的情况下才可以(因此属性取决于设备字段是否为空且未连接),我无法理解如何处理它。我读到在getter中抛出异常可能是个坏主意。我可以使该属性为空,但我怀疑问题出在设计中 class MyClass { private Device device; //SDK
getParameter(string parameter)
中不要键入字符串,并简化为我们的目的而调用的方法)。设备有一些属性,我可以获取和设置,但是只有在设备已连接的情况下才可以(因此属性取决于设备字段是否为空且未连接),我无法理解如何处理它。我读到在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");
}
}
}
我可以将属性转换为方法,并抛出异常,但我的导师更喜欢将它们作为属性。有人能给我指出正确的方向吗?我会提取连接到另一个类的逻辑,这样以后您就可以很容易地更改它,这样您就不会在(!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)
{
// ...
}
您可能还希望创建设备对象池,而不是factory或其他任何您想要的。这个例子正好说明了这个想法
它还取决于您的体系结构和设备
类的默认行为。如果它始终处于连接状态,除非出现异常技术问题,否则应使用异常。如果您的设备可以连接或不连接,并且机会均等,那么您需要使用布尔值或空值
一般来说,几乎不可能说哪种体系结构或方法更好。我们需要学习整个系统来做出这样的决定。您需要尝试。不确定您真正想要的是什么,但您可以先将所有依赖于设备的处理放在一个类中,然后围绕这个类进行异常处理,之后您可以使getter和setter独立于设备-谁知道您可能需要在将来动态更改设备字符串默认为空。如果您只使用字符串进行操作,请不要急于返回null。恐怕还有一些属性是int、double和enum,但是对于字符串属性的建议很好,谢谢@serup你的意思是说也要包装设备,让我的包装器有一个devicewrap的实例吗?精彩的解释和示例。我将尝试以类似的方式实现它。谢谢