作为一名年轻的开发人员,在复杂的软件开发过程中摸爬滚打是一项挑战。这就是我们开发人员痴迷于真理的原因。接下来,本文将针对成熟开发人员分享4个编写代码的规则。
【参考文献】
文章:《The 4 Rules of Writing Code Only Mature Developers Know About》
上述译文仅供参考,具体内容请查看上面链接,解释权归原作者所有。
【关于TalkX】
TalkX是一款基于GPT实现的IDE智能开发插件,专注于编程领域,是开发者在日常编码中提高编码效率及质量的辅助工具,TalkX常用的功能包括但不限于:解释代码、中英翻译、性能检查、安全检查、样式检查、优化并改进、提高可读性、清理代码、生成测试用例、有趣的图表生成、语音助手托克斯以及自定义可塑性好友功能等。
TalkX建立了全球加速网络,不需要考虑网络环境,响应速度快,界面效果和交互体验更流畅。并为用户提供了Open AI的密钥,不需要自备ApiKey,不需要自备账号,不需要魔法。
TalkX产品支持:JetBrains (包括 IntelliJ IDEA、PyCharm、WebStorm、Android Studio、HBuilder、VS Code、Goland)
1. 不要把共享代码拉到代码库中
重复使用。
大多数为程序员撰写的文章都告诉我们不要重复。我们应该尽可能多地使用现有代码。
这就是为什么我们开发人员执着于尽可能将共享代码提取到库中。
但这种提取共享代码的习惯也可能带来灾难性的后果。
据我观察,提取共享代码会导致依赖性增加。
你经常会发现自己需要花时间维护那些几乎用不到的库。无用的库会带来开销。你将有额外的代码需要管理。
示例
举个例子,我创建了一个计算偶数和奇数的库。
# odd_even_library.py
def is_odd(num):
return num % 2 != 0
def is_even(num):
return num % 2 == 0
# Main code
from odd_even_library import is_odd, is_even
number = 7
if is_odd(number):
print(f"{number} is an odd number.")
else:
print(f"{number} is an even number.")
上述代码使用了一个库。
现在来看下一个例子,我们没有使用程序库。
def is_odd(num):
return num % 2 != 0
def is_even(num):
return num % 2 == 0
# Main code
number = 7
if is_odd(number):
print(f"{number} is an odd number.")
else:
print(f"{number} is an even number.")
在第一种情况下,我们创建了一个名为 odd_even_library.py 的库,其中包含奇数和偶数计算函数。
如果我们想在主代码中使用该库,就必须导入它。这就引入了对 odd_even_library 模块的依赖。
如果该库还有其他依赖关系,那么它也将成为主代码的一部分。
我举了一个简单的例子来说明这一点。但如果你愿意,也可以举一个复杂的例子。当库有自己的依赖关系时,就会产生复杂的依赖关系树。
在第二个例子中,没有外部依赖关系。奇数和偶数的代码都在主代码中。无需导入任何外部模块。
我们应该怎么做?
以 odd_even_library.py 为例。
你会发现我们很早就创建了这个库。我们不知道将来会如何使用它。
如果你在创建一个库的时候不知道将来如何使用它。那就不要创建它。
它只会在将来给你带来不必要的麻烦。
2. 使用领域语言
我还记得刚开始写代码时的情景。
我经常跟着老师学习。
老师们总是使用领域语言。
我认为,指导员使用领域语言是为了看起来很酷。当时我并不了解它的重要性。
当我开始独立构建项目时,我没有使用领域语言。
如果要构建一个图书馆管理系统,我不会使用add_book
、find_book_by_title
和list_all_books
等函数名。取而代之的是一些通用名称。
我使用通用名称构建了许多项目。
因为只有我一个人在编写代码,所以我没有遇到任何问题。
这对我的思维产生了什么影响?
我开始认为使用特定领域语言是在浪费时间,因为我不用特定领域语言也能创建很多个人项目。
当我阅读其他人的开源软件代码时,他们使用的都是特定领域语言。我认为每个人都在浪费时间。
我认为他们只需使用一个通用名称就可以了,一切都不会有问题。
什么时候我的想法发生了改变?
现在写这篇文章时,我已经不记得具体的代码了。
但我记得当时的情况。
我记得在建立博客平台时,我故意不使用域名语言。我用了一个通用名称。
让我给你举一个这样的代码例子。
def calculate(a, b):
x = a + b
y = x * 2
z = y / 3
return z
result = calculate(5, 7)
print("Result:", result)
我们上面有一个简单的计算函数。
它有两个参数 a
和 b
。
函数包含三个变量 x
、y
和 z
。这些变量名并没有给出它们存在的目的。
为了正确理解代码,你必须分析整个代码。
在修复任何错误的同时,您还需要努力进行修改。你必须记住任何变量存在于代码库中的原因。如果您是团队成员,您的队友在理解代码方面也会面临挑战。
以我为例,当我回到我的项目并试图对其进行修改时。我很纠结。为了做一个改动,我必须跟踪各种变量。
我用纸笔记录每个变量的作用。这时,我批评了自己的整个方法。
我学到了宝贵的一课。
如果之前的代码是这样的
def calculate_sum_and_average(first_number, second_number):
sum_of_numbers = first_number + second_number
double_sum = sum_of_numbers * 2
average = double_sum / 3
return average
result = calculate_sum_and_average(5, 7)
print("Average:", result)
这样就很容易进行必要的修改了。
在上述代码中,我们为变量和函数使用了有意义的名称。
3. 编写一个抽象级别的函数
当我阅读其他程序员编写的代码时,我反复看到这种行为。
有些程序员在编写代码时并不只写一个抽象层次的代码。
借助电视遥控器理解抽象
在深入探讨程序员是如何犯这种错误之前。
让我们先借助一个例子来理解抽象的含义。
以电视遥控器为例。
当我们使用遥控器时,我们不需要知道电视机内部发生的所有复杂事情。
你不需要知道电视扬声器的音量是如何增大和减小的。遥控器上的按钮如何改变显示图像?
要想在不完全了解电视机内部工作原理的情况下了解电视机的复杂性,那就使用遥控器吧。
浏览器示例
以任何网络浏览器为例。
谷歌浏览器。
输入 youtube.com,网站就会自动打开。你不需要知道 HTTP 是如何工作的,也不需要知道服务器是什么。
它就是能运行。
程序员会犯哪些错误?
#Function to calculate area
def calculate_rectangle_area(length, width):
return length * width
# Function to ask the user for dimensions
def get_and_calculate_rectangle_area():
length = float(input("Enter the length of the rectangle: "))
width = float(input("Enter the width of the rectangle: "))
area = calculate_rectangle_area(length, width)
print(f"The area of the rectangle is: {area}")
def main():
print("Welcome to the Rectangle Area Calculator")
get_and_calculate_rectangle_area()
在上例中,get_and_calculate_rectangle_area
函数既负责用户输入,也负责面积计算。这导致复杂性增加。
如果能将这一职责分离到两个独立的函数中,代码就会变得更简单。
更好的办法应该是这样
# Function to calculate the area
def calculate_rectangle_area(length, width):
return length * width
# Main function
def main():
print("Welcome to the Rectangle Area Calculator")
length = float(input("Enter the length of the rectangle: "))
width = float(input("Enter the width of the rectangle: "))
area = calculate_rectangle_area(length, width)
print(f"The area of the rectangle is: {area}")
在上述代码中,只有calculate_rectangle_area
函数负责计算面积。
该函数没有额外的抽象层次。
主函数处理整个流程。
它显示信息并调用calculate_rectangle_area
计算面积。
通过这样做,我们将抽象层减少到了一层。
4. 编程没有固定答案
关于第一点,我在上文已经提到,你不应该把共享代码拉到一个库中。
在第三点中,我建议编写抽象级别为一级的函数。
第一条原则建议,应避免为共享代码创建单独的库和外部依赖关系,而应将代码保留在项目中。
第三条原则的重点是创建具有单一、明确职责的函数。它鼓励将复杂的操作分解成更小、更集中的单元。
现在,你可能会认为这两者之间存在冲突。
但如果你深入思考一下,其实并没有冲突。
我没说什么?
我并不是说你永远都不应该把共享代码放到库中。
只是说,如果你想把代码放到一个单独的库中,请确保这些代码不仅仅是针对我们当前的项目。但它在其他情况下也是特定的。
如果提取的代码有助于组织代码并提高可维护性,那么你就应该去做一个库。这符合只用一个抽象层编写函数的原则。
如果您要提取共享代码并将其放入一个库中,请评估其中的利弊得失。
如果项目所需的行数较少,就不要通过添加不必要的文件使项目变得庞大。
事物会不断变化
编程始终处于不断进化的状态。
新的框架、原则和工具不断产生。
在某种情况下被认为是最好的方法,在另一种情况下可能是最糟糕的。
因此,你应该努力学习所有的最佳实践,但要根据用户的需求做出决定。
解决同一个问题可能有多种方法,你应该根据具体情况选择最佳方法。
⚠️:文章翻译上如有语法不准确或者内容纰漏,欢迎各位评论区指正。
【关于TalkX】
TalkX是一款基于GPT实现的IDE智能开发插件,专注于编程领域,是开发者在日常编码中提高编码效率及质量的辅助工具,TalkX常用的功能包括但不限于:解释代码、中英翻译、性能检查、安全检查、样式检查、优化并改进、提高可读性、清理代码、生成测试用例、有趣的图表生成、语音助手托克斯以及自定义可塑性好友功能等。
TalkX建立了全球加速网络,不需要考虑网络环境,响应速度快,界面效果和交互体验更流畅。并为用户提供了Open AI的密钥,不需要自备ApiKey,不需要自备账号,不需要魔法。
TalkX产品支持:JetBrains (包括 IntelliJ IDEA、PyCharm、WebStorm、Android Studio)、HBuilder、VS Code、Goland.