改变函数声明:如下所示:
1.动机:一个好的函数名字能够一眼看出该函数的用途,而不必查看其实现代码。一个好的参数列表能够改变连接一个模块所需要的条件,从而去除不必要的耦合。
2.简单做法:如下所示:
1>.如果想要移除一个参数,需要先确定函数体内没有使用该参数。
2>.修改函数声明,使其成为你期望的状态。
3>.找出所有使用旧的函数声明的地方,将它们改为使用新的函数声明。
4>.测试。
3.迁移式做法:如下所示:
1>.如果有必要的话,先对函数体内部加以重构,使后面的提炼步骤易于开展。
2>.使用提炼函数重构手法将函数体提炼成一个新函数。
3>.如果提炼出的函数需要新增参数,用简单做法添加即可。
4>.测试。
5>.对旧函数使用内联函数重构手法。
6>.如果新函数使用了临时的名字,再次使用改变函数声明重构手法将其改回原来的名字。
7>.测试。
4.范例:如下所示:
1>.源代码如下所示:
function circum(radius) {
return 2 * Math.PI * radius;
}
2>.重构代码如下所示:
function circumference(radius) {
return 2 * Math.PI * radius;
}
封装变量:如下所示:
1.动机:对于所有可变的数据,只要它的作用域超出单个函数,就要将它封装起来。封装能提供一个清晰的观测点,可以由此监控数据的变化和使用情况,也可以轻松的添加数据被修改时的验证或后续逻辑。
2.做法:如下所示:
1>.创建封装函数,在其中访问和更新变量值。
2>.执行静态检查。
3>.逐一修改使用该变量的代码,将其改为调用合适的封装函数。每次替换之后,执行测试。
4>.限制变量的可见性。
5>.测试。
6>.如果变量的值是一个记录,考虑使用封装记录重构手法。
3.范例:如下所示:
1>.源代码如下所示:
let defaultOwner = {firstName:"Martin", lastName:"Fowler"};
spaceship.owner = defaultOwner;
defaultOwner = {firstName:"Kent", lastName:"Beck"};
2>.重构代码如下所示:
defaultOwner = {firstName:"Martin", lastName:"Fowler"};
function getDefaultOwner() {
return defaultOwner;
}
function setDefaultOwner(arg) {
defaultOwner = arg;
}
spaceship.owner = getDefaultOwner();
setDefaultOwner({firstName:"Kent", lastName:"Beck"});