我记得第一次浏览庞大代码库时的感觉,它就像一张无尽的函数、变量以及错综复杂的业务逻辑之网,初时新奇,再看头大。
那是我刚刚工作的第二个月,同事们让我添加一个看似简单的功能。我以为只需要一天时间就能搞定,结果却花了一星期还多的时间。
为什么?代码虽然能用,但很乱。函数名又长又混乱,类似processData1和tempFinal。我做的每一个改变都像是在拉毛衣上的线,撕开一小口,其他一切都会开始散开。
我陷入困境,不禁有点沮丧,然后自问:怎么会变成这样?
我偶然发现了“整洁代码”的概念。这也不是一夜之间发生的,但运用这些原则改变了我对编码的看法。整净的代码不仅仅是让你的程序运行更好,它让程序对你自己和下一个接触它的人来说都是赢的。
# 令人困惑、不清楚的名称
def c ( l1, l2 ):
return l1 + l2
# 清晰、有意义的名称
def Combine_lists ( list_one, list_two ):
return list_one + list_two
当我第一次看到这样的代码时,突然意识到:函数名和变量不仅仅是占位符。它们可以和我们沟通。我可没有问“这有什么用?”,而是开始问“这是什么意思?”
经验教训:如果某人(包括未来的你)可以读懂这些名称并立即了解代码的作用,那么你就走在了正确的道路上。
# 在采用 PEP 8(维护起来非常困难)之前
def add ( a,b ): return a+b
# 干净,遵循 PEP 8 约定
def add ( a: int , b: int ) -> int :
return a + b
这些看起来似乎是小事,当你与多名开发人员一起合作开发大型项目时,这些小矛盾就会累积起来。遵守风格指南不仅是为了整洁,还为了让你的代码以后更容易被其他人(包括你自己)接受。
// 不好:没有定义类型,以后更难理解或调试
function greet ( name ) {
return " Hello " + name;
}
//干净:显式类型,不需要猜测
function greet ( name: string ): string {
return "Hello " + name;
}
一旦我开始一致地使用类型,我从此注意到了一些东西:
代码实际上是写给自己的。从此我不再遇到神秘的错误,并开始对添加新函数或重构旧函数时充满信心。
// Bad: A function trying to do too much
function processUser(user) {
// Validate user
// Save user to DB
// Send email notification
}
// Clean: Separate concerns into smaller functions
function validateUser(user: User): boolean {
// Validation logic
}
function saveUser(user: User): void {
// Save logic
}
function sendUserNotification(user: User): void {
// Email logic
}
函数越小,可移动部件就越少,出错的可能性就越小,代码也就越容易阅读、测试和维护。
每个部分都成为一个构建块,完成一件事,并把它做好。
# Before: Magic number that no one understands
discount = price * 0.07
# After: Make it clear
SALES_TAX = 0.07
discount = price * SALES_TAX
当我开始用具有有意义的名称的常量或变量来替换这些“魔法”数字时,我的代码不仅变得更有意义,而且当今后情况发生变化时,更新也变得更加容易。
// 不好:重复相同的逻辑
function calculateAreaOfRectangle ( width: number , height: number ) {
return width * height;
}
function calculateAreaOfSquare ( side: number ) {
return side * side;
}
// 干净:重用逻辑
function calculateArea ( shape: Shape ) {
return shape. width * shape. height ;
}
是的,遵循 DRY 原则让我的代码更加模块化并且更灵活。而且,修改代码变得更容易,而错误呢?嗯,错误明显更少了。
作者:聆听音乐的鱼
本文为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。