如何避免类耦合时规范坚持i

2024-09-28 01:22:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个耦合类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也不依赖于它的包。在

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


Tags: 代码规范协议客户端objectdefpassdhcp
1条回答
网友
1楼 · 发布于 2024-09-28 01:22:57

解耦类的一个好方法是使用events。在

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

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

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

相关问题 更多 >

    热门问题