我创建了一个库类CircuitController
,它通过串口与控制电路进行通信。
public class CircuitController
{
// Enumerations.
public enum Sensors { Sensor1, Sensor2, ..., Sensor15 };
...
// Fields.
private SerialPort serialPort; // Set in constructor.
private Dictionary<Sensors, Sensor> activeSensorCollection;
...
// Properties.
public Dictionary<Sensors, Sensor> ActiveSensors
{ get { return this.activeSensorCollection; } }
// Methods.
public void SetSensorUnits(Sensors sensor, String sensorUnits)
{
// Creates serial command based off parameters, sends, receives, processes.
}
...
// Constructors.
public CircuitController(...)
{
... // Set CircuitController fields including nested classes.
Sensor sensor1 = new Sensor(a,b,c,d,this); // Link sensor to this controller instance.
... // Add sensors to dictionary.
}
// Nested Classes.
public class Sensor
{
// Fields.
private CircuitController controller;
private String units;
private Sensors sensorNumber;
...
// Properties.
public String Units
{
get
{
return this.controller.GetSensorUnits(this.sensorNumber);
}
set
{
this.controller.SetSensorUnits(this.sensorNumber, value);
}
}
...
}
所以这是我的问题:即使可能引发异常(例如串行通信错误),允许用户通过属性获取/设置传感器设置是否可以?
String sensor2Units = circuitControllerInstance.ActiveSensors[Sensor2].Units'
circuitControllerInstance.ActiveSensors[Sensor1].Units = "mm";
我发现这比......更清楚了。
String sensor2Units = circuitControllerInstance.GetSensorUnits(Sensors.Sensor2);
circuitControllerInstance.SetSensorUnits(Sensors.Sensor1, "mm");
请注意,这些是简化的示例,一些Get / Set方法最多有5个参数,这些都是重复输入的麻烦。 :/
答案 0 :(得分:6)
在设置属性时,我倾向于避免实际做任何事情。而是将所有属性设置在内存中,然后添加一个“保存”方法,将属性“保存”到串行设备。
答案 1 :(得分:0)
我倾向于支持只读属性,无论对象状态如何,都可以检查没有异常风险的事物,读取属性的读写属性,无论对象状态如何,都可以检查或设置为任何对象值永远有效(即有效值的集合不应该取决于对象状态),以及其他东西的getter / setter方法。设置一个读写属性可能会影响其他只读属性的值,但不应影响任何其他读写属性的值。
在某些情况下,必须同时设置函数的许多属性,使用一对方法将对象的状态复制到结构,并从结构中读取对象的状态可能很有用。有些人似乎认为将结构用于此类目的是不好的,因为代码如下:
struct MyPropertyStruct { Rectangle bounds; ... } ... MyPropertyStruct myProperties; someObject.GetProperties(ref myProperties); myProperties.Bounds.Left += 4;
不会影响someObject,但只会影响myProperties中存储的属性的副本,除非或者直到有人执行“someObject.SetProperties(ref myProperties)”。我建议相反:如果myProperties是一个只包含值类型或不可变引用类型的结构,任何有能力的程序员都会知道,根据定义,值类型不会绑定到任何其他类型。相反,如果GetProperties返回一个类类型,那么查看代码的程序员将无法知道更改返回对象可能产生的影响。