0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

依存性逆転の原則について

Last updated at Posted at 2025-01-27

SOLIDの5原則の1つである依存性逆転の原則(DIP)について、調べた/実装した内容を記載します。

1. 依存性逆転の原則とは

SOLIDの5原則の1つとなります。

※SOLIDの原則については以下となります。
S:単一責任の原則(Single Responsibility)
O:オープン・クローズドの原則(Open-Closed)
L:リスコフの置換原則(Liskov Substitution)
I:インターフェイス分離の原則(Interface Segregation)
D:依存性逆転の原則(Dependency Inversion) ←ここ

2. 依存性とは

関数AControllerが関数Busecaseを参照することを、関数AControllerは関数Busecaseに依存すると言います。
コードで記載すると以下の様になります。

main.go
package main

import "DIP/controller"

func main() {
	controller.AController()
}

Acontroller.go
package controller

import (
	"DIP/usecase"
	"fmt"
)

func AController() {

	b := usecase.Busecase()

	fmt.Println(b)
}

Busecase.go
package usecase

func Busecase() string {
	return "B usecase"
}

これを図で書くと、こんな感じです。
image.png

3. なぜ依存性があるの問題点について

各関数で依存性があると、以下のような問題が発生します。
・拡張性が悪くなる。
・テスト容易性が悪い。
・各関数が再利用しにくい。

4. 依存性逆転を意識した実装を行うと

依存性逆転を意識した実装を行うと、以下のようになります。
AControllerは、直接BUseCaseに依存しておらず、BUsecaseのインターフェースに依存しています。
こうなることで、AControllerとBUsecaseは、疎結合な状態となります。

image.png

5. コード

これらのコードの内容は以下の通りとなります。

main.go
package main

import (
	"GO_DIP/controller"
	"GO_DIP/infrastructure/repositories"
	"GO_DIP/usecase"
	"fmt"
)

func main() {
	// リポジトリの初期化
	repo := repositories.NewReadUsermstRepository()
	// 依存性の初期化
	usercase := usecase.NewSearchUserInteractor(repo)

	// UserControllerの生成
	userController := controller.NewUserController(usercase)
	fmt.Println(userController.GetUserList())
}

UserController.go
package controller

import (
	"GO_DIP/usecase"
)

type UserController struct {
	usermstUsecase usecase.ISearchUserInteractor
}

// Constructor
func NewUserController(searchusermst usecase.ISearchUserInteractor) *UserController {
	return &UserController{
		usermstUsecase: searchusermst,
	}
}

func (controller *UserController) GetUserList() string {
	return controller.usermstUsecase.SearchAllUsers()
}

usermstusecase.go
package usecase

type ISearchUserInteractor interface {
	SearchAllUsers() string
}

// 構造体の定義
type SearchUserInteractor struct{}

// 新しいインスタンスを作成する関数
func NewSearchUserInteractor() ISearchUserInteractor {
	return &SearchUserInteractor{}
}

// 構造体のメソッドとしてSearchAllUsersを実装
func (s *SearchUserInteractor) SearchAllUsers() string {
	//Usermstの全検索
	return "UseCaseだよー"
}

結果

$ go run main.go
$ UseCaseだよー

6. Github

参考

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?