Slide 1

Slide 1 text

クリーンアーキテクチャを Goでする場合に不要な Interfaceは消しやがれ @garebare521

Slide 2

Slide 2 text

By たふみ神

Slide 3

Slide 3 text

ということで考えて行こうと思います

Slide 4

Slide 4 text

クリーンアーキテクチャとは

Slide 5

Slide 5 text

Entity UseCase Cotroller UI DB

Slide 6

Slide 6 text

なんかこういうやつ!

Slide 7

Slide 7 text

Interfaceで依存を逆転させてるらしい

Slide 8

Slide 8 text

実装例 type Hoge struct { … } type HogeUsecase struct { … } type HogeRepository struct { …. } type Hoge Controller struct { … }

Slide 9

Slide 9 text

実装例 hogeRepo:=NewHogeRepository() hogeUse :=NewHogeUsecase(hogeRepo) hogeCtrl := NewHogeCtroller(hogeUse)

Slide 10

Slide 10 text

実装例 hogeCtrl.Post () hogeUse.Post () HogeRepo.Insert()

Slide 11

Slide 11 text

Interfaceなしだと モックが作れないので テストし難い

Slide 12

Slide 12 text

Interface書くしかない

Slide 13

Slide 13 text

クリーンアーキテクチャを Goでする場合に不要な Interfaceは消しやがれ

Slide 14

Slide 14 text

じゃあどうするか

Slide 15

Slide 15 text

とりあえず実装量が少なそうな UseCase層を取り除く

Slide 16

Slide 16 text

Entity UseCase Cotroller UI DB

Slide 17

Slide 17 text

Entity Cotroller UI DB

Slide 18

Slide 18 text

単純にインターフェースを削除すると テストが破綻する

Slide 19

Slide 19 text

テストしやすい形にしたい

Slide 20

Slide 20 text

じゃあもう実態持たせる必要なくない?

Slide 21

Slide 21 text

Entity UI DB Controller

Slide 22

Slide 22 text

Entity UI DB Controller こうしたい

Slide 23

Slide 23 text

実態を持たせずに Interfaceと同じようなことをしたい

Slide 24

Slide 24 text

関数を引数に渡せばよくね????

Slide 25

Slide 25 text

関数を渡すようにするとテストも書きやすい

Slide 26

Slide 26 text

HogeController func (c *hogeCtrl) Post(c Context, insert func(hoge Hoge) (error)) { insert() } hogeCtrl.Post(c, hogeRepo.insert)

Slide 27

Slide 27 text

関数の引数をInterface代わりにして 解決!

Slide 28

Slide 28 text

ただ必要な関数が増えるたびに 引数も増えます