3

我有两个耦合类DhcpServerSessionManager. 我的规范中有以下要求导致了这种耦合:

  • 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了 inSessionManagerISessionObserverin DhcpServer。这导致了耦合。尽管这些类不直接相互依赖,但它们确实依赖于相互包中声明的接口。

稍后我想为会话启动添加另一个协议,使SessionManager' 的逻辑保持不变。我也不希望它实现IAnotherProtocolObserver

同样的 DHCP 服务器也与我的会话概念无关。由于 Twisted(我正在使用)没有 DHCP 协议实现,我想将它作为一个单独的项目发布,它既不依赖也不依赖SessionManager于它的包。

如何在保持代码块松散耦合的同时满足我的规范要求?

4

1 回答 1

5

解耦类的一个好方法是使用事件

因此,您需要做的是在发生某些事情时“触发”事件。SessionManager示例:当可以创建会话时发送事件“会话已创建” 。DhcpServer侦听该事件并在收到该事件时准备租约。

现在您需要的只是第三个类,它创建另外两个并配置事件侦听器。

这个解决方案的美妙之处在于它让一切变得简单。当您编写单元测试时,您总是只需要其中一个类,因为您只需要检查是否触发了正确的事件。

于 2012-08-23T08:50:19.547 回答