我正在研究一个在两个产品之间共享的python类。 90%的功能适用于这两种产品。对于不同的10%,代码中充满了这种东西:
#Start of file
project = 'B'
#Some line of code
if project == 'A':
import moduleA
elif project == 'B':
import moduleB
#Many lines of code
if project == 'A':
print moduleA.doA(2)
elif project == 'B':
print moduleB.doB(2)
这似乎不是很优雅或非常易读,有没有人遇到过这种事情?有更好的方法吗?
答案 0 :(得分:3)
不,因为这是非常糟糕的设计。如果模块的行为受到使用它的项目的影响,那么它应该接受对象,函数或其他针对项目特定行为的回调。我的建议是分解共享的部分并将它们组成一个单独的模块,对于任何特定于项目的东西,添加对需要传入的对象的依赖,并要求该对象符合某个接口。然后,将项目特定的行为包装在符合所需接口的对象中,并将其传递给公共共享模块。
答案 1 :(得分:0)
您的共享模块应该实现一个基类,该基类具有使用模块共同的功能,然后每个使用模块将子类化该基类并添加或调整必要的内容。还有其他好方法(例如@ Michael的答案中的建议,称为依赖注入设计模式),但通常子类化和覆盖是为不同的特定需求“定制”功能的最简单方法(它确实导致高和刚性耦合,但这通常是可以接受的简单成本)。
答案 2 :(得分:0)
另一种可能的方法是,如果到目前为止给出的两个答案都不实用,那就是在导入级别定义接口。例如:
if project == 'A':
from moduleA import doA as doproject
elif project == 'B':
from moduleB import doB as doproject
# many lines of code
doproject(2)
这个概念(虽然不是这个特定的问题)是“将X导入Y”真的很有用的事情之一。
你也可以更聪明地根据项目名称构建导入,制作一个由项目键入的字典,该字典具有要调用的模块的值,以及那种东西。但是我不会去那个方向,除非我真的确定重构所以我可以通过我需要的模块无法工作。