技术开发 频道

.Net 2.0 新功能:重构(Refactoring)

当你编写了一个代码很长的方法,它包含一些非常复杂的算法集合。在完成该方法以后,你可能意识到它变得太大和太复杂了,以至于其它小组成员无法容易地理解它。因此,你决定把它拆分成多个小函数。这不仅会简化你的代码而且还能够改进其易读和可维护性。"重构"菜单下的 "提取方法"选项正是适合这一工作。
假设方法为
public void TestMethod() { string s = ""; } (1) 用选中 string s = ""; 然后点击"提取方法"菜单选项。立即出现"提取方法"对话框。 (2) 按“确定”,结果如下: public void TestMethod() { NewMethod(); } private static void NewMethod() { string s = ""; }

 

重构为我们完成了两件事情:

· 它根据你的每一次选择创建一个新的方法并且替换其中的所有选择的代码。

· 它用一个到这个新创建方法的调用来替换选择的行。

【2】• 重命名

<1>. 提供了一种重命名代码符号(如字段、局部变量、方法、命名空间、属性和类型)标识符的简单方法.

<2>. “重命名”功能除了可用来更改标识符的声明和调用以外,还可用来更改注释中和字符串中的名称.

• 在何处可以使用重命名操作?

<1>. 代码编辑器

<2>. 类视图

<3>. 对象浏览器

<4>. Windows 窗体设计器的“属性网格”

<5>. 解决方案资源管理器



• 重命名执行些什么操作?

<1>. 字段

• 将字段的声明和用法更改为新名称。

<2>. 局部变量

• 将变量的声明和用法更改为新名称。

<3>. 方法

• 将方法的名称以及对该方法的所有引用更改为新名称。

<4>. 命名空间

• 将声明、所有正在使用的语句及完全限定名称中的命名空间名称更改为新名称。

<5>. 属性

• 将属性的声明和用法更改为新名称。

<6>. 类型

• 将类型的所有声明和所有用法都更改为新名称,包括构造函数和析构函数。对于部分类型,重命名操作将传播到其所有部分。

• 实例

假设我们需要“NewMethod”重命名为“NewMethod2”。

选中 “NewMethod” 然后点击"重命名"菜单选项。立即出现"重命名"对话框。



结果:

public void TestMethod() { NewMethod2(); } private static void NewMethod2() { string s = ""; }

 
【3】• 封装字段

<1>. 可以从现有字段快速创建属性,然后使用对新属性的引用无缝更新代码.

<2>. 当某个字段为public(C# 参考)时,其他对象可以直接访问该字段并对其进行修改,而不会被拥有该字段的对象检测到。通过使用属性(C# 编程指南)封装该字段,可以禁止对字段的直接访问。

<3>. 仅当将光标与字段声明置于同一行时,才可以执行“封装字段”操作。

• 实例

大部分开发者都习惯把类级的变量(字段)暴露给外界。由于每一个对象都属于面向对象编程,所以开发者应该允许通过属性或方法来存取变量。这种情况可以使用重构菜单下的"封装字段"选项来进行处理。

为此,选择你想包装在一个属性中的类级变量并且选择"封装字段"选项。这将打开一个如下图所示的对话框:


你需要输入该属性的名字并且决定是否你想从类外或类内部更新到该变量的参考。就象"重命名"对话框一样,你可以在应用之前先预览一下所作的改变。

原代码:

string s; 封装后代码: string s; public string S { get { return s; } set { s = value; } }

 
【4】• 提取接口

<1>. 使用来自现有类、结构或接口的成员创建新接口的简单方法.

<2>. 当几个客户端使用类、结构或接口中成员的同一子集时,或者当多个类、结构或接口具有通用的成员子集时,在接口中嵌入成员子集将很有用.

<3>. 仅当将光标定位于包含要提取成员的类、结构或接口中时,才可以访问此功能。当光标处于此位置时,调用“提取接口”重构操作.

【5】• 将局部变量提升为参数

<1>. 提供一种简单的方法,以在正确更新调用站点的同时将变量从局部使用移动至方法、索引器或构造函数参数.

<2>. 调用“将局部变量提升为参数”操作时,变量将被添加到成员参数列表的结尾处.

<3>. 对已修改成员的所有调用都将使用新参数(将替代最初赋给该变量的表达式)立即进行更新,并保留代码,以使其像变量提升之前那样正常工作.

<4>. 将常数值赋值给提升的变量时,此重构操作效果优秀。必须声明并初始化该变量,而不能仅声明或仅赋值.

• 实例

原代码:

private static void NewMethod2() { string s = ""; } 选中s,转换后 private static void NewMethod2(string s) { } 【6• 移除参数 <1>. 从方法、索引器或委托中移除参数的简单方法. <2>. 在调用成员的任何位置,都会将参数移除以反映新声明. • 实例 原代码 protected void Page_Load(EventArgs e, object sender) { int i = 0; NewMethod2("1","2"); } private static void NewMethod2(string s1, string s2) { string s = s1 + s2; } 移除后的代码 protected void Page_Load(EventArgs e, object sender) { int i = 0; NewMethod2(); } private static void NewMethod2() { string s = s1 + s2; }

 

【7】• 重新排列参数

<1>. 对方法、索引器和委托的参数顺序进行更改的简单方法.

<2>. 可以通过方法声明或方法调用来重新排列参数。要将光标置于方法声明或委托声明中,而不是置于正文中。

• 实例

private static void NewMethod2(string s1,string s2) { } 重新排列后 private static void NewMethod2(string s2,string s1) { }

原文地址

0
相关文章