python - 使用协程和函数作为 Python 中的方法保持 SOLID 和 DRY

标签 python python-3.x dry solid-principles

我有那个代码示例:

from time import sleep
import asyncio

class bird:

    def __init__(self, sleeptime=1):
        self.var = sleeptime

    def wait_meep(self):
        sleep(self.var)
        print("Meep")

    def do_sth(self):
        print("Dop Dop Do do ...")


class bird_async:

    def __init__(self, sleeptime=1):
        self.var = sleeptime

    async def wait_meep(self):
        await asyncio.sleep(self.var)
        print("Meep")

    def do_sth(self):
        print("Dop Dop Do do ...")
如您所见,两个客户端大多相同,并且应包含相同的名称(以便每个人都知道会发生什么)。现在我想成为DRY并写 bird_async(bird) .因为 bird 中的每个分机应在 bird_async 中使用以及。这是可能的,但我的同事说,它不是 SOLID,因为我已经覆盖了 wait_meep .现在我正在寻找不同的灵魂并找到抽象类。
我不知道的是,如果创建一个抽象类 birdBase(ABC)也将是 SOLID。我也会在那里覆盖,因为首先它是一个函数,然后是一个协程,或者我在这里错了?
什么是 SOLID 和 DRY 解决方案可以将这两个类组合在一起,而无需重命名方法?

最佳答案

DRY 解决方案是您已经做过的某种子类化。
我认为在您的条件下很难实现“可靠”解决方案。事实是,你有两个函数wait_meep ,它们实际上具有不同的签名和语义。即, sleep 间隔的第一个块,可以是任意长的。第二个 OTOH 是异步的,即需要特殊的调用语义并并发运行。
一个有点类似的案例是 Queue标准库中的类。你有 getget_nowait方法相同,方法不同。第二个例子可能是 __iter____aiter__方法。
所以我认为唯一“正确”的解决方案是重命名其中一种方法。这会产生副作用,即您可以将其全部编写为一个类,即减少移动部件的数量。

关于python - 使用协程和函数作为 Python 中的方法保持 SOLID 和 DRY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63614899/

相关文章:

python - 从等高线图中完全删除轴

json - 将 JSON 从数据框上传到 firebase

python - 如何在 Python 中初始化元组子类的实例?

c++ - 在创建 C++ 枚举和依赖数据结构时如何避免重复自己?

graphql - 如何在多种类型上使用 GraphQL 片段

Python:生成不在列表中的随机整数

Python:创建文本文件,写入,替换字符串

python - 如何使用 python/pandas 根据一列中的字符串拆分和复制行?

python - 性能 - 在 Python 中比较 2 个大型字符串列表的最快方法

ruby-on-rails - 删除 Rails 中的关联模型