何时提炼函数 & 用查询取代临时变量
来源:互联网 发布:apache无法访问根目录 编辑:程序博客网 时间:2024/05/17 04:07
拥有[短函数」(short methods)的对象会活得比较好、比较长。不熟悉面向对象技术的人,常常觉得对象程序中只有无穷无尽的delegation(委托),根本没有进行任何计算。
我们遵循这样一条原则:每当感觉需要以注释来说明点什么的时候,我们就把需要说明的东西写进一个独立函数中,并以其用途(而非实现手法)命名。我们可以对一组或甚至短短一行代码做这件事。哪怕替换后的函数调用动作比函数自身还长,只要函数名称能够解释其用途,我们也该毫不犹豫地那么做。关键不在于函数的长度,而在于函数「做什么」和「如何做」之间的语义距离。
如何确定该提炼哪一段代码昵? 一个很好的技巧是:寻找注释。它们通常是指出「代码用途和实现手法间的语义距离」的信号。如果代码前方有一行注释,就是在提醒 你:可以将这段代码替换成一个函数,而且可以在注释的基础上给这个函数命名。就算只有一行代码,如果它需要以注释来说明,那也值得将它提炼到独立函数去。
以查询取代临时变量:
Replace Temp with Query往往是你运用Extract Method 之前必不可少的一个步骤。局部变量会使代码难以被提炼,所以你应该尽可能把它们替换为查询式。
方法步骤:
1:找出只被赋值一次的临时变量(如果某个临时变量被赋值超过一次,考虑用split temporary variable将它分割)
2:将临时变量声明为final。(确保变量只是被赋值一次)
3:编译。
4:将对该临时变量赋值的语句等号右侧部分提炼到一个独立函数中。(声明为private,确保这个函数不修改任何的对象内容)
5:在该临时变量身上实施用查询取代临时变量。
我们常常使用临时变量保存循环中的累加信息。在这种情况下,整个循环都可以被提为一个独立函数,这也使原本的函数可以少掉几行扰人的循环码。有时候,你可能会用单一循环累加好几个值,就像本书p.26的例子那样。这种情况下你应该针对每个累加值重复一遍循环,这样就可以将所有临时变量都替换为查询式(query)。
Example:
1: 原来代码
double getPrice() { int basePrice = _quantity * _itemPrice; double discountFactor; if (basePrice > 1000) discountFactor = 0.95; else discountFactor = 0.98; return basePrice * discountFactor; }
首先把临时变量声明为final,检查是否只是被赋值一次。
double getPrice() { final int basePrice = _quantity * _itemPrice; final double discountFactor; if (basePrice > 1000) discountFactor = 0.95; else discountFactor = 0.98; return basePrice * discountFactor; }
这样一来,如果有任何问题,编译器就会警告我
下面一步步来:
首先把basePrice右边的提取到一个函数,然后if里面的引用这个变量的点,改为调用这个函数:
double getPrice() { final int basePrice = basePrice(); final double discountFactor; if (basePrice() > 1000) discountFactor = 0.95; else discountFactor = 0.98; return basePrice * discountFactor; }
private int basePrice() { return _quantity * _itemPrice; }
最后的return语句是对于这个变量的最后一个引用点,所以把临时变量移除,然后改为调用方法:
double getPrice() { final double discountFactor; if (basePrice() > 1000) discountFactor = 0.95; else discountFactor = 0.98; return basePrice() * discountFactor; }
同理提炼discountFactor,最后函数变为:
double getPrice() { return basePrice() * discountFactor(); }
非常简练了了!!
- 何时提炼函数 & 用查询取代临时变量
- 以查询取代临时变量
- 重新组织函数--以查询取代临时变量(Replace Temp with Query)
- Replace Temp With Query(以查询取代临时变量)
- 6.4 Replace Temp with Query(以查询取代临时变量)
- 重构笔记——以查询取代临时变量
- Replace Temp with Query 以查询取代临时变量
- 重新组织你的函数之四 :Replace Temp with Query(以查询取代临时变量)
- 重构---重构手法-----以查询取代临时变量(Replace Temp with Query)
- 重构--Replace Temp with Query(以查询取代临时变量)(六)
- const形参,何时创建临时变量
- 重构方法进阶(十二):代码常用重构方法(临时变量内联化&以查询取代临时变量)
- 函数内部临时变量
- ORACLE临时表总结[好处,何时用]
- 提炼函数
- 将临时变量内联化 & 以查询代替临时变量
- 函数何时可以返回变量的引用
- 何时用内联函数?
- MFC多文档
- 快速排序中对指针地址所指向的值进行排序的代码
- PHP中的错误处理和日志函数
- struts2 拦截器 interceptor
- vxworks下怎样使驱动支持select机制
- 何时提炼函数 & 用查询取代临时变量
- android 耳机插入检测
- Android异步加载图像小结 (含线程池,缓存方法)
- VBA 查找特定值并选中整行
- PHP访问MySql数据库 中级篇 Smarty技术
- 设计模式--工厂设计(2)
- 解决spring mvc JSON 无限死循环
- 学习C#
- MEID 的构成