我的任務是維護和更新一個庫,它允許計算機在硬件設備上發送命令,然後接收其響應。目前代碼的設置方式是設備可以接收的每個可能的命令都是通過自己的功能發送的。代碼重複無處不在; DRY倡導者最糟糕的噩夢。如何在不增加其他地方的複雜性的情況下降低庫中的複雜度?
顯然有很多改進的機會。問題是每個命令有不同的有效載荷。目前,要作爲有效載荷的數據以參數的形式傳遞給每個命令函數。如果不將複雜性推到一個稱爲圖書館的水平,就很難合併功能。
當收到來自設備的響應時,其數據被放入一個完全負責保存這些數據的類的對象中,但它們什麼也不做。有數百個這樣做的課程。這些對象隨後用於通過應用層訪問返回的數據。
我的目標:
Throughly減少代碼的重複
維持在應用層
複雜的similiar水平更輕鬆地添加新的命令
我的想法:
有無一個函數發送一個命令,另一個接收函數(接收函數在響應時自動調用檢測到來自設備的電子郵件)。有一個結構體,它保存所有將被傳遞給發送函數並由接收函數返回的命令/響應數據。由於每個命令都有相應的枚舉值,因此需要一個switch語句來設置用於發送的任何命令特定數據。
我的想法是最好的辦法嗎?有我可以在這裏使用的設計模式嗎?我看了看,但看起來並不符合我的需求。
在此先感謝! (如果需要澄清,請讓我知道)
感謝您的輸入。我絕對同意,無論我最終做什麼,我都不想增加客戶的複雜性。你所描述的古代所用的方法與我所提出的方法很接近。 case語句將用於設置發送到設備的有效負載。 您的設備調度想法是我一直在考慮的事情。我不一定喜歡大喇叭陣列的想法(設置可能很麻煩),但是看起來我最終會得到一個大鳴喇叭的SOMETHING,無論我的方法如何。 – Hojdra 2010-02-24 19:17:13
您實際上可以通過舊式'case'調度方法獲得一些代碼共享...但它涉及到使用goto。這不是大多數人想要(甚至應該)做的事情。 – 2010-02-24 20:02:54
哈哈,不,我寧願不要被迪克斯特拉的鬼魂困擾:)。我一直在想你的建議。正如你所說,我目前的想法是,每個從基類繼承的命令都有一個類。每個類都有一個SendCommand和HandleResponse方法。該類還將封裝發送該命令所需的所有數據以及響應該命令而收到的任何數據。該庫已經使用函數映射來決定在收到響應時要調用哪個響應函數,因此不會有太大的變化。 – Hojdra 2010-02-24 20:14:35