我有两个耦合类DhcpServer
和SessionManager
. 我的规范中有以下要求导致了这种耦合:
DhcpServer
如果禁止,则不得发布 IP 地址租约SessionManager
(例如,创建会话时发生错误)SessionManager
必须在创建新租约时启动会话,DhcpServer
并在租约到期或被客户端明确释放时立即销毁会话- 另一方面,如果停止相应的会话(例如,系统管理员的请求),
DhcpServer
则必须销毁租约SessionManager
起初,将所有代码放在一个类中是很诱人的。但是职责是不同的,所以我把它们一分为二,创建了两个接口:
class ISessionObserver(object):
def onSessionStart(**kwargs): pass
def onSessionStop(**kwargs): pass
class IDhcpObserver(object):
def onBeforeLeaseCreate(**kwargs):
"""
return False to cancel lease creation
"""
pass
def onLeaseCreate(**kwargs): pass
def onLeaseDestroy(**kwargs): pass
然后我实现IDhcpObserver
了 inSessionManager
和ISessionObserver
in DhcpServer
。这导致了耦合。尽管这些类不直接相互依赖,但它们确实依赖于相互包中声明的接口。
稍后我想为会话启动添加另一个协议,使SessionManager
' 的逻辑保持不变。我也不希望它实现IAnotherProtocolObserver
。
同样的 DHCP 服务器也与我的会话概念无关。由于 Twisted(我正在使用)没有 DHCP 协议实现,我想将它作为一个单独的项目发布,它既不依赖也不依赖SessionManager
于它的包。
如何在保持代码块松散耦合的同时满足我的规范要求?