重构36计(7-12)
来源:互联网 发布:重复数据阴影 编辑:程序博客网 时间:2024/05/17 01:07
第七计:串联函数调用
当一个类的大部分函数被较为频繁地调用,并且包含连续性地调用,那么可以考虑为这个类中那些没有返回值的函数增加返回值,即返回对象本身,这样就可以串联函数调用,使用起来较为方便,举个例子:
// 表示用户的类public class User{ public void setName(String name); public void setAge(int age); public void setPhoneNumber(int phoneNumber);}
下面是不使用串联函数调用的情况:
User user = new User();user.setName("West_Link");user.setAge(3);user.setPhoneNumber(122333);
下面是使用串联函数调用的情况:
User user = new User().setName("West_Link").setAge(3).setPhoneNumber(123333);
只需要为那些函数增加一个User对象的返回值即可,如下:
public User setName(String name){ this.name = name; return this;}
第八计:临时变量在用到时才声明
很多人喜欢在函数的开头把所有要用到的临时变量都声明了,我认为这种方式有以下几个缺点:
1、不利于代码的阅读,需要经常在变量的使用处和变量的声明处跳转,不方便。
2、容易造成资源的浪费,因为有些对象的初始化是比较耗费资源的,而函数可能在用到该对象之前返回。
3、不利于函数的拆分。
所以,我们应该尽可能降低临时变量的作用域,那样它能“捣乱“的范围就被缩至最小了。
第九计:保持类的公有函数粒度最小化
一个类的公有函数不应该过多,那样会使类变得臃肿、不易使用,我认为最佳状态是绝大部分公有函数不能被拆分,也就是说,不存在那些通过其他公有函数也能达到目的的函数,例如下面的类:
public class StringArray{ // 获取数组的大小 public int getSize(); // 判断数组是否为空 public boolean isEmpty(); // 将数据添加到数组的某个索引 public void add(String value,int index); // 将数据添加到数组的末尾 public void addToLast(String value); // 将数据添加到数组的起始位置 public void addToFirst(String value);}
StringArray其实只需要两个公有函数即可,即getSize和add,因为isEmpty可以通过getSize来达到相同的目的:getSize() == 0。类似地,addToLast、addToFirst也可以通过add来实现。不过,如果类的公有函数比较少,而且类似isEmpty类似的需求经常被用到,那么保留这些公有函数还是值得的。
第十计:将可访问性降至最低
面向对象中的封装性使得我们可以隐藏类或者接口的实现细节,所以,为了让程序更易维护、接口或者类的使用更加简单,我们应该尽可能降低成员变量或者成员函数的可访问性,辅助函数一定要声明为私有的,确保只将接口函数声明为公有的,如果该辅助函数可能会被子类用到,则可以声明为保护的。辅助类也应声明为私有的,对于成员变量则一定要声明为私有的,只提供必要的set或者get函数。总之,当我们增加新的类、成员变量、成员函数时,一定要合理地设置可访问性,暴露给外界的越少越好。
第十一计:合并条件减少嵌套
条件判定如果嵌套的太多会大大降低程序的可读性,很容易滋生Bug,例如:
if(a){ if(b || c){ if(d){ ... } }}
可以合并成:
if(a && (b || c) && d){ ...}
第十二计:循环中早用continue减少条件嵌套
除了通过合并条件来减少嵌套层次外,在for或者while循环中,可以用continue来减少条件嵌套,例如:
for(int i=0; i<100;i++){ if(a){ if(b){ if(c){ ... } } }}
这段代码的嵌套深度是4,使用continue可以大大减少嵌套层次:
for(int i=0; i<100;i++){ if(!a) continue; if(!b) continue; if(!c) continue; ...}
- 重构36计(7-12)
- 重构36计
- 重构36计
- 重构36计(31-36)
- 重构36计(1-6)
- 重构36计(13-18)
- 重构36计(19-24)
- 重构36计(25-30)
- 重构36计(1)
- 重构36计(2)
- 重构36计(3)
- 重构36计(4)
- 重构36计(5)
- 重构36计(6)
- 重构36计摘抄
- 36计
- 高等数学:第九章 重积分(1)二重积分的概念、计算法和应用
- DataGridView 编程36计(一)
- 关于css3 分栏 column属性
- 水晶报表中图表形式显示CSV数据
- WPF:图像处理(二)灰度化
- 04---servlet01(servlet简介)
- oauth node.js 包
- 重构36计(7-12)
- apache 基本vhost配置
- String Operators 字符串 oracle/mssql 对比
- WPF:图像处理(三)二值化
- 重构36计(13-18)
- LoadRunner
- WPF:图像处理(四)大津法
- 04---servlet02(第一个servlet)
- WPF:图像处理(五)迭代法