17611538698
webmaster@21cto.com

整洁代码最佳实践

编程语言 0 94 2024-10-13 11:32:53

图片

拥抱编码之美:自然与创新相遇的工作空间


我记得第一次浏览庞大代码库时的感觉,它就像一张无尽的函数、变量以及错综复杂的业务逻辑之网,初时新奇,再看头大。

那是我刚刚工作的第二个月,同事们让我添加一个看似简单的功能。我以为只需要一天时间就能搞定,结果却花了一星期还多的时间。

为什么?代码虽然能用,但很乱。函数名又长又混乱,类似processData1和tempFinal。我做的每一个改变都像是在拉毛衣上的线,撕开一小口,其他一切都会开始散开。

我陷入困境,不禁有点沮丧,然后自问:怎么会变成这样?

我偶然发现了“整洁代码”的概念。这也不是一夜之间发生的,但运用这些原则改变了我对编码的看法。整净的代码不仅仅是让你的程序运行更好,它让程序对你自己和下一个接触它的人来说都是赢的。

从混乱到清晰的旅程


在早期,我意识到这不仅仅是修复错误或添加功能,而是阅读和使用代码的体验。如果代码没有意义,整个过程成了猜谜游戏。


我开始注意到一件事:好代码和坏代码之间的区别不仅仅在于它运行得有多好,还在于你理解它的难易程度。


您是否曾经打开过别人的代码(或者几个月后打开了你自己的代码),却不知道写了什么的?是的,我也如此。代码可能有效,但如果你无法理解其中的逻辑,那么你将陷入困境。


这让我接受了“整洁代码”的原则:请编写易于阅读、修改和扩展的代码,即使是第一次看到它。


让我分享一些我在这一过程中学到的经验教训。


第一步:有意义的名字


第一件事是:名称很重要。现在的我正在积极处理代码中的变量名,例如aaa、x1、y2和zFinal。


起初,我以为这就是快速做事的方式。但后来我开始明白为什么最好的代码就像读一本书一样——名称是要经过精心选择的,让代码讲述自己的故事。


让我们来看一个 Python 代码示例:


# 令人困惑、不清楚的名称
def c ( l1, l2 ): return l1 + l2
# 清晰、有意义的名称def Combine_lists ( list_one, list_two ): return list_one + list_two


当我第一次看到这样的代码时,突然意识到:函数名和变量不仅仅是占位符。它们可以和我们沟通。我可没有问“这有什么用?”,而是开始问“这是什么意思?”

经验教训:如果某人(包括未来的你)可以读懂这些名称并立即了解代码的作用,那么你就走在了正确的道路上。

遵循规则:Pythonic 和 TypeScript 最佳实践


图片


在同一份工作中,我也从痛苦中认识到了一致性是关键。


在 Python 中,这意味着遵循PEP 8指南。在 TypeScript 中,这意味着拥抱静态类型之美。这些不仅仅是任意的规则——它们能使代码库可预测、有条理和可读的工具。


Python:坚持使用 PEP 8


在我没有关注PEP 8之前,我原来的 Python 代码看起来就像意大利面条一样——随机缩进、不一致的间距、连续行。


# 在采用 PEP 8(维护起来非常困难)之前def  add ( a,b ): return a+b# 干净,遵循 PEP 8 约定def  add ( a: int , b: int ) -> int :     return a + b


这些看起来似乎是小事,当你与多名开发人员一起合作开发大型项目时,这些小矛盾就会累积起来。遵守风格指南不仅是为了整洁,还为了让你的代码以后更容易被其他人(包括你自己)接受。

TypeScript:类型拯救你


另一方面,在 TypeScript 中,我了解到预先定义正确的类型就像为未来的自己留下面包屑。


当我忽略类型时,我的代码会变成“这应该是什么类型?”错误的雷区。如下示例:


// 不好:没有定义类型,以后更难理解或调试
function greet (  name ) { return  "  Hello " + name; //干净:显式类型,不需要猜测function greet ( name: string ): string { return "Hello " + name; }


一旦我开始一致地使用类型,我从此注意到了一些东西:

代码实际上是写给自己的。从此我不再遇到神秘的错误,并开始对添加新函数或重构旧函数时充满信心。

小函数的力量


你是否曾经打开过一个文件,然后用鼠标往下滚动浏览,然后意识到整个文件只是一个巨大的单一函数?


这就是我在那个早期的混乱的项目遇到的情况。每个函数都在尝试做所有事情。这意味着不可能弄清楚任何事情。


我开始尝试分解功能,使其变得更小、更易于管理,并专注于一件事。


以下是我改变方法的方式:

// Bad: A function trying to do too muchfunction processUser(user) {    // Validate user    // Save user to DB    // Send email notification}
// Clean: Separate concerns into smaller functionsfunction 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 understandsdiscount = price * 0.07
# After: Make it clearSALES_TAX = 0.07discount = price * SALES_TAX


当我开始用具有有意义的名称的常量或变量来替换这些“魔法”数字时,我的代码不仅变得更有意义,而且当今后情况发生变化时,更新也变得更加容易。

DRY 原则:不要重复自己


在我最早的开发旅程到现在,我几乎没有怎么注意到写了多少重复的代码。


我在不同函数中复制了相同或类似的逻辑,这让更新或修复错误成为一场噩梦。每次更改都意味着要搜索多个函数来更新十几个不同位置的代码逻辑。


然后我发现了DRY(不要重复自己)这个规则。我学会了抽象和重用函数,而不是复制和粘贴代码:


// 不好:重复相同的逻辑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 原则让我的代码更加模块化并且更灵活。而且,修改代码变得更容易,而错误呢?嗯,错误明显更少了。

结语:请长期编写整洁代码


那么,这么多年来我学到的最重要的东西是什么?


整净的代码不仅仅是让事情看起来更美观——从长远来看,它会让我们的生活更加轻松。


整洁的代码就像你给自己,以及项目中的其他同事的一份礼物。当你几周或几个月后重新审视自己的代码时,它可以减少很多摩擦。


现在,每次我坐下来编写代码时,我会想到将来会看这些代码的开发人员——无论是自己还是其他人。


我不禁问自己:“他们一眼就能看懂吗?”


最好的代码是能自我表达的代码。一旦你记住了这一点,你处理每个项目、每个函数和每行代码的方式就会发生改变。结合这些小变化 — 无论你使用的是Python、TypeScript,还是其他任何编程语言,然后请仔细察你的代码如何变化。


这样,你不仅可以编写有效的代码,还可以编写持久的代码。那么,下一步你将怎么编写整洁的代码?评论区里等着你哦~

作者:聆听音乐的鱼

评论