依存性注入(Golang)

依存性注入(DI : Dependency Injection)は他の言語でもありますが、Goの場合にはより構造が単純化されると思います。

以下のコードは、

https://qiita.com/lostfind/items/cae2bca46d903bea167c

からですが、DIを使わないと電球の種類が変わる都度、部屋の工事が必要になるのですが、DI使って部屋にはソケットだけ用意して電球の種類はmain()ルーチンで簡単に変えられるようにしています。DIのメリットは変更発生時の変更範囲が分離されることと、テストが容易(関連するモジュールがなくてもできる)あたりがメリットになるでしょう。プログラムのライフサイクルで保守が大きな比重を占める訳なので、変更に強いコードと言えます。反面コードはその分冗長になります。

package main

import (
	"fmt"
)

func main() {
    lightOne := new(Incandescent) 	// only change these lines if new lighting is introduced
    lightTwo := new(LedLight)		//

    myRoom := NewRoom(lightOne, lightTwo) // DI or object Injection

    myRoom.SwitchOnOne()
    myRoom.SwitchOnTwo()
}

type LightSocket interface {
    LightUp() string
}

// room has two sokets
type Room struct {
    LightOne LightSocket		// prepare only socket, not bulb
    LightTwo LightSocket
}

// define switch on method of the two sockets
func (r *Room) SwitchOnOne() {
    fmt.Println("1番照明:", r.LightOne.LightUp())
}
func (r *Room) SwitchOnTwo() {
    fmt.Println("2番照明:", r.LightTwo.LightUp())
}

// Constructor Injection
func NewRoom(lightOne, lightTwo LightSocket) *Room {
    room := &Room{
        LightOne: lightOne,
        LightTwo: lightTwo,
    }
    return room
}

// Led light
type LedLight struct{}

func (*LedLight) LightUp() string {
    return "LEDが光るよ!"
}

// Filament bulb
type Incandescent struct{}

func (*Incandescent) LightUp() string {
    return "フィラメントが光るよ!"
}

DIはデザインパターンそのものです。

 

admin