重构是一种精神,证明你在致力于提供高效的、精炼的、健壮的代码,而不是凌乱的、晦涩的、漏洞百出的代码。
在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:就是把:
point.PutCoords(_point.X, _point.Y);
变成这样子:
5、重命名:
为什么重命名值得挑出来讲,因为Resharper提供了命名建议这一金子般的功能。于是,想改名为易读性强的名字,不是那么费脑子的事情了。 Resharper会根据这个变量的类型,为你提供几个备选名字,名字列表是列在光标位置上的(对方法重命名会弹出对话框),你只需要用方向键选择并敲回 车即可,这种名字多是将类型的名字首字母改为小写得来的,甚至刨根到基类的类型名,你还可以在此基础上加以改进。如果你还在用i,j这种晦涩的名称,请迅 速的把他们改为outIndex, pointCount之类可读的名称。
Resharper其实提供了更先进的功能,在你命名一个变量时,就有快捷键为你提供备选名字,但是Ctrl+Space是我们宝贵的输入法切换键,于是,我对变量名的敲定,往往是先起了一个较烂的,然后重命名的。