《代码整洁之道》笔记——第三章:函数

1、函数应该做一件事。做好这件事。只做一件事。错误处理也是一件事(要判断函数是否不止做了一件事,有一个方法,就是看是否能再拆出一个函数,该函数不仅只是单纯地重新诠释其实现)。

2、函数参数应该尽量少,设身处地去想你愿意看多参数的函数还是少参数的函数,少参数的函数你甚至只需要看名称便知道函数的功能,但是如果有参数,甚至多个参数,你便需要花时间去看看每个参数在函数中的作用,不赋值会怎样等等。最好的情况是无参数函数,如果没有足够好的理由,不要使用3个及以上的参数。再者,如果函数需要测试,那么多参数的函数的测试会非常麻烦。

3、尽量只使用返回值,少用输出参数(类似c#中用的out以及ref获取函数中处理之后的结果)。

4、不要使用标识参数,这在绝大部分情况下说明你这函数不知做一件事,而是当xx为true时做这件事,当xx为false时做那件事。

5、当某些参数需要被一起传递的时候,往往就是该有自己名称的某个概念的一部分,可以将这些参数封装成类以减少函数参数的个数。如:Circle makeCircle(double x, double y, double radius);中x和y可以封装成Point,变成Circle makeCircle(Point center, double radius);。

6、遇到可变参数可将可变参数封装成一个列表,除这个列表外只留格式化参数 Or/And 可变参数列表中的参数数量,所以这种函数通常只有3个及以下的参数,超过3个可能就是有错误了。

7、把函数的指令功能和查询功能分离开来。

8、用异常处理代替从函数中返回错误码。因为错误码本身就违背了指令和查询功能分离的原则。使用异常处理还有一个比错误码更好的地方就是易于扩展,错误码通常被枚举类定义并被很多地方导入使用,所以一旦修改这个错误码类就会有很多地方需要重新构建部署,但是使用异常处理的话新异常类只需要从异常类中派生出来即可。Try/catch代码块丑陋不堪。它们搞乱了代码结构,把错误处理与正常流程混为一谈。最好把try和catch代码块的主体部分抽离出来,另外形成函数。

9、消除代码中的重复部分,可以将重复部分分离出来单独做一个函数。

10、大函数保持结构化编程(结构化编程:每个函数,函数中的每个代码块都应该只有一个入口、一个出口。意味着在每个函数中只该有一个return语句,循环中不能有break或continue语句,而且永永远远不能有任何goto语句。),只要函数足够短小,偶尔出现的return、break、continue语句并没有坏处,,甚至还比单入单出原则更具有表达力。


如何写出符合上述规则的函数?

并不需要一开始就按着规则写函数,这很少有人能做到,一开始可以先想到什么就写什么,然后你可以再按照上述规则推敲你写的代码,哪些地方可以缩短,哪些代码可以分离出来,哪些代码是重复的,逐步处理,最后再得到符合上述规则的函数。

猜你喜欢

转载自www.cnblogs.com/winsons/p/12354207.html