21CTO导读:如何编写整洁的代码?本文将从实践经验与执行原则方面描述,相信看过你会变得很清晰。
概述
编写整洁的代码是每个软件开发人员的基本能力。干净的代码不仅使你的代码库更易于维护和理解,而且还能够促进团队成员之间的协作,升华友谊。
在这篇文章中,我们将探讨什么是整洁的代码、为什么它很重要,并为你提供一组最佳实践和原则来帮助你编写整洁并可维护的代码。
什么是整洁代码?
整洁的代码是易于阅读、易于理解和易于修改的代码。它是没有不必要的复杂性、冗余和混乱的代码。整洁的代码遵循一组约定和最佳实践,使其更加一致,使多个开发人员更容易无缝地处理同一个项目。
为什么整洁的代码很重要?
-
可读性:简洁的代码易于阅读。任何一个同事,包括后面的你自己都可以快速理解它。这将减少掌握代码功能所需的时间,从而加快开发和调试速度。
-
可维护性:代码的阅读次数要多于编写次数。当你编写整洁的代码,随着时间的推移,维护和扩展应用程序将变得更容易。项目经常发展和迭代,这在软件开发中至关重要。
-
协作:简洁的代码更有利于协作。当你的代码干净且组织良好,其他团队成员就可以有效地处理它。这使得划分任务和同时处理代码库的部分变得更加容易。
-
减少错误:整洁的代码可以减少引入错误的可能性。难以理解的代码在修改或增强过程中更容易出错。
-
效率:整洁的代码就是高效的代码。因为它避免了不必要的操作和复杂性,通常运行速度更快,并且占用的资源更少。
我们了解了为什么的整洁代码很重要,接下来深入研究一些最佳实践和原则,来帮助你编写整洁干净的代码。
编写整洁代码的最佳实践和原则
1. 有意义的变量与函数名称
对变量、函数、类和其它标识符使用可描述性名称。精心选择的名称可以传达实体的目的,使代码更容易理解。避免使用单字母变量名或『神秘』的缩写,甚至于使用汉字。
# 不好的变量名
x = 5
变量 = 5
# 好的变量名
total_score = 5
2. 函数和方法要简洁
函数和方法应该简洁,并且要专注于单一任务。单一职责原则(SRP)指出,一个函数应该只做一件事,并且把它做完。较短的函数更加容易理解、测试和维护。若函数变得太长或太复杂,请你考虑将其分解为更小、更易于管理的函数。
// 长或复杂的函数
function processUserData(user) {
// 多行代码...
}
// 简洁的函数
function validateUserInput(userInput) {
// 验证逻辑...
}
function saveUserToDatabase(user) {
// 数据库操作...
}
3. 注释和文档
请谨慎使用注释——当我们添加注释时,要让它们变得有意义。代码应该尽可能不言自明,这样无需注释。文档(例如内联注释和自述文件)可帮助其它开发人员了解代码的目的和用法。记录复杂的算法、重要的决策和通用 API。
# 不好的注释
x = x + 1 # Increment x
# 好的注释
# 将字符串转换为数字,当不是数字类型时,API 返回错误的字符串类型
totalUsers = Number(users);
4.一致的格式和缩进
坚持一致的编码风格和缩进,这使得代码库看起来干净,且组织清晰。大多数编程语言都有社区规定的编码标准(例如,Python 的 PEP 8、JavaScript 的 eslint)。
开发人员应该遵循这些标准。一致性还适用于命名约定、间距与代码结构等。
// 格式不一致
if(condition){
doSomething();
} else
{
doSomethingElse();
}
// 格式一致
if (condition) {
doSomething();
} else {
doSomethingElse();
}
5. DRY(不要重复自己)之原则
请避免重复代码。重复的代码非常难于维护,并增加逻辑不一致的风险。我们要将通用的功能提取到函数、方法或类中以提高代码的可重用性。当需要进行修改时,只需在一处进行就可以完成了。
假设,正在开发一个 JS 应用程序来计算购物车中商品总价。最开始,有两个单独的函数来计算每种商品类型的价格:一个用于计算一本书的价格,另一个用于计算笔记本电脑的价格。
这是最开始的源代码:
function calculateBookPrice(quantity, price) {
return quantity * price;
}
function calculateLaptopPrice(quantity, price) {
return quantity * price;
}
虽然这些函数可以执行,但它们违反了 DRY 原则,因为计算总价逻辑对于不同的商品类型是重复的。如果你有更多的项目类型需要计算,你将不断重复此逻辑。
为了遵循DRY原则,提高代码的可维护性,我们对代码进行如下重构:
function calculateItemPrice(quantity, price) {
return quantity * price;
}
const bookQuantity = 3;
const bookPrice = 25;
const laptopQuantity = 2;
const laptopPrice = 800;
const bookTotalPrice = calculateItemPrice(bookQuantity, bookPrice);
const laptopTotalPrice = calculateItemPrice(laptopQuantity, laptopPrice);
在上面经过重构的代码中,我们有了一个calculateItemPrice函数,它根据参数提供的数量和价格计算商品的总价。这样便遵循了 DRY 原则,计算逻辑不再重复。
接下来,我们可以通过使用适当的数量和价格值调用calculateItemPrice来轻松计算书籍、笔记本电脑或任何其它商品类型的总价。这种方法提高了代码的可重用性、可读性和可维护性,同时降低了重复代码引起的错误风险。
6. 使用有意义的空格
使用空格和换行符正确设置代码格式,以增强程序的可读性。比如使用空格来分隔代码的逻辑部分。格式良好的代码更容易浏览,减少阅读者的认知负担。
// 没有使用空格
const sum=function(a,b){return a+b;}
// 使用空格提供可读性
const sum = function (a, b) {
return a + b;
}
7. 错误处理
请你优雅地处理错误。我们在代码中要使用适当的 try-catch 块或错误处理机制,这可以防止意外崩溃并为调试提供有价值的信息。不要抑制错误或在没有正确响应的情况下简单地记录错误。
// 简单显示错误信息
try {
result = divide(x, y);
} catch (error) {
console.error("An error occurred");
}
// 详细的返回错误类型
try {
result = divide(x, y);
} catch (error) {
if (error instanceof ZeroDivisionError) {
console.error("Division by zero error:", error.message);
} else if (error instanceof ValueError) {
console.error("Invalid input:", error.message);
} else {
console.error("An unexpected error occurred:", error.message);
}
}
8. 测试
要编写单元测试来验证代码的正确性。测试驱动开发 (TDD) 可以使开发人者预先考虑特殊情况和预期行为,从而帮助你编写更清晰的代码。经过良好测试的代码更加可靠且更容易重构。
// Example using JavaScript and the Jest testing framework
test('addition works correctly', () => {
expect(add(2, 3)).toBe(5);
expect(add(-1, 1)).toBe(0);
expect(add(0, 0)).toBe(0);
});
9. 重构
请定期重构你的代码。随着需求的变化以及你对问题领域理解或加深,请相应地调整代码。项目的不断发展,重构有助于保持整洁的代码。在必要时,不要害怕重新阅读和改进现有代码。
比如我有一个函数,用来计算购物车中具有固定折扣百分比的商品总价:
function calculateTotalPrice(cartItems) {
let totalPrice = 0;
for (const item of cartItems) {
totalPrice += item.price;
}
return totalPrice - (totalPrice * 0.1); // Apply a 10% discount
}
最开始,此函数计算总价并应用 10% 的固定折扣。随着项目的发展,你意识到需要支持可变折扣。为了重构代码使其更加灵活,需要引入折扣参数:
function calculateTotalPrice(cartItems, discountPercentage) {
if (discountPercentage < 0 || discountPercentage > 100) {
throw new Error("Discount percentage must be between 0 and 100.");
}
let totalPrice = 0;
for (const item of cartItems) {
totalPrice += item.price;
}
const discountAmount = (totalPrice * discountPercentage) / 100;
return totalPrice - discountAmount;
}
在这段重构的代码中:
-
在calculateTotalPrice函数中添加了discountPercentage参数,在调用该函数时可以指定折扣百分比。
-
对discountPercentage 参数进行验证,以确保其落在有效范围内(0 到100%)。如果不在范围内,程序会抛出错误。
-
折扣计算基于提供的discountPercentage参数,使该函数更加灵活,能够适应不断变化的需求。
通过此类方式重构代码,全面提高了它的灵活性与可维护性。开发者可以轻松地调整该函数来处理不同的折扣场景,而无需重写整个逻辑。
以上证明,随着项目发展和需求变化定期进行代码重构之重要性。
10. 版本控制
请使用 Git 等版本控制系统来跟踪代码更改。这些工具可使你与团队成员达成有效协作,在必要时还可恢复到以前的版本,能够维护项目开发的清晰历史记录。Git 等工具提供了代码审查、分支和合并功能,能够促进协作和代码整洁。