讀書:《改善既有代碼的設計》之一(最好配合設計模式閱讀,能相互印證)

来源:http://www.cnblogs.com/SoFind-an/archive/2017/04/19/6605815.html
-Advertisement-
Play Games

原因:之前修改代碼看心情和工作量。後來接觸了一個小項目的重構工作,發現自己並沒有系統的重構邏輯。所以覺得有必要 去學習一下。所以選擇了上面說的兩本書。以下作為自己看書的領悟和記錄。 首先:為什麼重構? 首先改善代碼易讀性,包括機器和人。 機器易讀性:提高性能,減少冗餘,分類清楚,保持健壯性的前提下盡 ...


原因:之前修改代碼看心情和工作量。後來接觸了一個小項目的重構工作,發現自己並沒有系統的重構邏輯。所以覺得有必要

去學習一下。所以選擇了上面說的兩本書。以下作為自己看書的領悟和記錄。

首先:為什麼重構?

首先改善代碼易讀性,包括機器和人。

機器易讀性:提高性能,減少冗餘,分類清楚,保持健壯性的前提下儘量堅持單一職責原則。善用繼承多態,提高代碼利用率。

人的易讀性:層次分明,規則明確,命名規範,儘量使方法短小易讀,善用封裝,減少方法複雜性,以及代碼復用性。

第一章:

閱讀第一個案例後總結:

  1. 分解重組。

把集成多個功能的方法分解,重組成多個方法。簡化方法,提高易讀性。

然後對應的方法,放到該放的位置,這點需要自己去判斷。

作者觀點:1.絕大多數情況下,函數應該放在它所使用的數據對象內部。2.重構最好小步前進,一步一步重構。避免犯錯。

關鍵字:Replace Temp with Query,From Template Method

  2. 多態的使用。

註意switch。提取公共介面。這裡涉及到設計模式。當你使用switch的時候要註意了,可能這個點可能有重構使用多態的可能。

通過父類抽象一個方法,子類繼承父類返回不同的code實現switch case。方法放對位置是關鍵。

  3.重構方式。

從小的地方開始,如一個方法,或者幾個屬性,慢慢延伸到整個類,整個功能以致整個項目。關鍵一點是,每一個小的改

動都需要我們寫對應的單元測試配合,保證代碼不會有很大的失誤。這樣才能保證整個項目重構完成後更穩定和健壯。

所以重構的過程就是:小修改->測試->小修改->測試....直到完成。

第二,三章 :

重構原則和代碼的壞味道:

  二:

  1.何時重構,三次法則。一個東西反覆修改或者有問題三次,你就需要重構。加功能重構,修補bug時重構。覆審代碼時重構。

  2.重構涉及到資料庫結構的時候比較麻煩。所以我們首先設計資料庫的時候需要認真謹慎。然後降低數據實體跟對象之間的耦

合性。一般方法中間增加一個分割層。降低修改成本。

  3.修改介面時要特別小心。牽一發動全身,瞭解業務,完全掌握介面的調用者,可以修改。

  4.實在代碼混亂不堪,花費時間比重寫還多,建議重寫。

  三,代碼壞味道:

  1Duplicated Code.重覆代碼。記得以前學習時候老師的一句話“Don't repeat yourself”。當你發現你在重覆你自己的時候,

說明代碼有點壞味道了。想辦法重新設計一下吧。

  2.Long Method,過長函數。以前一個領導告訴我,一個方法不要超過多少多少行代碼。當時我不理解。後來我發現,

往往我們比較長的方法內部其實實現了好幾個功能。我為什麼不分開這些功能呢?分開後還可以更加方便代碼的重覆利用。

這是想起了大學老師講的單一職責了。

  3.Large Class,太大的類。提煉新的類,細分不同的職責,這樣之後你會突然發現你的文件也許放的位置是正確的了。

然後你的項目也許就有了一些約定。

  4.Long Parameter List,過長的參數列。方法代替參數去重構。得到想要的。如果沒法代替,想想依賴關係。

  5.Divergent Change,發散式變化。說白了,就是多想想以後會有什麼功能過來,來的時候你需要做的多不多?或者

有矛盾。在這時候你需要考慮清楚。也許你覺得你後邊都考慮到了。那麼請抬高你的業務視野,放眼整個項目,或者放眼相

關項目。站的夠高業務越熟悉。這些才能想的越完善。用好Extract Class.

讀到這裡我發現第三章這些跟後邊的章節依賴性很強。有點長,所以下一篇接著寫吧。我先去理解去一下。

另:看書建議,最好配合設計模式去看。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 每天一個設計模式-觀察者模式 定義: 觀察者模式定義了對象之間的一對多依賴,當一個對象狀態改變時,他的所有依賴者都會收到通知並自動更新。比如報紙訂閱服務: 客戶訂閱某種報紙,該類報紙更新時,報社將最新的報紙發送給客戶。 實現: 報社要想把最新的報紙發送給客戶,就需要知道訂閱的客戶,即報社需要維護一個 ...
  • 在進入mvc5之後,OWIN變更很主推,很熱,關於OWIN的文章也就出來了,下麵閱讀了dudu和一些園友的文章,自己也做了一個SelfHost的程式,測試了一下,感覺還是比較有Core的風格,可能也是面向多平臺部署考慮的吧! OWIN的英文全稱是Open Web Interface for .NET ...
  • 結合模板和巨集定義,可以很方便的單例化任何類 ...
  • UML:統一建模語言由OMG(Object Management Group)在1997年發表的圖標式軟體設計語言,它綜合了很多當時已經存在的面向對象的建模語言、方法和過程。 UML語言具有以下的重要功能:可視化(Visualizing)功能、說明(Specifying)功能、建造(Construc ...
  • Web Service 首發於 "開源中國" 1. 背景 中國移動簡訊網關需求,要能夠發送簡訊。開發材料只有一個簡訊發送配置:包括ID,password,code,url。一個jar包還有一個老舊的html幫助文檔。 最初將單個jar包加入工程,按照文檔中new 一個對象,直接填入參數發送的來,以為 ...
  • 當要把類替換成不同子類的時候不需要改調用的代碼,只需修改工廠類。例子: 資料庫連接類,當把mysql改成其他資料庫的時候,不用修改調用的地方。 ...
  • 重載 overload //函數重載 編譯多態 /*public void Test(string s) 第一個函數 (字元串類型) { echo "1111"; } public void Test(int a) 第二個函數(整數型,與第一個函數類型不同) { echo "int"; } publ ...
  • 自動裝配 @Resource註解需要提供bean名字,若為空,自動採用標簽下變數名或者方法名為bean的名稱。 @Inject和@AutoWired都是自動裝配,不過前者沒有reqired屬性,建議使用後者。 @Required註解主要用於setter方法之上,在bean中明確指定自動註入值或其屬性 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...