快哭了!我被同事写的代码坑惨了
写出整洁的代码,是每个程序员的追求。《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 benefit
if ((employee.flags & HOURLY_FLAG) && (employee.age > 65))
good
if (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()
某种程度看来,这个跟金字塔原理也很像:
测试
可读性
可读性
可读性
对于测试的原则、准则如下:
没有测试之前不要写任何功能代码
只编写恰好能够体现一个失败情况的测试代码
只编写恰好能通过测试的功能代码
快速(Fast)测试应该够快,尽量自动化。
独立(Independent)测试应该应该独立。不要相互依赖
可重复(Repeatable)测试应该在任何环境上都能重复通过。
自我验证(Self-Validating)测试应该有 bool 输出。不要通过查看日志这种低效率方式来判断测试是否通过。
及时(Timely)测试应该及时编写,在其对应的生产代码之前编写。
作者:xybaby
编辑:陶家龙
出处:https://www.cnblogs.com/xybaby/p/11335829.html
精彩文章推荐: