Python 风格指南:如何避免在大项目中陷入混乱
Django==2.2.5 在下面的示例中,有两个自定义过滤器和两个辅助函数。 这是一个假的例子,不是一个真正的代码 此代码有两个问题:Python 风格指南:如何避免在大项目中陷入混乱,python,django,module,Python,Django,Module,Django==2.2.5 在下面的示例中,有两个自定义过滤器和两个辅助函数。 这是一个假的例子,不是一个真正的代码 此代码有两个问题: 当一个项目变得很大时,我忘记了我已经编写的aux函数。更不用说团队编程了。这里的解决方案是什么?为可导入的功能组织单独的模块?按字母顺序排序 这里的一些函数可以在这个包之外重用,而有些函数则不能。比如说,combine函数似乎是可重用的,而get\u salted\u str肯定只适用于此模块。我认为最好是区分可能导入的功能和可能不导入的功能。使用下划线符号标
get\u salted\u str
肯定只适用于此模块。我认为最好是区分可能导入的功能和可能不导入的功能。使用下划线符号标记未修改的函数是否更好?像这样:\u吃盐\u吃str
。这可能会稍微缓解第一个问题def combine(str1, str2):
return "{}_{}".format(str1, str2)
def get_salted_str(str):
SALT = "slkdjghslkdjfghsldfghaaasd"
return combine(str, SALT)
@register.filter
def get_salted_string(str):
return combine(str, get_salted_str(str))
@register.filter
def get_salted_peppered_string(str):
salted_str = get_salted_str(str)
PEPPER = "1234128712908369735619346"
return "{}_{}".format(PEPPER, salted_str)
get_salted_str
“protected”(单前导下划线)名称用于模块的客户端代码不应该弄乱甚至不应该知道的实现部分,这称为“封装”,其目的是允许在不破坏客户端代码的情况下进行实现更改
在您的示例中,get\u salted\u str()
是一个模板过滤器,因此它显然是包的公共API的一部分
另外,combine
看起来确实像是一个实现细节——另一个包中一些不相关的代码可能需要使用相同的分隔符组合两个字符串这一事实似乎是偶然的,如果将combine
作为模块API的一部分公开,则无论如何都无法更改其实现。从您的示例中我可以看出,这是一个典型的实现函数(而且它非常琐碎,我认为它不值得作为ar公开)
作为一个更一般的层面:虽然避免重复是一个非常可听的目标,但你必须小心做得过火。有些复制实际上是“偶然的”——在某个时间点,代码中两个完全不相关的部分有几行相同,但原因完全不同,可能导致代码中一个点发生更改的力与另一个部分完全不相关。因此,在分解看似重复的代码之前,问问自己,这段代码是否出于同样的原因在做同样的事情,以及在一部分中更改这段代码是否也会影响到另一部分
现在必须说,适当的模块化——如适当的命名等——是很难做到的。它需要时间和经验(以及大量的反思)来培养(不是双关语,而是…)对它的“感觉”,即使这样,你也经常发现自己在项目的生命周期中会重新组织很多事情。而且,几乎总会有一些混乱的地方,因为有时发现一个给定的特性真正属于哪里有点胡乱猜测(提示:寻找名为“util”或“utils”或“helpers”的模块或包-这些通常是开发人员重新组合不明确属于其他任何地方的东西的地方).有很多方法可以做到这一点,所以我总是这样处理: 1。项目中的可重用功能 首先也是最重要的:文件。在大团队中工作时,您肯定需要记录可重用功能。 第二,包装。当创造大量的