编程语言
首页 > 编程语言> > python – 当规范坚持时,如何避免类耦合

python – 当规范坚持时,如何避免类耦合

作者:互联网

我有两个耦合类DhcpServer和SessionManager.我的规格中有以下要求导致了这种耦合:

>如果SessionManager禁止,则DhcpServer不得发出IP地址租约(例如,在创建会话时发生错误)
> SessionManager必须在DhcpServer创建新租约时启动会话,并在租约到期或客户明确释放后立即销毁会话
>另一方面,如果SessionManager停止相应的会话(例如,通过sysadmin的请求),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也不依赖于它的包.

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

解决方法:

解耦类的好方法是使用events.

所以你需要做的是在事情发生时“发射”事件.示例:当SessionManager可以创建会话时,发送事件“session created”.使DhcpServer侦听该事件并在收到它时准备租约.

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

这个解决方案的优点在于它可以保持一切简单.编写单元测试时,您将始终只需要其中一个类,因为您只需检查是否已触发正确的事件.

标签:python,design-patterns,architecture,decoupling
来源: https://codeday.me/bug/20190901/1786335.html