私は2つの結合されたクラスDhcpServer
とSessionManager
. その結合につながった仕様で次の要件を取得しました。
DhcpServer
禁止されている場合は、IP アドレスのリースを発行してはなりませんSessionManager
(たとえば、セッションの作成中にエラーが発生した場合)。SessionManager
新しいリースの作成時にセッションを開始し、DhcpServer
そのリースが期限切れになるかクライアントによって明示的に解放されるとすぐにセッションを破棄する必要があります- 一方、対応するセッションが停止した
DhcpServer
場合は、リースを破棄する必要がありますSessionManager
(たとえば、sysadmin の要求によって)。
最初は、すべてのコードを 1 つのクラスにまとめたいという誘惑にかられました。しかし、責任は別のものだったので、私はそれらを 2 つに分割し、2 つのインターフェイスを作成しました。
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
しました。そして、それがカップリングにつながりました。クラスは互いに直接依存していませんが、互いのパッケージで宣言されているインターフェースに依存しています。SessionManager
ISessionObserver
DhcpServer
SessionManager
後で、セッション開始用の別のプロトコルを追加して、のロジックをそのままにしたいと考えています。私もそれを実装したくありませんIAnotherProtocolObserver
。
また、DHCP サーバー自体は、私のセッションの概念とは何の関係もありません。また、Twisted (私が使用している) には DHCP プロトコルの実装がないためSessionManager
、パッケージにも依存関係のない別のプロジェクトとしてリリースしたいと考えました。
コードの断片を疎結合に保ちながら、仕様要件を満たすにはどうすればよいですか?