重构API
模块和函数是软件的骨肉,而API则是将骨肉连接起来的关节;好的API会把更新数据的函数与只是读取数据的函数清晰分开。
1. 将查询函数和修改函数分离:遇到一个“既有返回值又有副作用”的函数,需试着将查询动作从修改动作中分离出来;
2. 函数参数化:如果我发现两个函数逻辑非常相似,只有一些字面量值不同,可以将其合并成一个函数,以参数的形式传入不同的值,从而消除重复;
3. 移除标记参数:标记参数却隐藏了函数 调用中存在的差异性,使用这样的函数,我还得弄清标记参数有哪些可用的值,明确用一个函数来完成一项单独的任 务,其含义会清晰得多;
4. 保持对象完整:代码从一个记录结构中导出几个值,然后又把这几个值一起传递给一个函数,更应该把整个记录传
给这个函数,能更好地应对变化,如果将来被调的函数需要从记录中导出更多的数据,就不用为此修改参数列表;
5. 以查询取代参数:如果可以从一个参数推导出另一个参数,那么几乎没有任何理由要同时传递这两个参数;
6. 以参数取代查询:引用一个全局变量,或者引用另一个想要移除的元素,需要将其替换为函数参数,从而将处理引用关系的责任转交给函数的调用者;这样做是为了让目标函数不再依赖于某个元素,我把这个元 素的值以参数形式传递给该函数;
7. 移除设值函数:为某个字段提供了设值函数,这就暗示这个字段可以被改变,如果不希望在对象创建之后此字段还有机会被改 变,那就不要为它提供设值函数;
8. 以工厂函数取代构造函数:需要新建一个对象时,客户端通常会调用构造函数,构造函数需要通过特殊的操作符(new)来调用,在要求普通函数的场 合就难以使用;
9. 以命令取代函数:与普通的函数相比,命令对象还可以支持附加的操作,过命令对象提供的方法来设值命令的参数值,从而支持更丰富的生命周期管理能力;
模块和函数是软件的骨肉,而API则是将骨肉连接起来的关节;好的API会把更新数据的函数与只是读取数据的函数清晰分开。
1. 将查询函数和修改函数分离:遇到一个“既有返回值又有副作用”的函数,需试着将查询动作从修改动作中分离出来;
2. 函数参数化:如果我发现两个函数逻辑非常相似,只有一些字面量值不同,可以将其合并成一个函数,以参数的形式传入不同的值,从而消除重复;
3. 移除标记参数:标记参数却隐藏了函数 调用中存在的差异性,使用这样的函数,我还得弄清标记参数有哪些可用的值,明确用一个函数来完成一项单独的任 务,其含义会清晰得多;
4. 保持对象完整:代码从一个记录结构中导出几个值,然后又把这几个值一起传递给一个函数,更应该把整个记录传
给这个函数,能更好地应对变化,如果将来被调的函数需要从记录中导出更多的数据,就不用为此修改参数列表;
5. 以查询取代参数:如果可以从一个参数推导出另一个参数,那么几乎没有任何理由要同时传递这两个参数;
6. 以参数取代查询:引用一个全局变量,或者引用另一个想要移除的元素,需要将其替换为函数参数,从而将处理引用关系的责任转交给函数的调用者;这样做是为了让目标函数不再依赖于某个元素,我把这个元 素的值以参数形式传递给该函数;
7. 移除设值函数:为某个字段提供了设值函数,这就暗示这个字段可以被改变,如果不希望在对象创建之后此字段还有机会被改 变,那就不要为它提供设值函数;
8. 以工厂函数取代构造函数:需要新建一个对象时,客户端通常会调用构造函数,构造函数需要通过特殊的操作符(new)来调用,在要求普通函数的场 合就难以使用;
9. 以命令取代函数:与普通的函数相比,命令对象还可以支持附加的操作,过命令对象提供的方法来设值命令的参数值,从而支持更丰富的生命周期管理能力;