首页 > 解决方案 > “清洁代码”的函数参数编号指南是否适用于 API 设计?

问题描述

我是一个新手阅读鲍勃叔叔的清洁密码书。

尽可能少地限制函数参数的数量确实是一种很好的做法。但是我仍然遇到许多库中提供的许多需要大量参数的函数。例如,在 Python 的 pandas 中,有一个有9 个参数的函数:

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=<object object>, observed=False, dropna=True)

(而且这个函数也违反了关于标志参数的建议)

似乎这种情况在 Python 标准库中要少得多,但我仍然设法找到一个有 4 个参数的情况:

re.split(pattern, string, maxsplit=0, flags=0)

我知道这只是一个建议而不是灵丹妙药,但它适用于上述内容吗?

标签: pythondesign-patterns

解决方案


要注意的第一点是所有这些论点groupby都是相关的。您可以通过使用不同的版本来减少参数的数量,groupby但是当参数可以彼此独立应用时,这并没有多大帮助,就像这里的情况一样。同样的逻辑也适用于re.split.

确实,从维护的角度来看,整数“标志”参数可能是狡猾的 - 如果您想更改代码中的标志值会发生什么?您必须搜索并手动修复每个案例。传统的方法是使用enums (将数字映射到单词,例如Day枚举将有 Day.Sun = 0、Day.Mon = 1 等)在 C++ 或 C# 等编译语言中,这为您提供了在引擎盖下使用整数的速度但是在代码中使用标签/单词的可读性。但是enumPython 中的 s 很慢。

我认为适用于任何源代码的一条规则是避免“幻数”,即直接出现在源代码中的数字。这enum是一种解决方案。另一种解决方案是使用常量变量来表示不同的标志设置。Python排序支持常量(然后导入的大写变量名constant.py)但是它们只是按照约定是常量,您实际上可以更改它们的值:(


推荐阅读