重构手法之重新组织函数

在重构的手法中,很大的一部分是对函数进行整理,使函数能够恰当地包装代码(让代码自己说话而不是写更多的注释)。重新组织函数的驱动力,往往都是由于函数过长。因为函数过长就以为着包含了更多属性和逻辑,这样复杂的逻辑和诸多属性(如函数内部的局部变量或者静态变量等)会让代码变得难以维护,需要对其进行重新组织。

提炼函数

在冗长的函数中提炼出精小的函数,让每个短小函数负责的功能简洁,并且让函数名解释函数的用途。这是因为:
+ 如果每个函数的粒度都很小,那么函数被复用的机会就越大,组合就越发灵活
+ 函数粒度越小,覆写的时候也会更加容易
总而言之:易于重用,易于维护

以查询取代临时变量

提炼函数中临时变量是一个让人头疼的问题,我们需要消除某些临时变量。对于那些用于保存求值结果的临时变量,我们可以利用一个方法来取代之。下面是一个例子:

double rate = _whatUsed / _total;
if (rate > 0)return true;
elsereturn false;

利用一个方法来消除double rate可以写成:

/*double rate(){return  _whatUsed / _total;}
*/
if (this->rate())return true;
elsereturn flase;

当我们利用一个查询来替换临时变量,那么在这个类中个的所有方法都可以获取该信息,而不是仅仅只有临时变量原本所在的函数才能获取该信息。这样在我们提取一个新的方法时即可不通过参数传递的方式就可以直接获取该信息。这是一个准则:如果有某种信息,需要在类中不止一个方法中使用,那么该信息应当属于类而不是属于某个函数,在后文中以函数对象替换函数的手法也是基于此原则的。

引入解释性变量

其实写代码的时候写注释只是一种补充手段,我们为了增加代码的可读性应该让代码自己说话而不是尽量多地去注释,过多的注释会在代码中带来背景干扰。引入解释性变量就是基于让代码自己说话的想法引入的。下面是一个例子:

if (plamtform.toUppercase().indexof("MAC") >  0 &&browser.toUppercase().indexof("IE") > 0){//...do something
}

引入解释变量之后如下:

auto isMAC = plamtform.toUppercase().indexof("MAC") > -1;
auto isIE = browser.toUppercase().indexof("IE") > -1;if (isMAC && isIE){//do something....
}

代码可读性大大提高。

分解临时变量

在代码中对一个临时变量进行多次赋值使用,则意味着一个临时变量拥有多重语意,这会在后期维护中带来疑惑,需要分解该临时变量。下面是一个例子:

auto temp =  (_hight + _width) * 2;
std::cout << temp << std::endl;
temp = _hight * _width;
std::cout << temp << std::endl;

分解变量之后:

auto perimeter =  (_hight + _width) * 2;
std::cout << perimeter << std::endl;
auto area = _hight * _width;
std::cout << area << std::endl;

以函数对象替换函数

在进行函数提炼的时候,如果被提炼的函数有许多临时变量,并且提炼出来的子函数会用到这些临时变量。这样可以将这些临时变量作为参数传递到子函数当中,但是如果用到的临时变量很多,那么函数的参数列表就会变得很长。于是我们可以使用函数对象来替换原来的函数。这样,原函数中的临时变量现在就可以变成类的一个属性,可以被所有的方法共享,于是提炼出来的子函数,就可以不依赖临时变量,提取子函数就会变得十分方便,因为不用考虑临时变量的问题。

重构手法之重新组织函数相关推荐

  1. 重构手法之重新组织数据【1】

    返回总目录 本小节目录 Replace Data Value with Object(以对象取代数据值) Change Value to Reference(将值对象改为引用对象) Change Re ...

  2. 重构-改善既有代码的设计:重新组织函数的九种方法(四)

    函数过长或者逻辑太混乱,重新组织和整理函数的代码,使之更合理进行封装. 1. Extract Method 提炼函数 提炼函数:(由复杂的函数提炼出独立的函数或者说大函数分解成由小函数组成) 你有一段 ...

  3. 重新组织函数--《重构》阅读笔记

    1)寻找引用点时,最好使用工具,然后再人工review.在看到这个问题的时候,我估计应该是很久之前了.现在用IDE.这个要方便很多. 2)重新组织函数的方法和目标. 其实目标很简单.就是消灭长函数. ...

  4. 重构手法——提炼函数、搬移函数、以多态取代条件表达式

    目录 我的心路历程 我的学习概括 Extract Method(提炼函数) 动机*--做法 动机--做法* Move Method(搬移函数) 动机*--做法 动机--做法* Replace Cond ...

  5. 《重构》-重新组织函数

    重构 重新组织函数 1.Extract Method(提炼函数) a. 原因如果有一个过长的函数或者需要一段注释才能让人理解用途的代码,那么就将这段代码放进一个独立函数中.b. 好处函数粒度小,被复用 ...

  6. 重构手法之简化函数调用【1】

    返回总目录 本小节目录 Rename Method(函数改名) Add Parameter(添加参数) Remove Parameter(移除参数) 1Rename Method(函数改名) 概要 函 ...

  7. 重构改善既有代码设计--重构手法19:Replace Data Value with Object (以对象取代数据值)...

    你有一笔数据项(data item),需要额外的数据和行为. 将这笔数据项变成一个对象. class Order... private string customer; ==> class Or ...

  8. 重构函数调用-Parameterize Method令函数携带参数五

    重构函数调用-Parameterize Method令函数携带参数五 1.令函数携带参数 1.1.使用场景 若干函数做了类似的工作,但在函数本体中却包含了不同的值.建立单一函数,以参数表达那些不同的值 ...

  9. 重构手法(一)之重新组织函数

    1.Extract Method(提炼函数) 重构前: void printOwing(double amount){printBanner();//print details System.out. ...

最新文章

  1. 超 31% 生成文本涉暴力色情,GPT-3 模型在 AI Dungeon 游戏里疯狂「飙车」!
  2. 网页设计必备工具 firefox Web Developer插件 CSS工具组教程
  3. _variant_t和_bstr_t
  4. hadoop之 Hadoop1.x和Hadoop2.x构成对比
  5. 企业版Java EE正式易主 甲骨文再次放手
  6. e_msg_c_gs_enter_gs_req
  7. 【经验心得】固定布局做到各手机屏幕适配简单粗暴的方法
  8. 合成未来宝宝照片_父母照片重叠是宝宝长相?关晓彤鹿晗颜值逆天,邓超孙俪……...
  9. 关于深度学习caffe for Windows编译入门
  10. JAVA环境变量配置步骤及测试(JDK的下载、安装和环境配置教程)
  11. 牛顿插值法,泰勒公式
  12. sql server数据库错误数据恢复(数据库连接失效,无法附加查询)
  13. [2021.10.30][uml]UML顺序图规范
  14. AMT控制器——基于simulink的AMT自动变速汽车换档智能控制
  15. STL教程:C++ STL快速入门
  16. Win11怎么开启任务管理器 Win11任务管理器开启方法
  17. 穷人冲冲冲:7个有钱人买,穷人不买的东西
  18. 《剑指offer—面试篇》-python面试经典100题(上)
  19. Excel 多个数和为定数的随机数生成方式
  20. 基于Springboot和mybatis在线考试系统的设计与实现

热门文章

  1. 校园网可以登录其他网站和应用,却无法登录校内网站的问题的解决方法
  2. adb命令——adb shell top命令
  3. Flutter,SharedPreferences的同步处理,如Android原生般的
  4. MUI-list(列表),普通列表、带箭头列表、带数字角标列表、带图文列表
  5. 法规标准-GB/T 39263标准解读(2020版)
  6. 在安化云台山,遇见最美的风景
  7. html点击添加购物车的,如何根据给定的html点击添加到购物车按钮?
  8. PHP打印调用堆栈信息,用于程序调试
  9. UE4编译grpc,编译打包
  10. 带保护装置的水塔自动进水装置