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 解决方案可以将这两个类组合在一起,而无需重命名方法?
DRY 解决方案是您已经做过的某种子类化。
我认为在您的条件下很难实现“可靠”解决方案。事实是,您有两个函数wait_meep,它们实际上具有不同的签名和语义。即,睡眠间隔的第一个块,可以是任意长的。第二个 OTOH 是异步的,即需要特殊的调用语义并并发运行。
一个有点类似的情况是Queue标准库中的类。你有get和get_nowait方法做同样的事情,以不同的方式。第二个例子可能是__iter__和__aiter__方法。
所以我认为唯一“正确”的解决方案是重命名其中一种方法。这会产生副作用,您可以将其全部编写为一个类,即减少移动部件的数量。
| 归档时间: |
|
| 查看次数: |
184 次 |
| 最近记录: |