重構是一種精神,證明你在致力於提供高效的、精鍊的、健壯的代碼,而不是淩亂的、晦澀的、漏洞百出的代碼。
在Visual Studio 2005中,微軟第一次提供了重構工具。但是不夠,遠遠不夠。我們需要的重構是非常廣義的,我們想要對代碼進行快速的調整,快到我在想什麼我的工具就能做什麼。這才是追求重構的境界。所以在這個意義上,幾乎Resharper為你提供了巨大的生產力。
Visual Studio 2005提供的重構包括了如下:
- 封裝欄位
- 提取方法
- 提取介面
- 提升局部變數
- 移除參數
- 重新命名
- 重新排列參數
這些方法在Resharper中全部都支援(但Resharper的重構遠不止這些),它們對應的變成了:
- 封裝欄位 —— Introduce Field
- 提取方法 —— Extract Method
- 提取介面 —— Extract Interface (另增加了Extract Superclass提取為基類)
- 提升局部變數 —— Introduce Variable
- 移除參數 —— 移到Change Signature(改變方法簽名)中
- 重新命名 —— Rename (Resharper會根據對象的類型名稱,提供你幾個可選的最合適的名稱)
- 重新排列參數 —— 移到Change Signature(改變方法簽名)中
我知道很多人都聲稱自己E文不好,但是,這確實都是很簡單的單詞,難不倒任何人的。這些重構的功能是人所共知的,下面就告訴大家一些Resharper特有的,首先,重構的快速鍵是Ctrl+Shift+R:
1、對於類,除了提取介面、基類,你還可以移動它到其他的命名空間和移動到別的檔案裡,這是一個實用的功能,也許你不信,但是我這真的有個人,把所有的business entity都寫在一個DataObject.cs裡面。你難以想象,我開啟它時嘴張了多大。
2、對於欄位,提供了:
- Safe Delete,會檢測所有使用到的地方,並詢問如何刪除;
- Pull Member Up和Push Member Down,可以把這個欄位在基類和繼承類中移動;
- Use base type where possible,儘可能的使用基類,由於ArcGIS平台是基於com組件的,很多時候我們需要的是IGeometry, IPointCollection這樣的介面所公開的屬性或者方法,於是你沒有必要儲存一個polygon對象,而可以使用基底類型;
- Encapsulate Field,封裝欄位,但是這個功能遠沒有另一個提供同樣功能的操作有用。我可以在後文中來講。
3、對於方法,提供了:
- 與欄位類似的功能,此外;
- Change Signature,更改函數簽名,包括更改名稱,傳回值類型,參數的各種資訊,添加和刪除參數,相當實用。如果你是在重寫方法上操作,會提示你是否到基類中更改。
- Make Static,如果Resharper檢測到這個方法並沒有與非靜態成員相關聯的話,往往會自動地提示你(以黃色橫杠的形式出現)可以改為static,如果你自作主張的對一些方法進行修改也無不妥,但後果自負。
- Extract class from parameter,如果你的參數有七個八個,那是否考慮用一個類來封裝這些參數呢,於是這個功能應運而生。
- Method to Property,顧名思義,如果還在使用GetField()或者SetField(..)的話,你一定是從非.net星來的。
4、在方法體內部:
Extract Method,不用介紹了吧。
Introduce Variable/Parameter/Field,取決於你游標所在的對象,可以提供轉化的功能。
Inline Variable:就是把:IPoint point = new PointClass();
point.PutCoords(_point.X, _point.Y);
變成這樣子:new PointClass().PutCoords(_point.X, _point.Y); //這是個糟糕的例子
5、重新命名:
為什麼重新命名值得挑出來講,因為Resharper提供了命名建議這一金子般的功能。於是,想改名為易讀性強的名字,不是那麼費腦子的事情了。Resharper會根據這個變數的類型,為你提供幾個備選名字,名字列表是列在游標位置上的(對方法重新命名會彈出對話方塊),你只需要用方向鍵選擇並敲斷行符號即可,這種名字多是將類型的名字首字母改為小寫得來的,甚至刨根到基類的類型名,你還可以在此基礎上加以改進。如果你還在用i,j這種晦澀的名稱,請迅速的把他們改為outIndex, pointCount之類可讀的名稱。
Resharper其實提供了更先進的功能,在你命名一個變數時,就有快速鍵為你提供備選名字,但是Ctrl+Space是我們寶貴的IME切換鍵,於是,我對變數名的敲定,往往是先起了一個較爛的,然後重新命名的。
還有一些更廣義上的,協助你對代碼進行調整的功能,我另寫一篇吧,不然太長了。