python - 如何在Python中应用闭-开和控制反转原理?

标签 python design-patterns architecture clean-architecture

现在正在构建一个新的应用程序,在阅读了 Uncle Bob 的《Clean Architecture》一书后,我遵循了“封闭-开放”和“控制反转”原则的实现部分,并为此付出了很多努力。

如何用 Python 实现它们?

通常,这两个原则齐头并进,并在 UML 中描述为将控制从模块/包 A 反转到 B 的接口(interface)

我很困惑,因为:

  • Python 不像 Java 和 C++ 那样拥有接口(interface)。是的,有 ABC@abstractmethod,但它不是 Pythonic 风格,从我的角度来看,如果你不开发框架,它是多余的
  • 将一个类传递给另一个类的方法(我理解这是一种实现开闭原则的方法)在 Python 中有点危险,因为它没有一个可以捕获问题的编译器(并且将会)如果两个松散耦合的对象之一发生变化,就会发生
  • 在忽略接口(interface)并将顶级类传递给较低级别​​的类之后...我仍然需要在顶部模块的某个位置导入所有内容。这样一来,整个事情就被违反了。

所以,正如你所看到的,我非常困惑,并且很难根据我的设计进行编程。我想出了。你能帮我一下吗?

最佳答案

您只需传递一个实现您需要它实现的方法的对象。

确实,没有“接口(interface)”来定义这些方法必须是什么,但这就是 python 中的方式。

您始终传递必须是列表、映射、元组或其他形式的参数,并且这些参数都没有经过类型检查。您可以编写代码来调用这些东西上的任何内容,并且在该代码实际执行之前,Python 不会注意到任何类型的问题。

当您需要这些参数来实现您正在使用的任何 IoC 接口(interface)时,情况完全相同。确保在评论中详细说明要求。

是的,这非常危险。这就是为什么我们更喜欢具有复杂接口(interface)的大型系统的静态类型语言。

关于python - 如何在Python中应用闭-开和控制反转原理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58828666/

相关文章:

数组与标量中的python赋值

oop - 学习/实现设计模式(针对新手)

ruby-on-rails - 合并多个 Rails 应用程序,并能够启用/禁用每个应用程序

architecture - 领域对象设计

python - 如何在hdf5表中存储空值?

python - 在 Python 中获取组之间的累积平均值

python - 如何检查亚马逊S3上的两个大文件是否相同?

JavaScript 代码组织建议/代码审查

java - android单例与静态方法

java - 如何确保在禁用 JavaScript 的情况下运行网站