我有两个耦合类DhcpServer
和{
DhcpServer
如果SessionManager
禁止发布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
,在{
稍后,我想为会话启动添加另一个协议,使SessionManager
的逻辑保持不变。我不希望它也实现IAnotherProtocolObserver
。在
同样,DHCP服务器本身与我的会话概念无关。由于Twisted(我正在使用的)没有DHCP协议实现,我想将它作为一个独立的项目发布,既不依赖SessionManager
也不依赖于它的包。在
如何在保持代码段松散耦合的同时满足规范要求?在
解耦类的一个好方法是使用events。在
所以你需要做的就是在事情发生时“触发”事件。示例:当
SessionManager
可以创建会话时,发送事件“session created”。使DhcpServer
侦听该事件,并在接收到该事件时准备租约。在现在您只需要一个第三个类来创建另外两个并配置事件侦听器。在
这个解决方案的优点在于它使一切都变得简单。当您编写单元测试时,您总是只需要其中一个类,因为您只需要检查是否触发了正确的事件。在
相关问题 更多 >
编程相关推荐