编程-命名-小技巧-杂记
文章目录
- 序
- 1.匿名变量
- 2.善用介词
- 3.拟物和比喻
- 4. 含义显化
- 5. 函数太难命名
序
个人认为编程的基本目标是程序完成指定任务。但为便于维护和多人协同开发,程序的可读性变得越来越重要。编程应该是一项以表达个人意图为目的的写作任务。
简单准确的表达,程序一定具备较高的可读性,简单而优雅。
如何简单优雅,因素多多,个人梳理如下:
- 英语 词汇量要够,语法要熟悉
- 遵从语法习惯
- 程序架构 分层清晰,各层抽象明了
- 统一性 同一个实体、概念等用同一个变量
要想提高命名能力个人认为:
- 多拜读佳作源码
- 多读多写领域相关英语文章
- 临时编程靠词典样例或者百度
下面是我个人编程中的小李子,以python为例子,如有更好方法欢迎留言斧正。
1.匿名变量
场景:求学生的成绩排名列表。学生的成绩数据放在student_score_dic
中,使用sorted函数进行排序后,需要取出学生排行榜student_ranking_list
。代码如下:
def rank(student_score_dic):
ranking_items = sorted(student_score_dic.items(), key=lambda x: x[1], reverse=True)
student_ranking_list = []
for stu, _ in ranking_items: # items中是一个一个的tuple,包含student和score两项,但是score对当前操作无关重要,所以使用'_'命名
student_ranking_list.append(stu)
return student_ranking_list
2.善用介词
1 保存文件
python中有很多保存数据到文件的方法,但是要保存的数据和目的文件这两个变量的顺序,有的函数数据在前,文件在后,有的则是相反。
保存函数一般用save和dump表示,常用的语法句式为save sth to/into sth
和dump sth to/into sth
。
所以,推荐的参数数据,应该是先数据再文件。在参数取名字的时候,建议在文件参数前面加上to,如下:
def save(data, to_file):
...
def save(data, to_filepath):
...
def dump(data, to_file):
...
由于介词to的存在,在定义参数的时候自然不会弄错顺序。
- dict变量命名
dict类型变量,一般是关系映射和表明属性,两种作用,如下: - 关系映射,也可以理解为转换。
# to 和 2 谐音
word2idx = {"word": 0, "are": 2}
idx = word2idx['word']
- 表明属性
# 词频指在某篇文章或者多篇文章中,每个单词出现的概率。
# 词频是词的属性。the frequency of word
frequency_of_word = {"word": 1, "are": 2, "is": 3}
freq = frequency_of_word["word"]
如果你认为表明属性也是一种转换关系的作用,感觉to比of好,这也OK。
3.拟物和比喻
拟物和比喻是写作的基本手法,其本质是用具象化的简单的事物解释难以理解的或难以描述之物。在编程中,亦有此妙用。
拟物在文学中就是以他物拟此物,达到惟妙惟肖的解释目的。如,“这些闪电的影子,在大海里蜿蜒游动,一晃就消失了。(高尔基《海燕》)”。
比喻更加简单了,比如:1901年的清王朝,日薄西山了。
写作中使用这些手法,文章容易理解,在编程时亦然。比如,我们需要从一个字符串中取出某子串,子串两边的有固定的字符串。如,我们需要从公司名深圳海燕科技有限公司
中取出公司商标海燕
,左边是城市或省名,右边是科技有限
、股份有限
的固定词语。这个动作就如用钳子
或镊子
夹取某物一样,左边和右边的固定词语是两片钳唇或者镊片。如此,工具类名字为MessagePlier
,夹取的动作用take
表示,钳唇是jaw
。
代码示例:
import re
class MessagePlier:
def __init__(self, jaws_lis):
self._jaws_regeices = [re.compile(f"{a}(.+?){b}") for a, b in jaws_lis]
def take(self, comp_name):
_jaws_regeices = self._jaws_regeices
msg = ""
for jaws_regex in _jaws_regeices:
result = jaws_regex.findall(content)
if result:
msg = result[0]
break
return msg
msg_plier = MessagePlier([("深圳"), ("科技有限")])
msg = msg_plier.take("深圳海燕科技有限公司")
print(msg)
输出:
海燕
4. 含义显化
class ModelNumber:
"""
找到所有的型号,比如BWD21234, GB2312, utf8, 23897479.
型号:数字和字母混合或者长的纯数字串。
"""
_name = MODELNUMBER_COMPONENT
def __init__(self):
self._letter_digital_regex = re.compile(r"\b[^\d]*\d+[^\d]*\b")
self._length_threshold = 5
def _is_model(self, string):
# 数字和字母混合
if re.search("\w", string):
return True
else:
# 长的纯字符串
be_long = len(string.strip()) >= self._length_threshold
return be_long
ModelNumber的_is_model
函数中,re.search('\w', string)
不够直接,将其结果用一个变量表示,就将这条语句的含义显化,方便阅读。修改后代码如下:
class ModelNumber:
...# 这里和上面重复,略略略
def _is_model(self, string):
# 含义显化
contained_letters = re.search("\w", string)
# 数字和字母混合
if contained_letters:
return True
else:
# 长的纯字符串
be_long_enough = len(string.strip()) >= self._length_threshold
return be_long_enough
5. 函数太难命名
当一个函数太难命名,有可能是功能太多,或者你说的太细致了。
# 1. 如果太细致,就概括地说
# 2. 如果功能太多,就拆成两个函数