本次重构应该先后有 8项小工作 需要做:
一、分解函数,将超长函数分解为若干个小函数,然后在原函数中调用。(只分解一份,另一份先不要动)
二、新建一个类, 把分解后的小函数 及被分解的原函数 复制到该类中, 并将被分解的原函数的访问修饰符 修改为public。
三、处理新类,将新类中 访问不到的东西【因为代码是复制过来的,很有可能某些东西访问不到了】,借助类的全局变量或参数 处理掉。直到可以通过编译,即没有语法错误为止。
四、建立一个新类的对象,并调用其中的public方法,将原有方法替换掉【此时需要注意步骤三中访问不到的数据,酌情处理】。
五、注释掉不需要的代码。编译、调试。
完成步骤五后, 重构超长函数就基本完成了。
六、找出两份代码中 中间数据不一样的类型,然后用其公共“父类型”代替【例如:object】。
七、处理类型转化,注意防止类型转换失败,还有空指针。
八、处理第二份源码,需要从依次完成步骤 四、五、六、七。
像这样的重构,最关键的是类型处理 和 类型转化,应该选用最恰当的类型,object 并不是最好的选择。
重构 可以看作是一点一滴的复制修改代码,并伴随不断的编译调试,如果涉及到的逻辑有些复杂最好配合测试用例一起重构。
——————————————————————————————————————————————————————————
——————————————————————————————————————————————————————————分割线
上面说的是重构的大致步骤,现在开始说重构的几个细节。
一、分解超长函数时,分解局部变量的技巧 【代码特征,重复利用变量、一个变量将代表N种含义】
代码大致如下:
int index = 0; // 使用index... index = 15; // 使用index... index = -10; // 使用index...
此时可以以三次index的赋值为分解点,分别分解为 index1 index2 index3三个变量,然后使用对应变量。此时就可以轻松分解函数了。
二、寻找合适的 “父类型”
string 和 TextBox 有公共的父类型,是 TextBox, TextBox有Text属性、可以记录string。【呵呵,一个例子就能说明问题了】