短小
函数的第一规则是要短小;第二条规则则是还要更短小。
函数应该20行封顶。
- 代码块和缩进
if语句、else语句、while语句等,其中的代码块应该只有一行,该行大致是一个函数调用语句。这样不仅能保持函数短小,而且因为块内调用的函数拥有较具说明性的名称,从而增加了文档的价值。 - 只做一件事
函数应该做一件事。做好这件事。只做这一件事。
判断函数是否做了不止一件事的一个方法就是能否再拆出一个函数,这个函数不是单纯的重新诠释其实现。
只做一件事的函数无法被合理地切分为多个区段。 - 每个函数一个抽象层级
要确保函数只做一件事,函数中的语句都在同一抽象层级上。
自顶向下读代码:向下规则
我们想让代码拥有自顶向下的阅读顺序。我们想让每个函数后面都跟着位于下一抽象层级的函数,这样一来,在查看函数列表是,就能循抽象层级向下阅读。我们把这叫做向下规则。
换一种说法我们想要这样读程序:程序就像是一系列TO起头的段落,每一段都描述当前抽象层级,并引用位于下一抽象层级的后续TO起头段落。
- switch语句
对于switch语句,如果只出现一次,用于创建多态对象,并且隐藏在某个继承关系中,在系统其他部分看不见,就还能容忍。
使用描述性的名称
选择描述性的名称能理清关于模块的设计思路,有助于改进。
命名方式要保持一致。使用与模块名一脉相承的短语、名词和动词给函数命名。
函数参数
零参数函数 优于 单参数函数 优于 双参数函数;因尽量避免三参数以上的函数。
输出参数比输入参数要难以理解。我们惯于认为信息通过参数传入函数,通过返回值从函数输出。我们不太期望信息通过参数输出。
-
一元函数
向函数传入单个参数有两种极普遍的理由。- 问关于那个参数的问题
- 操作参数
还有一种不那么普遍但仍极有用的单参数函数形式,那就是事件。在这种形式中,有输入参数无输出参数。
所以我们在命名时要注意名称的区别,让读者能轻易分辨是哪种类型。 -
参数对象
如果函数看起来需要二个、三个和三个以上参数,就说明其中一些参数应该封装成类。 -
动词与关键词
给函数起个好名字,能更好的解释函数的意图,以及参数的顺序和意图。对于一元函数,函数和参数应当形成一种非常良好的动词/名词对形式。
其他
- 分隔指令与询问
函数要么做什么事,要么回答什么事,但二者不可兼得。函数应该修改某对象的状态,或者返回对象的有关信息。 - 使用异常代替返回错误码
- 抽离try/Catch代码块
- 错误处理就是一件事
- 别重复自己
- 结构化编程
每个函数、函数中的每个代码块都应该有一个入口、一个出口。这意味着每个函数中只该有一个return,不能有break或continue语句,而且永永远远不能用有goto语句。
但是只要函数保持短小,偶尔出现的return、break或continue语句没有坏处。但是goto在小函数中应该尽量避免使用。
网友评论