丰富的经验带来了哪些独特的视角

当我刚开端学习编程时,常听到这样的话:

  • “成为程序员需求天分”
  • “你将会整天沉浸在代码中”
  • “你会参加到立异的项目中”
  • “编写代码是一件十分有趣的事情”

但随着时间的流逝,我逐渐认识到,这些都不尽然是真的。

作为一个十多年一线程序员,我深刻了解了软件开发的杂乱性,这是每个开发者都要面临的应战。这也是为什么咱们这些开发者对默认规则如此执着。

在这里,我想和咱们分享四个重要的准则。

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.py 的库。这个库包括了一些用于核算奇数和偶数的函数。假如咱们想在主代码中运用这个库,就必须导入它,这样就引入了对 odd_even_library 模块的依靠。这种状况下,假如库自身还有其他依靠,那些依靠也会成为咱们主代码的一部分。

我用一个简略的比方向你展现这一点,但你也可以考虑更杂乱的状况。当一个库有自己的依靠时,它或许导致一个十分杂乱的依靠树。

在第二个比方中,咱们没有外部依靠。奇数和偶数的相关代码直接包括在主代码中,无需引入任何外部模块。

咱们应该怎么做?

回到 odd_even_library.py 这个比方。当咱们开始创立这个库时,咱们并不清楚未来会怎么运用它。假如你在创立一个库,而在那一刻你不确定将来的运用场景,那么最好是不要创立它。由于这只会在未来给你带来不必要的费事。

2. 运用范畴言语

回想我刚开端写代码的时分,我习惯于遵循导师的主张。他们总是运用范畴特定的言语。其时,我并不了解这样做的重要性,乃至认为这只是为了显得更专业。

但是,当我开端独立开发项目时,我并没有运用范畴特定的言语。比方,在构建图书馆管理系统时,我不会运用 add_bookfind_book_by_titlelist_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.编写具有单一笼统等级的函数

在我阅览其他程序员编写的代码时,我常常发现一种普遍现象:一些程序员在编码时不会坚持单一的笼统等级。

用电视遥控器来了解笼统

在咱们探讨程序员在这方面的常见过错之前,让咱们先凭借一个简略的比方来了解什么是笼统——电视遥控器。

幻想一下,当咱们运用电视遥控器时,咱们并不需求了解电视内部的所有杂乱机制。例如,咱们不需求知道电视扬声器的音量是怎么改变的,或者遥控器上的某个按钮是怎么改动电视屏幕显现的。遥控器使咱们能够控制电视的杂乱功用,而不需求完全了解其内部作业原理。

浏览器示例

以任何网络浏览器为例,比方 Google Chrome。当你在浏览器中输入 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. 编程中没有固定的答案

在第一点中,我提到了不应该轻易把同享代码提取到库中。在第三点中,我主张编写具有单一笼统等级的函数。这两个准则看似对立,但实践上并不抵触。

我并没有说什么?

我并不是说你永久不应该把同享代码放入库中。只是要注意,当你测验将代码提取到单独的库时,确保这段代码不仅仅适用于当时项目,而且对其他项目也有用。假如提取出来的代码能协助你更好地安排代码,并提高可保护性,那么你应该去创立一个库。这其实是与编写单一笼统等级的函数准则相一致的。

在考虑是否将同享代码提取到库中时,你需求评估各种权衡因素。假如项目需求的代码行数不多,就不要经过添加不必要的额定代码来增加项目的杂乱性。

事物将持续改变

编程是一个不断演进的范畴。新的框架、准则和东西不断出现。在某些状况下被认为是最佳实践的办法,在其他状况下或许就不适用了。

因而,你应该尽量了解所有的最佳实践,但在做决议计划时需求依据项目需求和详细状况来定。面临同一个问题,或许有多种解决方案,关键在于依据详细的状况选择最合适的办法。