【发布时间】:2012-08-18 17:18:06
【问题描述】:
我有两个耦合类DhcpServer 和SessionManager。我的规范中有以下要求导致了这种耦合:
-
如果
SessionManager禁止,DhcpServer不得发布 IP 地址租约(例如,创建会话时出错) -
SessionManager必须在DhcpServer创建新租约时启动会话,并在租约到期或被客户端明确释放时立即销毁会话 - 另一方面,如果
SessionManager停止了相应的会话(例如,系统管理员的请求),DhcpServer必须销毁租约
起初很想将所有代码放在一个类中。但是职责是不同的,所以我将它们一分为二,并创建了两个接口:
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
然后我在SessionManager 中实现了IDhcpObserver,在DhcpServer 中实现了ISessionObserver。这导致了耦合。尽管这些类不直接相互依赖,但它们确实依赖于相互包中声明的接口。
稍后我想添加另一个用于会话启动的协议,使SessionManager 的逻辑保持不变。我也不希望它实现IAnotherProtocolObserver。
同样的 DHCP 服务器也与我的会话概念无关。由于 Twisted(我正在使用)没有 DHCP 协议实现,我想将它作为一个单独的项目发布,它既不依赖于 SessionManager 也不依赖于它的包。
如何在保持代码片段松散耦合的同时满足规范要求?
【问题讨论】:
标签: python design-patterns architecture decoupling