2017-06-15 8 views
1

私は、ベースコードベースに大きく依存するプロジェクトに取り組んでいます。ベースコードでは、(ここでは単純化)に定義されたインタフェースがあり、私たちのプロジェクトのためにeventWatcherGo:インタフェースのオプションメソッド

//Baselibrary.go: 
    package base 
    type eventHandle interface { 
     eventHookTypeA 
     eventHookTypeB 
     someOtherMethod() results 
    } 
    type eventHookTypeA interface { 
     // method definitions 
     HandleEventA() results 
    } 
    type eventHookTypeB interface { 
     // method definitions 
     HandleEventB() results 
    } 

    func handleEvents(eventType string, handle eventHandle) results { 
      if eventType == "eventA" { 
      return handle.HandleEventA() 
      } else if eventType == "eventB" { 
      return handle.HandleEventB() 
      } 
      return nil 
    } 

と呼ばれる、我々は今、私たちのプロジェクトに排他的である3番目のイベントタイプ(例。eventTypeC)をhavee。 1つの方法は、基本クラスに第3のインタフェース定義(eventHookTypeC)を追加し、それに応じて独自のプロジェクトコードで実装することです。しかし、CI環境では、この新しいバージョンのBaselibrary.goを使用し、他のすべてのプロジェクトをビルドします。これは、eventHookTypeCのインプリメンテーションが不足しているために失敗します。

私たちのビルド環境やリポジトリを変更するのとは別に、他のプロジェクトのコードを変更することなく、これを回避する方法がありますか?

答えて

7

これは、たとえば次のように実行できます。 http.Pusherまたはio.Closer。 「オプション」メソッドを使用して新しいインターフェイスを作成し、元のインターフェイスを渡します。オプションのメソッドを実行する場合は、型アサーションを使用して、他のインタフェースを実装している値があるかどうかをチェックし、そうであればメソッドを呼び出します。

type eventHandle interface { 
    eventHookTypeA 
    eventHookTypeB 
    // DON'T add TypeC interface. 
    someOtherMethod() results 
} 
type eventHookTypeA interface { 
    // method definitions 
    HandleEventA() results 
} 
type eventHookTypeB interface { 
    // method definitions 
    HandleEventB() results 
} 
type eventHookTypeC interface { 
    HandleEventC() results 
} 

func handleEvents(eventType string, handle eventHandle) results { 
     if eventType == "eventA" { 
     return handle.HandleEventA() 
     } else if eventType == "eventB" { 
     return handle.HandleEventB() 
     } else if eventType == "eventC" { 
     if c,ok := handle.(eventHookTypeC); ok { 
      return c.HandleEventC() 
     } else { 
      log.Println("somewhat bad happen") 
     } 
     } 
     return nil 
} 
関連する問題