Go言語 ファサードパターンとインターフェース分離原則の実践
Go言語でファサードパターンとインターフェース分離原則を組み合わせる 実践における手順:
- ファサードインターフェース(Facade Interface)を定義します。ファサードインターフェースは、サブシステム内で関連する一連のインターフェースに対する簡潔な抽象化で、サブシステム内の各種の操作を、クライアントが使用できるシンプルなインターフェースにまとめています。Go言語では、インターフェイスタイプを使用してファサードインターフェースを定義できます。
type SubSystemFacade interface {
Operation() string
}
- ファサードの実装:ファサードインターフェイスを実装し、サブシステムのさまざまな操作を内部で呼び出して、それを簡単なインターフェイスに組み合わせる。
type subSystemFacade struct {
subsystem1 SubSystem1
subsystem2 SubSystem2
}
func NewSubSystemFacade() SubSystemFacade {
return &subSystemFacade{
subsystem1: NewSubSystem1(),
subsystem2: NewSubSystem2(),
}
}
func (s *subSystemFacade) Operation() string {
result := ""
result += s.subsystem1.Operation1()
result += s.subsystem2.Operation2()
return result
}
- サブシステムインターフェースの定義: サブシステムインターフェースはサブシステム内の個々の具体的なインターフェースの抽象化であり、インターフェース分離原則の実装に利用されます. Go言語では、インターフェイスタイプを使用してサブシステムインターフェースを定義できます.
type SubSystem1 interface {
Operation1() string
}
type SubSystem2 interface {
Operation2() string
}
- サブシステムインターフェイスの実装(Subsystem Implementation):サブシステムインターフェイスを実装し、具体的操作を提供する。
type subSystem1 struct{}
func NewSubSystem1() SubSystem1 {
return &subSystem1{}
}
func (s *subSystem1) Operation1() string {
return "Subsystem1 operation\n"
}
type subSystem2 struct{}
func NewSubSystem2() SubSystem2 {
return &subSystem2{}
}
func (s *subSystem2) Operation2() string {
return "Subsystem2 operation\n"
}
- クライアントはファサードインターフェイスを利用する。これによりクライアントはサブシステムのオペレーションをファサードインターフェイスを通して利用することができ、サブシステムのインターフェイスと直接やり取りする必要がなくなる。
func main() {
facade := NewSubSystemFacade()
result := facade.Operation()
fmt.Println(result)
}
上述の手順により、Go言語でファサードパターンとインターフェース分離原則を組み合わせることができました。ファサードインターフェースはサブシステムの操作を簡単なインターフェースにまとめ、サブシステムの複雑さをクライアントから隠します。一方、インターフェース分離原則により、サブシステム内の具体的なインターフェースは独立かつ保守容易なものになります。これにより、コードのテスト可能性、保守性、拡張性が高まります。