2010-06-03 62 views
0

作爲維護大量遺留代碼的一部分,我們需要更改部分設計,主要是爲了使其更易於測試(單元測試)。我們需要解決的問題之一是組件之間的現有接口。兩個組件之間的接口是一個只包含靜態方法的類。尋求關於重新設計接口的建議

簡化的例子:

class ABInterface { 

    static methodA(); 
    static methodB(); 
    ... 
    static methodZ(); 
}; 

該接口用於通過組分A,使得不同的方法可以以順序使用ABInterface ::了methodA()準備一些輸入數據,然後組分B.

中調用適當的功能

現在我們正試圖重新設計此界面以各種理由:

  • 擴展我們的單元測試覆蓋率 - 我們需要資源這種組件與短線/模擬之間的依賴關係將被引入

  • 這些組件之間的接口與原始設計(即,在這個接口類之外創建了許多用於組件間I/F的新功能)。

  • 代碼是舊的,隨時間變化很大,需要重構。

該更改不應該對系統的其他部分造成干擾。我們試圖限制在生產代碼中留下許多需要測試的工件。性能是非常重要的,在重新設計之後應該不會(或非常小)降級。代碼在C++中是OO。

我在找一些想法採取什麼方法。有關如何有效地做到這一點的任何建議?

+0

對於重構建議,單個類接口並不多有用的。我們寧願需要某種「輕量級」的uml圖。爲了正確重構,這是我們需要的信息流。 – 2010-06-03 17:04:03

+0

它只有一個接口類,它的靜態方法在組件A中用於對組件B進行正確調用。兩個組件不僅僅是2個類,而是庫。信息流 - 來自組件A的方法,使用接口類中的靜態方法調用B中的方法。在B中,完成了一些計算,填充了一個或多個輸入參數,並將適當的返回代碼返回給A中的調用函數。我希望這可以更好地解釋流程(我沒有準備好任何uml)。 – ratkok 2010-06-03 17:23:25

回答

1

最簡單的答案是來包裝在一個門面靜態接口的舊庫,然後重構代碼調用新的門面,而不是老圖書館。這個新的楔子應該允許將該庫替換爲單元測試目的。首先在一種方法上進行測試,看看如何實現它。

真正困擾我的是,當一個問題與「性能問題」污點。我們都編寫了性能關鍵代碼,而且沒有人故意暗示編寫性能不佳的代碼。我發現這些「擔憂」通常來自那些譴責每一個變化的反對者,並且真的不知道爲什麼某個變化會表現得好或者表現不好。請記住,唯一有效的性能證明來自測試。運行你的性能測試並建立一個基線。進行更改。在新代碼中再次運行性能測試。展示實際影響。只有這樣,您才能對變更的實際影響做出決定。你應該從來沒有允許超過週期quibbles控制你的設計,直到證明,否則。

聽起來好像有人在你的項目中重要的是一個老C程序員*誰早就聽說一些大嘴巴說什麼「只有這樣,才能使C++跑得快就是用靜態的方法。」問題是他仍然相信它。 20年前,喧譁聲可能是正確的,但編譯器和優化器在過去的二十年中已經大大改善。所以試試看你的改變。

如果您使用現代編譯器,優化程序將會刪除目標代碼中的額外解除引用,這意味着您將不會添加任何運行時影響。

如果性能是全關鍵性的,但沒有性能測試,或者如果您不使用現代編譯器,或者如果您沒有完全發佈版本優化調整(使用配置文件引導優化,例如),那麼你有更大的工程問題,需要很長時間的照顧,然後擔心額外的抽象層的性能。

  • 注:我也是一位老C程序員,他也曾經說過20年前那樣愚蠢的事情。不同之處在於我已經瞭解到,一些優化比其他優化更重要,而且新編譯器在自行研究大部分內容方面非常出色。我過早地「優化」事物的嘗試通常以代價昂貴的代碼結束,而代碼通常不會超過股票編譯器設置。
+0

感謝您的建議。我同意你的表現,但在某種程度上,但是。績效影響不能一概而論,它還取決於其他一些事情。但是,我同意 - 現代編譯器將對大多數情況進行優化並消除任何顯着的降級。 – ratkok 2010-06-05 18:23:48

0

如果methodsA-Z是非靜態的並且是虛擬的,你可以很容易地做到這一點,對嗎?因此,如果靜態方法A-Z要調用非靜態方法virtualA-Z,則可以覆蓋行爲。瞭解了這一點之後,您需要一種方法來更改包含要測試的非靜態版本的實例。

或者,你可以把你想要重構的兩個類,並使它們使用包裝到這個靜態只有類。然後兩人可以根據需要分開。

這就是我所有的想法,而沒有看到真正的問題。

+0

是的,如果方法是非靜態的 - 這很容易。你是否建議增加一組新的虛擬函數(對這個現存的類),它們是從靜態函數中調用的,並且從這個類派生出一個新的類,它提供了不同的實現,並且可以在測試時實例化和使用。 我不確定我瞭解替代方案。也許我沒有;在我原來的問題中不清楚 - 組件不僅僅是2個類,而是庫/模塊 – ratkok 2010-06-03 17:32:32

0

感謝您的回答和評論。

審查從Working Effectively with Legacy Code書,以下兩種技術的結合「依賴 - 最新技術」一章之後實際上似乎是我們的問題的解決方案:

  • 實例委託者 - 換行/替換靜態方法從實用課程中用新的虛擬方法。
  • 靜態設置器 - 啓用不同實用程序類(生產代碼或存根代碼)的實例化。

將這兩者結合起來可以使我們將被測組件與其餘產品代碼分離。

我們唯一關心的是對性能的影響(由於使用的虛擬函數)。