优雅编程之这样简化函数,你就“正常”了(二十四)
2016-09-27 21:31
323 查看
开心一笑
【甲:我用什么词都会造句。乙:那么你用“希望”找一个句子。
甲:我不会用希望造句。
乙:你怎么又不会了呢?
甲:我照的就是:“我不会用希望造句”。】
视频教程
大家好,我录制的视频《Java之优雅编程之道》已经在CSDN学院发布了,有兴趣的同学可以购买观看,相信大家一定会收获到很多知识的。谢谢大家的支持……视频地址:http://edu.csdn.net/lecturer/994
提出问题
项目开发中如何简化函数调用???解决问题
以下来自《重构》的简单总结:
Rename Method(函数改名)
函数的名称皆是函数的用途。一个好的函数名称可以体现一个程序员的水平和素养。Add Parameter(添加参数)
某个函数需要从调用端得到更多信息。为此函数添加一个对象参数。让该对象带进函数所需信息。请记住,在之前的文章中有提到,如果一个函数的参数超过3个,那么这个函数就需要重构
Remove Parameter(移除参数)
函数本体不再需要这个参数,将该参数去除。(将多余参数删除,不要留下坏味道)Separate Query from Modifier(将查询函数和修改函数分离)
某个函数既返回对象状态值,又修改对象状态。建立两个不同的函数,其中一个负责查询,另一个负责修改。Parameterize Method(令函数携带参数)
若干函数做了类似的工作,但在函数主体中却包含了不同的值,建立单一函数,以参数表达那些不同的值重构前:
class Employee{ void tenPercentRaise(){ salary *= 1.1; } void fivePercentRaise(){ salary *= 1.05; } }
重构后:
void raise(double factor){ salary *= (1 + factor) }
Replace Parameter with Explicit Methods(以明确函数取代参数)
你有一个函数,其中完全取决于参数值而采取不同行为。针对该参数的每一个可能值,建立一个独立函数。Preserve Whole Object(保存对象完整)
你从某个对象中取出若干值,将它们作为某一次函数调用时的参数。改为传递整个对象。重构前:
int low = daysTempRange().getLow(); int high = daysTempRange().getHigh(); withinPlan = plan.withinRange(low,high)
重构后:
withinPlan = plan.withinRange(daysTempRange())
Replace Parameter with Methods(以函数取代参数)
对象调用某个函数,并将所得结果作为参数,传递给另一个函数,而接受该参数的函数本身也能够调用前一个函数。让参数接受者去除该线参数,并直接调用前一个函数。重构前
int basePrice = _quantity * _itemPrice; discountLevel = getDiscountLevel(); double finalPrice = discountedPrice(basePrice,discountLevel);
重构后:
int basePrice = _quantity * _itemPrice; double finalPrice = discountedPrice(basePrice);
Introduce Parameter Object(引入参数对象)
某些参数总是很自然地同时出现,以一个对象取代这些参数。代码用一对值来表示一个范围。例如表示日期范围的开始和结束,表示数值范围的upper和lower等等。
Remove Setting Method(移除设置函数)
类中的某个字段应该在对象创建时被设置,然后就不再改变。Hide Method(隐藏函数)
有一个函数,从来没有被其他任何类用到,将这个函数修改为privateReplace Contructor with Factory Method(以工厂函数取代构造函数)
你希望在创建对象时不仅仅是做简单的,建构动作,将构建函数替换为工厂函数。Encapsulate Downcast(封装向下转型)
某个函数返回的对象,需要由函数调用者执行向下转型,将向下转型动作移到函数中。Replace Error Code With Exception(以异常取代错误码)
某个函数返回一个特定的代码,用以表示某种错误情况。改用异常。Replace Exception with Test(以测试取代异常)
面对一个调用者可以预先检查的条件,你抛出了一个异常。修改调用者,使它在调用函数之前先做检查。重构前:
double getValueForPeriod(int periodNumber){ try{ _values(periodNumber); }catch(ArrayIndexOutOfBoundsException e){ return 0; } }
重构后:
double getValueForPeriod(int periodNumber){
//在这里提前检查条件,而不是滥用异常
if(periodNumber >= _values.length) return 0
return _values(periodNumber);
}
不是一种意料外的事件,并不应该抛异常
读书感悟
来自史铁生《病隙碎笔》人有一种坏习惯,记得住倒霉,记不住走运,这实在有失厚道。
生命就是这样一个过程,一个不断超越自身局限的过程,这就是命运,任何人都是一样,在这过程中我们遭遇痛苦、超越局限、从而感受幸福。所以一切人都是平等的,我们毫不特殊。
人可以走向天堂,不可以走到天堂。走向,意味彼岸的成立。走到,岂非彼岸的消失?彼岸的消失即信仰的终结、拯救的放弃。因而天堂不是一处空间,不是一种物质性存在,而是道路,是精神的恒途。
彻底的圆满只不过是彻底的无路可走。
相信爱才是人类唯一的救助。 这爱,不单是友善、慈悲、助人为乐,它根本是你自己的福。 这爱,非居高的施舍,乃谦恭地仰望,接受苦难,从而走向精神的超越。
其他
如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎转载,点赞,顶,欢迎留下宝贵的意见,多谢支持!相关文章推荐
- Python输入和输出
- 优雅编程之这样简化表达式,你就“正常”了(二十三)
- 02.Spring Ioc 容器 - 创建
- Struts2与OGNL表达式
- 使用Spring注解注入属性
- SpringAOP使用入门,如何对自定义的注解进行切面编程
- Cause: java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
- Ubuntu怎么查看github安装目录
- matlab里textread出现错误“Trouble reading floating point number from file (row 1, field 1)”
- java.lang.Class.getDeclaredMethod()方法
- PAT 乙级 1058 选择题(20) Java版
- java集合框架之List------03_01
- creating Flash programming algorithm
- python爬虫
- install matlab iso on ubuntu
- ## java实现的二叉树 ##
- Qt5.7中使用MySQL Driver good
- JAVA设计模式之【抽象工厂模式】
- Leetcode 136. single number
- C#与Emgu 从当前窗口打开另一个窗口 并在其窗口打开图片