如何在 Python 中应用 Closed-Open 和 Inversion of Control 原则?
How to apply Closed-Open and Inversion of Control principles in Python?
现在正在构建一个新的应用程序,并且在阅读 Uncle Bob 的 Clean Architecture 书后遵循的 "Closed-Open" 和 "Inversion of Control" 原则的实现部分苦苦挣扎。
如何在 Python 中实现它们?
通常,这两个原则齐头并进,并在 UML 中描述为 Interface
从 module/package A 到 B 的反向控制。
我很困惑,因为:
- Python 不像 Java 和 C++ 那样拥有
Interface
。是的,有 ABC
和 @abstractmethod
,但它不是 Pythonic 风格,如果你不开发框架,在我看来是多余的
- 将 class 传递给另一个方法(我理解这是一种实现开闭原则的方法)在 Python 中有点危险,因为它没有如果两个松散耦合的对象之一发生变化,编译器可能(并且将会)发生问题
- 在忽略接口并将顶级 class 传递给低级接口之后...我仍然需要在顶级模块的某处导入所有内容。这样一来,整个事情就被违反了。
因此,如您所见,我非常困惑并且很难根据我的设计进行编程。我想出了。你能帮帮我吗?
您只需传递一个实现您需要它实现的方法的对象。
是的,没有 "Interface" 来定义这些方法必须是什么,但这就是 python.
中的方式
你一直在传递必须是列表、映射、元组或其他任何参数的参数,其中 none 是类型检查的。您可以编写代码来调用这些东西上的任何内容,并且 python 在实际执行该代码之前不会注意到任何类型的问题。
当您需要这些参数来实现您正在使用的任何 IoC 接口时,情况完全相同。请务必在评论中详细说明要求。
是的,这很危险。这就是为什么对于具有复杂接口的大型系统,我们更喜欢静态类型语言。
现在正在构建一个新的应用程序,并且在阅读 Uncle Bob 的 Clean Architecture 书后遵循的 "Closed-Open" 和 "Inversion of Control" 原则的实现部分苦苦挣扎。
如何在 Python 中实现它们?
通常,这两个原则齐头并进,并在 UML 中描述为 Interface
从 module/package A 到 B 的反向控制。
我很困惑,因为:
- Python 不像 Java 和 C++ 那样拥有
Interface
。是的,有ABC
和@abstractmethod
,但它不是 Pythonic 风格,如果你不开发框架,在我看来是多余的 - 将 class 传递给另一个方法(我理解这是一种实现开闭原则的方法)在 Python 中有点危险,因为它没有如果两个松散耦合的对象之一发生变化,编译器可能(并且将会)发生问题
- 在忽略接口并将顶级 class 传递给低级接口之后...我仍然需要在顶级模块的某处导入所有内容。这样一来,整个事情就被违反了。
因此,如您所见,我非常困惑并且很难根据我的设计进行编程。我想出了。你能帮帮我吗?
您只需传递一个实现您需要它实现的方法的对象。
是的,没有 "Interface" 来定义这些方法必须是什么,但这就是 python.
中的方式你一直在传递必须是列表、映射、元组或其他任何参数的参数,其中 none 是类型检查的。您可以编写代码来调用这些东西上的任何内容,并且 python 在实际执行该代码之前不会注意到任何类型的问题。
当您需要这些参数来实现您正在使用的任何 IoC 接口时,情况完全相同。请务必在评论中详细说明要求。
是的,这很危险。这就是为什么对于具有复杂接口的大型系统,我们更喜欢静态类型语言。