有意义的命名
1.名副其实
一旦发现更好的名称,就换掉旧的。变量、函数或类的名称应该已经答复了所有的大问题。它该告诉你,它为什么会存在,它做什么事,应该怎么用。如果名称需要注释来补充,那就不算是名副其实。
2.避免误导
3.做有意义的区分
废话都是冗余。variable一词永远不应当出现在变量名中。NameString会比Name好吗?
要区分名称,就以读者能鉴别不同之处的方式来区分。
4.使用读的出来的名称
例如,modificationTimestamp要优于modymdhms.
5.使用可搜索的名称
单字母名称和数字难以搜索。窃以为单字母名称仅用于短方法中的本地变量。若变量或常量可能在代码中多处使用,则应赋予其便于搜索的名称。
6.避免使用编码
把类型或作用域编进名称里面,徒然增加了解码的负担。
例如IShapeFactory、m_dsc...
7.避免思维映射
明确是王道。善用其能,编写其他人能理解的代码。
8.类名
名词或名词短语,不应当是动词。
9.方法名
动词或动词短语。
10.别扮可爱
宁可明确,勿为好玩。言到意到,意到言到。
11.每个概念对应一个词
给每个抽象概念选一个词,并且一以贯之。
12.别用双关语
避免将同一单词用于不同目的。代码作者应尽力写出易于理解的代码。
13.使用解决方案领域名称
尽量减少依据所涉领域来命名。程序员要做太多技术性工作。给这些事取个技术性的名称通常是最靠谱的做法。
14.使用所涉问题领域的名称
如果不能用程序员熟悉的术语来给手头的工作命名,就采用所涉及问题领域而来的名称。
优秀的程序员和设计师,其工作之一就是分离解决方案领域和问题领域的概念。
15.添加有意义的语境
用良好命名的类、函数或者名称空间来放置名称,给读者提供语境。如果没这么做,给名称添加前缀就是最后一招了。
16.不要添加没用的语境
17.最后的话
取好名的最难之处在于需要良好的描述技巧和共有文化背景
函数
函数是所有程序中的第一组代码。
1.短小
函数的第一规则是要短小。
2.只做一件事
函数应该做一件事。做好这件事。只做这一件事。
如果函数只是做了该函数名下同一抽象层上的步骤,则函数还是只做了一件事。编写函数毕竟是为了把大一些的概念(换言之,函数的名称)拆分为另一抽象层上的一系列步骤。
3.每个函数一个抽象层级
函数中混杂不同抽象层级,往往让人迷惑。
自顶向下读代码:向下规则。程序就像段落,每一段都描述当前抽象层级,并引用位于下一抽象层级的后续段落。
4.switch语句
确保每个switch都埋藏在较低的抽象层次,而且永远不重复,在系统其他部分看不到。
5.使用描述性的名称
函数越短小,功能越集中,就越便于取个好名字。
长而具有描述性的名称。
如果每个例程都让你感到深合己意,那就是整洁代码。
6.函数参数
参数尽可能少。参数和函数名处在不同的抽象层级,它要求你了解目前并不特别重要的细节。
- 输入参数过多,难以测试。
- 不太期望信息通过输出参数输出。
- 避免使用标志参数(boolean),表明该函数不止做一件事。
- 尽量使用一些机制将二元函数转换成一元函数。
- 两个以上的参数考虑封装成类,不是在作弊,封装性和某个概念的考虑。
- 动词与关键词,要较好解释函数的意图,以及参数的顺序和意图。
7.无副作用
实际还是保持函数只做一件事。有时具有隐藏的破坏性,对类中的变量做出未能预期的改动,导致古怪的时序性耦合及顺序依赖等等。
普遍而言,应避免使用输出参数。如果函数必须要修改某种状态,就修改所属对象的状态。
8.分隔开指令与询问
函数要么做什么事,要么回答什么事,二者不可兼得,避免混淆。
9.使用异常替代返回错误码
使得错误处理代码从主路径代码中分离出来,得到简化。
最好把try和catch代码块的主体部分抽离出来,另外形成函数。(错误处理就是一件事,函数应该只做一件事)
避免依赖磁铁。
10.别重复自己
重复可能是软件中一切邪恶的根源。许多原则与实践规则都是为控制与消除重复而创建。
11.结构化编程
每个函数、函数中的每个代码块都应该有一个入口、一个出口(结构化编程规范)。只要函数保持短小,偶尔出现的return、break等没有坏处。
小结
编程艺术是且一直就是语言设计的艺术,函数是语言的动词,类是名词。永远别忘记,真正的目标在于讲述系统的故事,而你编写的函数必须干净利落的拼装在一起,形成一种精确而清晰的语言,帮助你讲故事。