重構原則

来源:http://www.cnblogs.com/liuyoung/archive/2017/11/12/7819501.html
-Advertisement-
Play Games

一般在介紹一樣新技術之前,我們都要大致講講它的歷史、主要原理等等。當然,這些東西很枯燥,很容易誘發我們的瞌睡蟲。但是不說,又不能讓人理解。好在不是太多。 如果您已經瞭解重構的定義、原理以及如何重構,那麼請跳過本小節。好了,書歸正傳。 返回總目錄 一、何謂重構(What) 視上下文的不同,重構有兩種定 ...


一般在介紹一樣新技術之前,我們都要大致講講它的歷史、主要原理等等。當然,這些東西很枯燥,很容易誘發我們的瞌睡蟲。但是不說,又不能讓人理解。好在不是太多。

如果您已經瞭解重構的定義、原理以及如何重構,那麼請跳過本小節。好了,書歸正傳。


返回總目錄


 

一、何謂重構(What)

視上下文的不同,重構有兩種定義:

重構(名詞):對軟體內部結構的一種調整,目的是在不改變軟體可觀察行為的前提下,提高其可理解性,降低其修改成本。

重構(動詞):使用一系列重構的手法,在不改變軟體可觀察行為的前提下,調整其結構。

1、重構的目的是使軟體更容易被理解和修改。

2、重構不會改變軟體的可觀察的行為——重構之後軟體的功能一如以往。

在使用重構技術開發軟體時,有兩種截然不同的行為:添加新代碼,以及重構。這便是“兩頂帽子”。

添加新功能時,你不應該修改既有代碼,只管添加新功能。通過測試,你可以衡量自己的工作進度。 
重構時你就不能再添加新功能,只管改進程式結構,只在絕對必要時才修改測試。

二、為何重構(Why)

1、重構改進軟體設計

2、重構使軟體更容易理解

3、重構幫助找到bug

4、重構提高編程速度

三、何時重構(When)

這裡作者提出:幾乎任何情況下,都反對專門撥出時間進行重構。重構應該隨時隨地進行。你不應該為重構而重構,之所以重構,是因為你想做別的什麼事,而重構可以幫你把那些事做好。

三次法則:第一次做某事只管去做;第二次做類似的事,雖然會反感但也可勉強去做;第三次再做類似的事,你就該重構了。

事不過三,三則重構。

1、添加功能時重構

最常見的時機就是給軟體添加新特性的時候,可以幫助我理解需要修改的代碼。

如果你發現自己需要為程式添加一個特性,而代碼結構使你無法很方便地達成目的,那就先重構那個程式,使特性的添加比較容易進行,然後再添加特性。

2、修補錯誤時重構

調試過程中運用重構,為了讓代碼更具可讀性,可以加深自己的理解,找出bug。

3、覆審代碼時重構

重構可以幫助我覆審別人的代碼,還可以幫助代碼覆審工作得到更具體的結果。

四、怎麼對經理說(How)

“該怎麼對經理說重構的事”?

對於“質量驅動”型的經理:

在覆審中使用重構就是一個不錯的辦法。大量的研究顯示,技術覆審是減少錯誤、提高開發速度的一條重要途徑。

隨便找一本關於覆審、審查或者軟體開發的書看看,從中找出最新引證,應該可以讓大多數經理認識覆審的價值。

對於“進度驅動”型的經理:

最好的辦法就是不告訴他。經理要我儘快完事,至於怎麼完成,那就是我的事了。我認為最快的方式就是重構,所以我就重構嘍。

其實,大多數重構都為程式引入了更多的間接層。間接層是一把雙刃劍,因為每次一個東西分成兩份,就需要多管理一個東西。

間接層也有其存在的價值。

1、允許邏輯共用

比如一個子函數可以在兩個不同的地點被調用,或者基類中的某個函數被所有子類所共用。

2、分開解釋意圖和實現。

你可以選擇每個類和函數的名字,這給了你一個解釋自己意圖的機會。

3、隔離變化。

4、封裝條件邏輯。

五、重構的難題

1、資料庫

  • 絕大多數的商用程式都與其背後的資料庫結構緊密耦合。
  • 無論多麼小心的進行系統分層,降低耦合度,資料庫結構的改變還是讓你不得不進行漫長且繁瑣的數據遷移工作

2、修改介面

對於已經發佈的介面(published interface),無法僅僅修改調用者就能安全的修改介面。你必須同時維護新舊兩個介面,幸運的是,這並不難,請儘量這麼做:讓舊介面調用新介面。同時,使用C#中的Obsolete標記舊介面。

不要過早發佈介面。請修改你的代碼所有權政策,使重構更順暢。

3、難以通過重構手法完成的設計改動

我們很難將不考慮安全性需求時構造起來的系統重構為具備良好安全性系統。

何時不該重構

1、重新編寫所有代碼的時候

有時候既有代碼太混亂,重構不如重寫來的簡單。

重寫有一個清楚的訊號:現有代碼根本能不正常運行,代碼裡面滿是錯誤,無法穩定運行。

2、項目已近最後期限

重構的確能提高生產力。如果最後沒有足夠時間,就表示你其實早該重構。

 六、重構與設計

重構肩負一項特殊使命,它與設計彼此互補。

重構可以帶來更簡單的設計,同時又不損失靈活性,降低了設計過程的難度,減輕了設計的壓力。

七、重構與性能

關於重構,有一個常被提出的問題:它對程式的性能將造成怎樣的影響?

  • 並不贊同為了提高設計的純潔性而忽視性能,把希望寄托於更快的硬體身上也絕非正道。雖然重構可能使軟體運行更慢,但它使軟體的性能優化更容易。
  • 除了實時系統,其他任何情況下“編寫快速軟體”的秘密就是:首先寫出可調的軟體,然後調整它以求獲得足夠的速度。

八、小結

重構的第一步,永遠都是為即將修改的代碼建立一組可靠的測試環境。好的測試,是重構的根本。

重構技術就是以微小的步伐修改程式。如果你犯下錯誤,很容易便可發現它。

任何一個傻瓜都能寫出電腦可以理解的代碼。唯有寫出人類容易理解的代碼,才是優秀的程式員。

代碼首先是給人閱讀的,其次才是讓電腦運行的。 

重構的節奏是怎麼樣的?可以用這樣一個迴圈來表示:

while(重構){
    測試();
    小修改();
}

好吧。理論知識就是這麼多。To Be Continued...

 

 本次分享到此結束。如果這篇文章對你有幫助的話,評論或推薦下吧!

作者:NaYoung
出處:http://www.cnblogs.com/liuyoung/p/7819501.html 
歡迎轉載,但任何轉載必須保留完整文章,在顯要地方顯示署名以及原文鏈接。如您有任何疑問或者授權方面的協商,請給我留言

 


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

-Advertisement-
Play Games
更多相關文章
  • 如果我們要從線程池中取消某個線程的操作,應該如何實現呢?本示例使用CancellationTokenSource和CancellationToken兩個類來實現在取消線程池中的操作。 ...
  • 在進行實體轉換操作的時候如果需要在對兩個實體之間兩個屬性欄位差不多相同的類要進行一個互相的轉換,我們要把a對象的所有欄位的值都複製給b對象,我們只能用b.屬性=a.屬性來寫,如果屬性欄位太多的話,就要寫很多行複製語句,麻煩還容易漏掉一些,這個時候可以利用c#的反射來實現複製。我們可以寫這樣一個利用泛 ...
  • 用Windows 8.1的童鞋應該知道OneNote裡面有一個RadialMenu。如下圖,下圖是WIn10應用Drawboard PDF的RadialMenu,Win8.1的機器不好找了。哈哈,由於整個文章比較長,大家可以放《給我一首歌的時間》 邊聽邊看。<滑稽> 從設計到開發包括修複一些bug, ...
  • 背水一戰 Windows 10 之 控制項(控制項基類 - UIElement ): 獲取 UIElement 的位置, UIElement 的佈局相關(Measure, Arrange), UIElement 的非完整像素佈局(UseLayoutRounding), UIElement 的其他特性(V... ...
  • 一、前言 最近使用 的時候,一段時間久會產生 這個問題。後來通過測試,發現部署在 上的站點,預設情況下,IIS會在每個間隔固定時間回收 ,如果剛剛好有很多請求訪問調用了 映射的介面,就會產生如下問題。 System.NullReferenceException: 未將對象引用設置到對象的實例。 在 ...
  • 原文:https://blog.markvincze.com/troubleshooting-high-memory-usage-with-asp-net-core-on-kubernetes/ ps:我不是死板翻譯原文的,儘量的通俗一點,如有不對歡迎指出,謝謝哈。 在生產環境中,我們把asp.ne ...
  • 前言:有了NuGet引用什麼的管理起來方便多了,特別是團隊合作的時候,但是在使用過程中發現從遠程還原包的時候真的是等到花都謝了,沒辦法,只好自己搞個NuGet伺服器。 我是分割線 廢話少說,開始正題: 一、部署NugetServer 1、新建一個空的web項目(這裡.NET Framework版本選 ...
  • using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System. ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...