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

zon*_*onk 7 python dry python-3.x 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 ...")
Run Code Online (Sandbox Code Playgroud)

如您所见,两个客户端大多相同,并且应包含相同的名称(以便每个人都知道会发生什么)。现在我想干脆bird_async(bird)。因为每个扩展 in 也bird应使用 in bird_async。这是可能的,但我的同事说,它不是 SOLID,因为我已经覆盖了wait_meep. 现在我正在寻找不同的灵魂并找到抽象类。我不知道的是,如果创建一个抽象类birdBase(ABC)也是 SOLID。我也会在那里覆盖,因为首先它是一个函数,然后是一个协程,或者我在这里错了?

什么是 SOLID 和 DRY 解决方案可以将这两个类组合在一起,而无需重命名方法?

Tor*_*ein 6

DRY 解决方案是您已经做过的某种子类化。

我认为在您的条件下很难实现“可靠”解决方案。事实是,您有两个函数wait_meep,它们实际上具有不同的签名和语义。即,睡眠间隔的第一个块,可以是任意长的。第二个 OTOH 是异步的,即需要特殊的调用语义并并发运行。

一个有点类似的情况是Queue标准库中的类。你有getget_nowait方法做同样的事情,以不同的方式。第二个例子可能是__iter____aiter__方法。

所以我认为唯一“正确”的解决方案是重命名其中一种方法。这会产生副作用,您可以将其全部编写为一个类,即减少移动部件的数量。