簡體   English   中英

接近重構

[英]Approaching refactoring

我有一個以數據為中心的應用程序,用Python / PyQt編寫。 我打算做一些重構來真正將UI與核心分開,主要是因為還沒有任何真正的測試,而且顯然必須改變。

已經存在一些分離,我認為我已經以正確的方式做了很多事情,但它遠非完美。 兩個例子,告訴你什么樣的事情困擾着我:

  • 當用戶右鍵單擊數據對象的表示時,彈出的上下文菜單由數據對象創建,盡管此數據對象(實質上是數據庫行的ORM表示)應該與UI無關。

  • 當某些內容被寫入數據庫但寫入失敗時(例如,因為數據庫記錄被另一個用戶鎖定),會向用戶呈現經典的“重試/中止”消息框。 此對話框由數據提供程序*創建,但提供程序顯然不應具有任何UI功能。 顯然,提供者可以提出異常或以其他方式指示失敗,並且UI可以捕獲並相應地采取行動。

    *這是我用於對象的詞,它基本上代表數據庫表並在其數據對象和數據庫引擎之間進行調解; 我不確定那是否通常被稱為“提供者”

我沒有測試經驗,所以我不容易“感覺”可測性問題等,但在我開始之前,必須進行一些重組。

沒有復雜的業務邏輯(它主要只是CRU D ,是的,即使沒有D),這將比重寫更重組,所以我並不真正關心引入這個問題中討論的回歸錯誤。

我的計划是開始重構這個想法,因為UI部分可以很容易地被刪除,例如,由Web前端或基於文本的界面而不是Qt界面替換。 另一方面,Qt本身仍將被核心使用,因為信號/插槽機制在很多地方使用,例如數據對象發出changed信號以指示,你知道什么。

所以,我的問題:這是一種提高可測試性和可維護性的可行方法嗎? 還有其他任何評論,特別是考慮到Python嗎?

如果你還沒有這樣做,請閱讀Michael Feathers的“有效使用遺留代碼” - 它正是處理這種情況,並提供了豐富的技術來處理它。

他提出的一個關鍵點是在重構之前嘗試進行一些測試。 由於它不適合單元測試,因此嘗試進行一些端到端測試。 我相信Qt有自己的用於驅動GUI的測試框架,因此添加針對已知數據庫操作GUI的測試並驗證結果。 在清理代碼時,您可以使用單元測試替換或擴充端到端測試。

如果要從所有其他部分中提取應用程序的所有GUI部分以測試所有應用程序,則應使用Model-View-Presenter:您可以在此處此處找到一些解釋。

使用此模型,應用程序的所有服務都使用演示者,而只有用戶可以直接與視圖(GUI部分)交互。 演示者正在從應用程序管理視圖。 在您想要修改GUI框架的情況下,您將擁有一個獨立於您的應用程序的GUI部件。 您唯一需要修改的是演示者和視圖本身。

對於您想要的GUI測試,您只需為演示者編寫單元測試 如果要測試GUI使用,則需要創建集成測試

希望有所幫助!

我之前已經完成了針對UI /后端分離的大型遺留代碼的重構。 這很有趣,也很有價值。

/贊;)

無論模式是什么模式,還是MVC的一部分,擁有非常清晰的API層都是非常寶貴的。 如果可能,您可以通過調度程序路由所有UI請求,該調度程序將為您提供對UI < - >邏輯通信的更大控制,例如。 實現緩存,身份驗證等

想象:

[QT Frontend]
[CLIs]             <=======> [Dispatcher] <=> [API] <==> [Core/Model]
[SOAP/XMPRPC/Json]
[API Test Suite]

這條路

  • 添加測試套件以測試API更容易。
  • 此外,它還可以更加統一地添加更多UI。
  • API文檔:假設您希望通過某些RPC接口記錄和公開API,則更容易生成API文檔。 如果有人不同意API文檔的重要性,可以隨時查看Twitter API並獲得成功。
  • 您可以快速將API層導入python shell並使用它

在開始編寫API層之前,API設計可能會發生。 根據應用程序的不同,您可能希望獲得zinterfaces等軟件包的幫助。 這是我在編寫非常小的應用程序時采用的一般方法,它對我來說從未失敗過。

看看

這種方法的一個明顯優勢是,在擁有API層和新UI之后,您現在可以回到遺留代碼並以更小的步驟修復/重構它。

其他建議是准備好您的測試套件。 請參閱interstar的建議, 了解在Brownfield應用程序中實現單元測試的首要任務是什么?

有一點,到目前為止還沒有提到,並沒有真正回答這個問題,但非常重要: 在你開始重構之前,你應該盡可能地進行測試。 測試的主要方面是檢測你是否破壞了某些東西。

重構是確切地看到某些操作的效果在哪里發生變化以及同一個調用產生不同結果的位置非常有價值的地方。 這就是所有這些測試的內容:你想看看你是否破壞了什么,你想要看到所有無意的變化。

因此,現在對重構后仍應產生相同結果的所有部件進行測試。 測試不是為了永遠保持相同的完美代碼,測試是針對需要更改的代碼,需要修改的代碼,將被重構的代碼。 測試是為了確保您的重構確實完成了您打算做的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM