代码整洁之道
1. 什么是整洁代码
代码逻辑应直接了当,叫缺陷难以隐藏; 尽量减少依赖关系,使之便于维护;依据某种分层战略完善错误处理代码;性能调至最优,省得引诱别人做没规矩的优化。
它应当有单元测试和验收测试。它使用有意义的命名; 它只提供一种而非多种做一件事情的途径; 它只有尽量少的依赖关系,而且要明确地定义和提供清晰,尽量少的API。代码应通过其字面表达含义,因为不同的语言导致并非所有必须信息均可通过代码自身清晰表达。
2. 简单代码重要顺序
能通过所有测试;
没有重复代码;
体现系统中的全部设计理念;
包括尽量少的实体,比如类,方法,函数等;
消除重复和提高表达力让我在整洁代码方面获益良多,只要铭记这两点,改进脏代码时就会大有不同。
3. 名副其实,见名知意
注意命名,而且一旦发现有更好的名称,就换掉旧的。这么做,读你代码的人(包括你自己)都会更开心。
变量,函数或类的名称应该已经答复了所有的大问题。如果名称需要注释来补充,那么就不算是名副其实。
4. 避免误导
程序员必须避免留下掩藏代码本意的错误线索。
5. 使用可搜索的名称
for(int i=0; i<realDaysPerIdealDay; i++) 与 for(int i=0; i<5; i++)
两者realDaysPerIdealDay 要比数字 5 好找得多。
6. 类名
类名和对象名应该是名词或名字短语。类名不应该是动词
7. 方法名
方法名应当是动词或动词短语。
8. 聊
取好名字最难的地方在于需要良好的描述技巧和共有文化背景。
怎样让代码易于阅读和理解?怎么才能让函数表达其意图?该给函数赋予哪些属性,好让读者一看就明白函数是属于怎样的程序?
8.1 短小
函数的第一规则是短小,第二条规则是还要更短小。
代码块和缩进
函数不应该大到足以容纳嵌套结构。所以,函数的缩进层级不应该多于一层或两层。当然,这样的函数易于阅读和理解。
如下代码是将一个几十行的代码重构后的代码:
function renderPageWithSetupsAndTeardowns(pageData, isSuite) {
if(isTestPage(pageData))
includeSetupAndTeardownPages(pageData, isSuite)
return pageData.getHtml()
}
8.2 只做一件事
函数应该做一件事。做好这件事。只做这一件事。
To RenderPageWithSetupsAndTeardowns, we check to see whether the page is a test page and if so, we include the setups and teardowns. In either case we render the page in HTML.
(要 RenderPageWithSetupsAndTeardowns, 检查页面是否为测试页, 如果是测试页,就容纳进设置和分拆步骤。 无论是否测试页,都渲染成HTML)
8.3 每个函数一个抽象层级
要确保函数只做一件事,函数中的语句都要在同一抽象层级上。函数中混杂不同抽象层级,往往让人迷惑。
自顶向下读代码: 向下规则
To include the setups and teardowns, we include setups, then we include the test page content, and then we include the teardowns.
(要容纳设置和拆分步骤, 就先容纳设置步骤,然后纳入测试页面内容,在纳入拆分步骤。)
To include the setups, we include the suite setup if this is a suite, then we include the regular setup.
(要容纳设置步骤, 如果是套件,就纳入套件设置步骤,然后再纳入普通设置步骤)
To include the suite setup, we search the parent hierarchy for the "SuiteSetUp" page and add an include statement with the path of that page
(容纳套件设置步骤,先搜索“SuiteSetUp”页面的上级继承关系, 在添加一个包括该页面路径的语句)
To search the parent ..... (要搜索.....)
程序员往往很难学习遵循这条规则,写出只停留于一个抽象层上的函数。尽管如此,学习这个技巧还是很重要。这是保持函数短小,确保只做一件事的要诀。
8.4 使用描述性的名称
我们把testableHtml 改成 SetUpTeardownIncluder.render 它能较好地描述函数做的事。
记住沃德原则: “如果每个例程都让你感到深合己意,那就是整洁代码” 要遵循这一原则,大半工作都在于为只做一件事的小函数取个好名字。函数越短小,功能越集中,就越便于取个好名字。
别害怕花时间取名字。
命名方式要保持一致。使用与模块名一脉相承的短语,名词和动词给予函数命名。
8.5 函数参数
最理想的函数参数数量是零(零参数函数)。有足够特殊的理由才能用三个以上参数(多参数函数)---- 所以无论如何也不要这么做。
9. 小结
我并不从一开始就按照规则写函数。我想没人做得到。
先按照自己的思路写出需求代码。 然后打磨这些代码,分解函数,修改函数名,消除重复。 同时保持测试通过。