其他
不规范代码一时爽,重构代码火葬场,这份代码指南请收下
写出整洁的代码,是每个程序员的追求。《clean code》指出,要想写出好的代码,首先得知道什么是肮脏代码、什么是整洁代码;然后通过大量的刻意练习,才能真正写出整洁的代码。
WTF/min是衡量代码质量的唯一标准,Uncle Bob在书中称糟糕的代码为沼泽(wading),这只突出了我们是糟糕代码的受害者。国内有一个更适合的词汇:屎山,虽然不是很文雅但是更加客观,程序员既是受害者也是加害者。
对于什么是整洁的代码,书中给出了大师们的总结:
Bjarne Stroustrup:优雅且高效;直截了当;减少依赖;只做好一件事 Grady booch:简单直接 Dave thomas:可读,可维护,单元测试 Ron Jeffries:不要重复、单一职责,表达力(Expressiveness)
命名的艺术
# bad code
def getItem(theList):
ret = []
for x in theList:
if x[0] == 4:
ret.append(x)
return ret
# good code
def getFlaggedCell(gameBoard):
'''扫雷游戏,flagged:翻转'''
flaggedCells = []
for cell in gameBoard:
if cell.IsFlagged():
flaggedCells.append(cell)
return flaggedCells
不要挂羊头卖狗肉 不要覆盖惯用缩略语
# bad
def copy(a_list, b_list):
pass
# good
def copy(source, destination):
pass
如果名称读不出来,那么讨论的时候就会像个傻鸟
名字长短应与其作用域大小相对应
注释
The proper use of comments is to compensate for our failure to express ourself in code.
bad// check to see if the employee is eligible for full benefitif ((employee.flags & HOURLY_FLAG) && (employee.age > 65))goodif (employee.isEligibleForFullBenefits())
法务信息 对意图的注释,为什么要这么做 警示 TODO注释 放大看似不合理之物的重要性
函数
public class UserValidator { private Cryptographer cryptographer; public boolean checkPassword(String userName, String password) { User user = UserGateway.findByName(userName); if (user != User.NULL) { String codedPhrase = user.getPhraseEncodedByPassword(); String phrase = cryptographer.decrypt(codedPhrase, password); if ("Valid Password".equals(phrase)) { Session.initialize(); return true; } } return false; }}
def pushElephantIntoRefrige():
openRefrige()
pushElephant()
closeRefrige()
每一个层级都是为了论证其上一层级的观点,同时也需要下一层级的支持;同一层级之间的多个论点又需要以某种逻辑关系排序。 pushElephantIntoRefrige 就是中心论点,需要多个子步骤的支持,同时这些子步骤之间也有逻辑先后顺序。
4. 测试
You are not allowed to write any production code unless it is to make a failing unit test pass. 没有测试之前不要写任何功能代码 You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures. 只编写恰好能够体现一个失败情况的测试代码 You are not allowed to write any more production code than is sufficient to pass the one failing unit test. 只编写恰好能通过测试的功能代码
快速(Fast)测试应该够快,尽量自动化。 独立(Independent) 测试应该应该独立。不要相互依赖 可重复(Repeatable) 测试应该在任何环境上都能重复通过。 自我验证(Self-Validating) 测试应该有bool输出。不要通过查看日志这种低效率方式来判断测试是否通过 及时(Timely) 测试应该及时编写,在其对应的生产代码之前编写