17611538698
webmaster@21cto.com

编写整洁代码的最佳实践原则

编程语言 0 583 2023-09-18 02:50:13

图片

21CTO导读:如何编写整洁的代码?本文将从实践经验与执行原则方面描述,相信看过你会变得很清晰。


概述

编写整洁的代码是每个软件开发人员的基本能力。干净的代码不仅使你的代码库更易于维护和理解,而且还能够促进团队成员之间的协作,升华友谊。

在这篇文章中,我们将探讨什么是整洁的代码、为什么它很重要,并为你提供一组最佳实践和原则来帮助你编写整洁并可维护的代码。

什么是整洁代码?


整洁的代码是易于阅读、易于理解和易于修改的代码。它是没有不必要的复杂性、冗余和混乱的代码。整洁的代码遵循一组约定和最佳实践,使其更加一致,使多个开发人员更容易无缝地处理同一个项目。


为什么整洁的代码很重要?


  1. 可读性:简洁的代码易于阅读。任何一个同事,包括后面的你自己都可以快速理解它。这将减少掌握代码功能所需的时间,从而加快开发和调试速度。

  2. 可维护性:代码的阅读次数要多于编写次数。当你编写整洁的代码,随着时间的推移,维护和扩展应用程序将变得更容易。项目经常发展和迭代,这在软件开发中至关重要。

  3. 协作:简洁的代码更有利于协作。当你的代码干净且组织良好,其他团队成员就可以有效地处理它。这使得划分任务和同时处理代码库的部分变得更加容易。

  4. 减少错误:整洁的代码可以减少引入错误的可能性。难以理解的代码在修改或增强过程中更容易出错。

  5. 效率:整洁的代码就是高效的代码。因为它避免了不必要的操作和复杂性,通常运行速度更快,并且占用的资源更少。


我们了解了为什么的整洁代码很重要,接下来深入研究一些最佳实践和原则,来帮助你编写整洁干净的代码。

编写整洁代码的最佳实践和原则


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 frameworktest('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 等工具提供了代码审查、分支和合并功能,能够促进协作和代码整洁。

结语


编写整洁与干净的代码不仅仅是一套规则,更是开发者的一种心态和纪律。


它讲述是如何创建易于阅读、维护和扩展的软件规则,通过遵循这些实践经验和原则,你可以成为一名更优秀的开发人员,生成高质量的代码。你可以投入一些时间仔细检查其他人士的代码库,特别是在开源项目中,可能会引发一种启发性的体验。


通过类似的研究与总结,你将获得对不同编码风格和策略的宝贵经验。这种体验将使人能够提炼出编写原始代码、可持续代码库的精髓。


请大家记住,干净的代码是一个持续的旅程,通过不断地练习,它会成为你的自律习惯或第二天性,从而实现更高效、更愉快的软件开发生活。


作者:场长

评论