2011-10-21 20 views
0

我創建了一個庫類CircuitController與通過串口控制電路通信。C#方法與屬性:異常可能會出現

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個參數這將是一個麻煩反覆輸出。 :/

回答

6

我傾向於當一個屬性被設置爲避免實際什麼。相反,讓所有屬性設置在內存中,然後添加一個「保存」方法,將屬性「保存」到串行設備。

+0

我同意。這是要走的路。 –

+0

太好了。謝謝。 – john

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返回一個類類型,那麼查看代碼的程序員將無法知道更改返回對象可能具有哪些效果。

相關問題