2011-01-27 83 views
3

我正在開發一個與設備通信的軟件。創建具有多個函數的庫或創建類是否更好?

軟件將爲設備發送命令。該裝置具有使用以下協議來回答:

<STX><STX><COMMAND>[<DATA_1><DATA_2>...<DATA_N>]<CHKSUM><ETX> 

其中:

<STX> is the Start of TeXt (0x55); 
<COMMAND> can be 0x01 for read, 0x02 for write, etc; 
<DATA> is any value; 
<CHKSUM> is the checksum; 
<ETX> is the End of TeXt (0x04). 

所以,我要驗證所接收的數據。

然後,所接收的數據:

  • 不能爲空;
  • 必須有3個或更多字符;
  • 在字符串數據的前兩個字符中必須有一個頭;
  • 必須在字符串數據的最後一個字符中有一個「頁腳」;
  • 必須具有有效的CheckSum。

如果答案是有效的,那麼我可以處理數據。但在我必須從收到的響應中提取這些數據之前。

好的,這是一個相對容易的任務。之前,我會以程序化的方式做到這一點,只使用一個功能並放置很多if。

現在我正在研究更多關於良好的編程實踐,事情似乎越來越難做。

要驗證設備答案,最好是創建一個類「ValidateReceivedData」,例如在這個類的構造函數中傳遞接收到的數據?然後創建一個名爲「IsReceivedDataValid」的公共方法來檢查上面給出的所有步驟?

或者也許會更好創建一個庫與幾個功能來驗證接收到的數據?

我也想用單元測試。

正如我之前說過的,我正在學習更多以製作更好的代碼。但是我意識到我現在花更多的時間來編寫代碼。而且有太多的問題正在出現,但在我看來,他們似乎很容易解決,但我沒有得到。

+3

好的設計並不總是編寫代碼的最快方式。但從長遠來看,維護和添加功能要容易得多。所以這絕對是值得的。 – 2011-01-27 18:15:46

回答

2

爲了什麼是值得的,我在使用面向對象設計之前做過這樣的事情。以下是爲您的設計高度可能性:

ProtocolParser類:

  • 注意到一個SerialPort對象,或同等學歷,在構造函數中,聽取其傳入字節
  • 通行證接收的字節到OnByteReceived,這實現協議特定的狀態機(具有諸如Unknown,Stx1Received,Stx2Received,...,CkSumReceived的狀態)。
  • 收到完整的消息後,創建一個類型爲Packet的對象,該對象在其構造函數中接受一個字節列表。然後引發一個事件PacketReceived,通過Packet作爲參數。
  • 如果接收到錯誤的字節,它會引發事件BadDataReceived並傳遞錯誤的數據(可能用於記錄/調試目的)。

Packet類:

  • 注意到字節,並存儲它們的列表/陣列CommandData性質。
  • 不需要保存校驗和,因爲此類僅用於表示有效的數據包。

上述類足以實現接收協議。您應該可以通過模擬SerialPort類來測試它(即,ProtocolParser實際上可以採用IDataSource而不是SerialPort)。

然後,您可以添加更高級別的類來實現您的設備特定功能,該功能將監聽ProtocolParserPacketReceived事件。

1

當然最好使用OOP設計。
通過你解釋什麼,我會做至少2類:

  1. 消息

  2. 執行器

的消息將從設備接收的命令,執行者將處理該消息。

消息對象將以設備的答案啓動。將分析它,並保持字段你描述:

STX
COMMAND
DATA
CHKSUM
ETX

然後一個執行器對象將接收的消息對象,並執行信息的實際執行,並保存邏輯代碼。

1

我會走得更遠了一步比尤查的回答,並創建以下類別:

  1. 命令:其實不是一類,但一個枚舉值,這樣你就可以對證Command.Read等,而而不僅僅是「知道」0x01和0x02的含義。
  2. 消息:只是一個普通的對象(PO​​JO/POCO /無論),旨在保存消息的數據表示形式。這將包含以下字段:
    1. 命令(前面提到的枚舉類型)
    2. 數據:數據的列表。根據數據的表示方式,您可以爲此創建一個類,也可以將每個數據表示爲一個字符串。
  3. MessageParser:這將有一個函數可以解析字符串或文本流並創建一個Message對象。如果文本無效,我會拋出一個定製的異常(另一個類),可以被調用者捕獲。
  4. MessageExecutor:這需要一個Message對象並執行它所表示的動作。

通過製作中間表示對象(消息),可以分離您正在執行的各種操作。例如,如果Powers That Be認爲消息文本可以作爲XML或JSON發送,則可以創建不同的MessageParser類,而不必混淆決定如何處理消息的邏輯。

這也使得單元測試更容易,因爲您可以獨立於執行程序測試消息解析器。首先通過調用解析函數並檢查生成的Message對象來測試消息解析器。然後通過創建一個Message對象並確保採取適當的操作來測試執行者。