我有那个代码示例:
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
标准库中的类。你有 get
和 get_nowait
方法相同,方法不同。第二个例子可能是 __iter__
和 __aiter__
方法。
所以我认为唯一“正确”的解决方案是重命名其中一种方法。这会产生副作用,即您可以将其全部编写为一个类,即减少移动部件的数量。
关于python - 使用协程和函数作为 Python 中的方法保持 SOLID 和 DRY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63614899/