CM 是 Code Master 的缩写,希望在这个模块里和你讨论「如何优雅的写代码?

1 重要性

在代码编写中,写的最多的绝对是各种函数、变量等的名称,而大多数这些名称都需要你通过主观想法指定。 很多人不在意这些,觉得没什么用。觉得即是有用的,好的和坏的也差不了多少,实在不行加点注释就好了。 其实一个好的名字,不仅能让代码变得易于理解,更能提升编码效率,而且会令人赏心悦目。

举个🌰:

# 反例
i1 = 2
j2 = 3
ll = i1 + j2
print(ll)
# 正例
score_first = 2
score_second = 3
total_score = score_first + score_second
print(total_score)

对比「正例」和「反例」,你更喜欢哪个?

2 命名原则

1 名副其实

名字要表达它本身的含义。

# 反例
d = 2 # 创建了多少天
# 正例
days_since_creation = 2 # 根本不需要注释

2 避免误导

名字要警惕和保留字,已经一些有歧义的缩写等冲突。

# 反例
with = [1, 2, 3]
l = 1
# 正例
l_nums = [1, 2, 3] # with 是 python 的保留字
label = 1 # l 和 1 很容易弄混,类似的还有 0 和 O

3 有意义的区分

没有意义的区分容易造成误解,引起不必要的麻烦。

# 反例
def copy_char(a1, a2):
  pass

get_mongo()
get_mongo_info()
# 正例
def copy_char(source, destionation): # 上文中的 a1 a2 并没有提供出正确的信息
  # 其中的1、2也被称为魔法数字,是因为它是莫名其妙的出来的
  pass

get_mongo() # get_mongo 和 get_mongo_info 在没有特殊约定的条件下很难区分

4 使用读得出来的名字

人类的大脑有一块重要的功能是用来处理语言的,加以善用,事半功倍。

# 反例
def gen_ymdhms(): # 生成日期,年、月、日、时、分、秒
  pass # 你试试读下这个函数名
# 正例
def generation_timestamp(): # 你再读下这个
  pass

5 使用可搜索的名称

先说一条原则:

名称长短应与其作用域大小相对应。

想要从一大篇文字中找到单字母变量不是一件容易的事情,因为包含这个字母的代码太多了。

# 反例
d = 3 # 搜索 d 的话,会找很久
# 正例
days_since_creation = 3 # 搜索这个名字,可以快速定位

3 最后的话

取个好名字真的很不容易,需要良好的描述和共有的文化背景,但是这些规则会对代码质量有着很大的提升。

4 参考