50个成为优秀程序员的法则[21-30]
目录
原文链接: 50 Coding Laws That Would Make You A Decent Programmer.
21. 避免魔法数字
魔法数字是一个硬编码的值,可能会在稍后阶段更改,但因此很难更新。
# ❌
SELECT TOP 50 * FROM orders
# ✅
NUM_OF_ORDERS = 50
SELECT TOP NUM_OF_ORDERS * FROM orders
22. 避免深度嵌套
# ❌
if x:
if y:
do_something()
# ✅
if x and y:
do_something()
23. 避免临时变量
# ❌
temp_result = calculate(x, y)
final_result = temp_result * 2
# ✅
final_result = calculate(x, y) * 2
24. 避免使用神秘的缩写
# ❌
def calc(x, y):
pass
# ✅
def calculate_total_price(quantity, unit_price):
pass
25. 避免硬编码Path
# ❌
file_path = "/path/to/file.txt"
# ✅
import os
file_path = os.getenv("FILE_PATH")
26. 使用使用Try…Catch…Finally语句
在编写代码时,最好也包括错误处理。这有助于加快调试过程并提高代码的复杂性,同时保持干净和可管理。
27. 异常处理时提供Context
每当你捕获异常时,它应该为遇到它的任何人提供足够的Context来知道问题来自哪里并进行相应的调试。
28. 避免使用多个异常类处理异常
作者认为如下的处理方式是极其虚假的,并且带走了它在错误处理中提供的额外帮助(在冗长、复杂性和维护方面)。
try:
pass
except ValueError:
pass
except TypeError:
pass
except IndexError:
pass
except KeyError:
pass
except FileNotFoundError:
pass
他认为通常最好使用更通用的异常来捕获我们可能遇到的任何类型的错误。默认情况下,这种类型的异常包括我们得到的错误类型。
try:
pass
except Exception:
pass
仅当您希望所有其他错误通过时,才具体说明您要捕获的错误类型。
29. 函数要么执行副作用,要么返回值,但不应同时做这两件事
如果函数改变了传递的参数,我们只需要在该函数中执行此操作,而无需其他任何操作。
def changed(array):
array.append('hello')
如果参数用于创建另一个变量,那么它不会被修改。例如,如果使用名为time的参数来计算距离,那么它不会变异,这意味着可以在该函数中返回距离。
def calculate_distance(time, speed):
distance = speed * time
return distance
但是有一种方法可以两全其美。您可以复制函数的参数并对其进行变异。这样我们就可以避免任何副作用。
def changed(array):
array_copy = array[:]
array_copy.append(4)
return array_copy
30. 并非所有函数名称都应该是动词
所有的函数名都应该是动词,这通常是正确的,但是有时候函数名应该采取名词的形式。
如果一个函数返回一些东西而不改变它的参数,那么这个函数的名字应该是一个名词。如果一个函数改变了参数并且没有返回任何参数,它应该是一个动词。
这是Python本身内置的通用约定。排序和追加等方法是动词,因为它们改变了数据类型并返回无,而 sort
、 sum
、 product
等方法都是名词,因为它们不会改变传递的任何参数并返回数据的新副本。