邊界




本章,提供一些程式練習和技巧,可以幫助我們保持軟體系統邊界的整潔。


使用第三方軟體的程式碼

使用者希望介面能夠專注於他們所要的特別需求。這種張力會導致我們的系統邊界出現問題。
下面以 Java.util.Map為例,如果我們的應用程式需要 Sensor (感測器) 的 Map,可能會如下設定:

   Map sensors = new HashMap();
   Sensor s = (Sensor) sensors.get( sensorId );
這樣做並不是整潔的程式碼,且這樣的程式碼無法自我說明,我們無法得知其目的。
更整潔的作法如下:

public class Sensors {

    private Map sensors = new HashMap();
    
    public Sensor getById (String id) 
    {
      return (Sensor) sensors.get(id);
    }

    //省略片段程式碼
}
邊界上的介面 (Map) 被隱藏了。它會因著應用程式其它部分極小的影響而演進,因為轉型和型態管理都在 Sensors 類別內部處理了,所以使用泛型不再是大問題。這樣的作法使得程式碼容易理解,也不易被誤用
如果你使用類似 Map 這樣的邊界介面,將它放在類別裡,或放在相近的類別家族裡。
避免在公用 API 裡回傳介面,或將介面當作參數傳遞給 API 。

 

探索及學習邊界

不在產品程式裡實驗新的東西,而是另外撰寫一些測試程式,來探索與瞭解第三方軟體,這種測試叫做學習式測試 (learning tests)。這個測試的重點在於,我們想要從 API 獲得什麼樣的結果。

學習式測試比不花工夫更好

不論如何,我們都必須學會這個 API ,而寫測試來獲得相關知識,是一個簡單又無不良的方式。學習式測試幫助我們驗證第三方軟體是否按照我們預期般的執行。套件修改無法通過我們的測試時,我們就能馬上發現出了問題。
不管你是否需要透過學習式測試來學習,還是需要有一套「與生產程式碼採用相同方式的邊界測試」來支援整潔的介面。如果沒有這些邊界測試,來減輕升級整合所造成的負擔,我們停留在舊版本程式的時間,可能會比預期的更久。

 

使用尚未存在的程式

從無法控制且未定義的 API 中抽取所需的部分,利用我們應用程式所需的特定介面,維持它的整潔且具有表達力。只要當目標 API 定義好了之後,就可以撰寫 ADAPTER (轉接器),它封裝了與目標 API 的互動,當目標 API 升級時,ADAPTER 是唯一需要被修改的地方。

aaa

這樣的設計,為測試提供了一個非常方便的接縫 (seam)。使用一個適合的 FakeTransmitter (假的傳送音),就能測試 CommunicationsController 類別。當我們獲得 Transmittet API 時,我們也能產生邊界測試,來確保正確地使用了 API 。

 

簡潔的程式邊界

在邊界的程式碼必須能清楚的分割,並定義預期的測試。應避免讓程式過度地使用第三方軟體裡的特殊之處。
管理第三方軟體邊界的方式:
  • 封裝起來
  • 使用 ADAPTER
促使內部對於邊界的一致性對待,當第三方軟體有所改變時,只需進行極少處的修改。




參考來源: Clean Code – A Handbook of Agile Software Craftsmanship  by Robert C. Martin

  • Share:

You Might Also Like

0 意見