2023-10-11技术00
请注意,本文编写于 50 天前,最后修改于 50 天前,其中某些信息可能已经过时。

一、引言

代码整洁的重要性

代码整洁是软件开发中至关重要的一个方面。当我们编写整洁的代码时,可以提高代码的可读性、可维护性和可扩展性。整洁的代码易于理解,减少了他人阅读和维护代码时的困惑和错误。同时,整洁的代码也有助于减少bug的产生,提高软件的质量。

代码整洁的好处

  1. 可读性:整洁的代码易于阅读和理解,减少了他人阅读代码时的困惑和错误。清晰的代码结构和命名规范使得代码逻辑更加明确,提高了团队协作效率。(简单来说就是要让一起协同工作的人能读懂你的代码,而不是一坨答辩)

  2. 可维护性:整洁的代码易于维护。清晰的代码结构和模块化设计使得修改和扩展代码更加容易。通过遵循一致的编码风格和注释规范,他人能够更快速地理解代码的意图和实现细节。(

  3. 可测试性:整洁的代码易于进行单元测试和集成测试。清晰的函数和类设计使得测试代码更加简洁和可靠。通过良好的错误处理和异常处理机制,能够更好地捕获和处理错误,提高代码的健壮性。

  4. 可扩展性:整洁的代码易于扩展和重构。良好的代码结构和设计原则使得添加新功能或修改旧功能时能够保持代码的灵活性和可扩展性。通过避免代码的重复和冗余,减少了后续维护的工作量。

二、代码命名

在编写代码时,良好的命名是十分重要的,它能够提高代码的可读性和可理解性。以下是关于命名的几个要点:

  1. 使用有意义的变量名:变量名应该能够准确地描述变量的用途和含义。例如,如果我们需要表示一个人的年龄,可以使用age作为变量名,而不是使用无意义的字母或数字。

  2. 避免使用含糊不清的缩写:尽量避免使用难以理解的缩写,因为缩写可能会使代码的可读性降低。例如,如果我们需要表示一个订单的创建时间,可以使用creationTime作为变量名,而不是使用缩写形式如ct。

  3. 统一的命名风格:在整个代码库中保持统一的命名风格是很重要的。例如,可以选择使用驼峰命名法或下划线命名法,并在项目中保持一致。例如,如果我们使用驼峰命名法,可以将一个变量命名为firstName,而不是first_name或FIRSTNAME。(一般对于Java、Golang而言我们更喜欢使用驼峰命名,而对于c/c++、python或脚本语言更喜欢使用下划线命名)

  4. 避免误导性的命名:命名应该准确地反映变量或函数的用途,避免使用与其实际功能不符的名称。例如,如果我们有一个函数用于计算圆的面积,可以将其命名为calculateCircleArea,而不是calculateRectangleArea。

  5. 避免使用中文拼音:很多初学者,特别是一些没有接触编程或从某些培训班体系出来的程序员会非常喜欢使用中文拼音来命名变量,这是非常不好的习惯,比如下面的代码:

    String diYiXueQi  = "第一学期"

    如上面的变量,很容易引起误解,读者在阅读代码时,很难第一反应了解到这个diYiXueQi到底代表什么,而使用英文可以很顺畅地表达我们的想法。

三、函数

在编写代码时,函数是组织和封装逻辑的基本单元。函数设计的好不好直接决定了项目的鲁棒性和耦合度。 下面我通过python来举例什么是好的函数:

  1. 函数的简洁性和清晰性:函数应该保持简洁和清晰,只关注单一的任务或功能。避免函数过于复杂和冗长,可以通过拆分函数、提取子函数等方式来简化函数的逻辑。
# 不好的示例:复杂且冗长的函数
def process_data(data):
    # 复杂的数据处理逻辑...
    # ...
    # ...
    # ...
    # 复杂的数据处理逻辑...
    # ...
    # ...
    # ...
    # 复杂的数据处理逻辑...
    # ...
    # ...
    # ...
    # 复杂的数据处理逻辑...
    # ...
    # ...
    # ...
# 好的示例:简洁清晰的函数
def process_data(data):
    preprocess_data(data)
    transform_data(data)
    analyze_data(data)
    save_data(data)
  1. 函数的单一责任原则:每个函数应该只负责一个明确的任务或功能,并且只做这一个任务。这样可以提高函数的可重用性和可测试性,同时也使得代码更易于理解和维护。
# 不好的示例:一个函数负责多个任务
def process_data(data):
    preprocess_data(data)
    transform_data(data)
    analyze_data(data)
    save_data(data)
# 好的示例:每个函数只负责一个任务
def preprocess_data(data):
    # 数据预处理逻辑...

def transform_data(data):
    # 数据转换逻辑...

def analyze_data(data):
    # 数据分析逻辑...

def save_data(data):
    # 数据保存逻辑...
  1. 函数的命名和参数选择:函数的命名应该能够准确地描述函数的功能和作用。选择有意义的函数名和参数名,可以让代码更易于理解和使用。
# 不好的示例:函数名和参数名不具备描述性
def calc(a, b):
    # 计算逻辑...

# 不好的示例:使用缩写和无意义的参数名
def process_data(d):
    # 数据处理逻辑...
# 好的示例:具有描述性的函数名和参数名
def calculate_sum(num1, num2):
    # 计算两个数的和...

def process_data(data):
    # 数据处理逻辑...
  1. 避免过长的函数:函数应该尽量避免过长,超过一屏幕的长度。长函数难以理解和维护,可以通过拆分函数或提取子函数来减少函数的长度。
# 不好的示例:过长的函数
def process_data(data):
    # 长长的处理逻辑...
    # ...
    # ...
    # ...
    # 长长的处理逻辑...
    # ...
    # ...
    # ...
    # 长长的处理逻辑...
    # ...
    # ...
    # ...
# 好的示例:拆分和提取子函数
def process_data(data):
    preprocess_data(data)
    transform_data(data)
    analyze_data(data)
    save_data(data)

def preprocess_data(data):
    # 数据预处理逻辑...

def transform_data(data):
    # 数据转换逻辑...

def analyze_data(data):
    # 数据分析逻辑...

def save_data(data):
    # 数据保存逻辑...
  1. 函数的注释和文档:为函数提供清晰的注释和文档,可以帮助其他开发人员理解函数的用途、输入和输出。注释应该简洁明了,解释函数的功能和关键步骤,而文档可以提供更详细的说明和示例。
def calculate_sum(num1, num2):
    """
    计算两个数的和

    Args:
        num1 (int): 第一个数
        num2 (int): 第二个数

    Returns:
        int: 两个数的和
    """
    return num1 + num2

四、注释

注释是用来解释代码意图、提供额外信息并帮助理解代码的文字说明,注释的存在不仅仅是帮助别人理解你的代码,也是帮助未来的自己在维护时能够想起代码是干什么的(对于某些自己写的远古项目,如果你没有注释,那么那份代码可能只有上帝知道是干什么的):

  1. 注释的作用和使用场景:注释的主要作用是解释代码的意图、提供上下文信息以及帮助其他开发人员理解代码。注释的使用场景包括:

    • 解释代码的目的和功能。
    • 提供算法或逻辑的解释。
    • 强调特殊的注意事项或约束条件。
    • 提供对代码的修改或优化的说明。
    • 文档函数、类或模块的用途和使用方法。

    注释应该在需要解释的地方使用,并且应该与代码保持同步,以确保注释的准确性和有效性。

  2. 注释应该解释代码的意图而非实现细节:注释应该关注代码的意图和目的,而不是详细描述代码的实现细节。代码本身应该尽可能自解释,而注释则应该解释代码为什么要这样做,以及代码的目的和预期结果。

    # 不好的示例:注释过多的实现细节
    def calculate_sum(num1, num2):
        # 将num1和num2相加
        result = num1 + num2
        return result
    # 好的示例:注释解释代码的意图
    def calculate_sum(num1, num2):
        # 计算两个数的和
        result = num1 + num2
        return result
  3. 避免无用或误导性的注释:注释应该是有用的,不应该存在无意义或误导性的注释。避免在代码中添加显而易见的注释,注释应该提供额外的信息,帮助理解代码。

    # 不好的示例:无用的注释
    result = num1 + num2  # 计算结果
    # 好的示例:提供额外信息的注释
    # 将num1和num2相加得到结果
    result = num1 + num2
  4. 注释的更新和维护:注释是与代码同步的重要部分,应该随着代码的修改和演进进行更新和维护。当代码发生变化时,相应的注释也需要相应地更新,以保持注释与代码的一致性。

    注释应该被视为代码的一部分,同样受到代码审查和维护的过程。确保注释的准确性和完整性,以便其他开发人员能够依赖和理解注释提供的信息。

五、格式化

代码的格式化对于代码的可读性和可维护性非常重要,如果你的代码没有合理的格式化,那么非常容易让你的代码看起来像一大坨💩。 通过合理地使用缩进、空格、折行和空行,我们可以使代码更易读、易于理解和维护。保持一致的格式化风格,并遵守通用的格式化准则,有助于提高代码的可读性和一致性:

  1. 代码的缩进和对齐:使用一致的缩进风格来展示代码的结构和层次关系。常见的缩进方式是使用四个空格或者一个制表符(Tab)。对于每个代码块,都应该有相同的缩进级别,以便于阅读和理解代码的逻辑。

    # 不好的示例:缩进不一致
    if condition:
    print("Condition is true!")
       print("Indented inside if block")
    
    # 好的示例:一致的缩进
    if condition:
        print("Condition is true!")
        print("Indented inside if block")
  2. 空格的使用:在代码中适当地使用空格可以提高代码的可读性。以下是一些常见的空格使用场景:

    • 在运算符两侧和逗号后面添加空格,以增加可读性。
    # 不好的示例:缺少空格
    result=a+b
    
    # 好的示例:添加空格
    result = a + b
    • 在函数的参数列表和元素列表中,逗号后面添加一个空格。
    # 不好的示例:缺少空格
    my_function(arg1,arg2,arg3)
    
    # 好的示例:添加空格
    my_function(arg1, arg2, arg3)
    • 在注释中,运算符和关键字后面添加一个空格。
    # 不好的示例:缺少空格
    #计算两个数的和
    result = num1+num2
    
    # 好的示例:添加空格
    # 计算两个数的和
    result = num1 + num2
  3. 行的长度和折行规则:为了保持代码的可读性,应该遵守适当的行长度限制。通常,建议将每行代码限制在80个字符以内。如果一行代码超过了限制,可以使用括号、反斜杠或换行符进行折行。

    # 不好的示例:过长的行
    long_line = "This is a very long line of code that exceeds the recommended line length and makes it hard to read and understand."
    
    # 好的示例:使用括号进行折行
    long_line = ("This is a very long line of code that exceeds the recommended line length "
                 "and makes it hard to read and understand.")
    
    # 好的示例:使用反斜杠进行折行
    long_line = "This is a very long line of code that exceeds the recommended line length " \
                "and makes it hard to read and understand."
    
    # 好的示例:使用换行符进行折行
    long_line = "This is a very long line of code that exceeds the recommended line length\n" \
                "and makes it hard to read and understand."
  4. 空行的使用:适当地使用空行可以增加代码的可读性,将代码分成逻辑块和功能块。以下是一些常见的空行使用场景:

  • 在函数和类之间使用空行,以及在函数内部的逻辑块之间使用空行,以增加代码的可读性。
def function1():
    # 代码逻辑...

def function2():
    # 代码逻辑...

class MyClass:
    # 类定义...

function1()

function2()
  • 在函数和类的定义之前使用空行,以增加代码的可读性。
import module1

import module2


def my_function():
    # 代码逻辑...


class MyClass:
    # 类定义...
  • 在代码的不同部分之间使用空行,以增加代码的可读性和分组。
import module1

import module2


def function1():
    # 代码逻辑...


def function2():
    # 代码逻辑...

本文作者:伞菌

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!