14
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

目次

背景

インターフェースの意義を調べていく中でSOLID、依存性逆転の原則について理解する必要があったため、これらの調査内容をまとめる。

依存性逆転の原則(DIP)とは

SOLID(オブジェクト指向に用いられる原則)の頭文字
S 単一責任の原則 (single-responsibility principle)
O 開放閉鎖の原則(open/closed principle)
L リスコフの置換原則(Liskov substitution principle)
I インターフェース分離の原則 (interface segregation principle)
D 依存性逆転の原則(dependency inversion principle)

5つ目のD依存性逆転の原則(dependency inversion principle)について

上位のモジュールのレイヤーが下位モジュールのレイヤーに依存させず、下位・上位モジュールともにそれぞれの抽象に依存すべきという考え方で、以下Wikiからの引用です。

1.上位モジュールはいかなるものも下位モジュールから持ち込んではならない。双方とも抽象(例としてインターフェース)に依存するべきである。
"High-level modules should not import anything from low-level modules. Both should depend on abstractions (e.g., interfaces)."[3]

2.抽象は詳細に依存してはならない。詳細(具象的な実装内容)が抽象に依存するべきである。
"Abstractions should not depend on details. Details (concrete implementations) should depend on abstractions."[3]

コードを用いた説明(GolangでのModel View Controllerのケース)

従来の構成

  • Wheat(小麦)      ストラクト

  • Udon(うどん)     ”かけうどん”を作るメソッド

  • konekone(麺をこねる) Udonメソッドを呼び出すメソッド

    インターフェースを使わず、上記のメソッドやストラクトを使う従来の構成で"かけうどん"を作ります。

上位モジュール(konekone)が下位モジュール(Wheat)に依存している状態

Udon.go
package main

import (
        "fmt"
)

type Wheat struct {}

func (wh *Wheat) Udon() {
        fmt.Println("かけうどん")
}

// Wheat という具象に依存している
func konekone(wheat *Wheat) {
        wheat.Udon()
}

func main() {
        wheat := &Wheat{}
        konekone(wheat)
}

実行結果

$ go run Udon.go
かけうどん

依存性逆転(DIP)構成

  • Wheat(小麦)      ストラクト

  • Udon(うどん)     ”かけうどん”を作るメソッド

  • konekone(麺をこねる) Udonメソッドを呼び出すメソッド

  • Shokunin(職人)    追加されるインターフェース

    従来の構成にインターフェースShokuninを追加して依存関係を逆転させます。

下位モジュール(Wheat)が上位モジュール(Konekone)の抽象(インターフェースShokunin)に依存している状態

Udon-shokunin.go
package main

import (
        "fmt"
)

// Konekone() を持つインターフェースの定義
type Shokunin interface {
        Udon()
}

type Wheat struct {}

func (wh *Wheat) Udon() {
        fmt.Println("かけうどん")
}

// 引数として Shokunin インターフェースを定義
func konekone(shokunin Shokunin) {
        shokunin.Udon()
}

func main() {
        wheat := &Wheat{}
        konekone(wheat)
}

実行結果

$ go run Udon-shokunin.go
かけうどん

実行結果はどちらも同じ"かけうどん"で、インターフェースを追加して依存が逆転していることがわかる!

まとめ

従来の構成である麺をこねる作業が小麦に依存していた状態から、職人インターフェース(konekoneのインターフェースShokunin)を設置することで小麦は職人インターフェースに依存するよう、依存関係が逆転しました。
この構成によりメソッド間を疎結合でき、テストや変更がしやすい柔軟のコードを実装できるメリットがあります。

参考URL

14
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?