Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

6月17日に行われたNEWDEBUG!!!!で発表した史料です。
https://caspur.wintu.dev/front/lives/264

garebare

June 17, 2022
Tweet

More Decks by garebare

Other Decks in Programming

Transcript

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

    View Slide

  2. By たふみ神

    View Slide

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

    View Slide

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

    View Slide

  5. Entity
    UseCase
    Cotroller
    UI
    DB

    View Slide

  6. なんかこういうやつ!

    View Slide

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

    View Slide

  8. 実装例
    type Hoge struct {

    }
    type HogeUsecase struct {

    }
    type HogeRepository struct {
    ….
    }
    type Hoge Controller struct {

    }

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. Interface書くしかない

    View Slide

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

    View Slide

  14. じゃあどうするか

    View Slide

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

    View Slide

  16. Entity
    UseCase
    Cotroller
    UI
    DB

    View Slide

  17. Entity
    Cotroller
    UI
    DB

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  21. Entity
    UI
    DB
    Controller

    View Slide

  22. Entity
    UI
    DB
    Controller
    こうしたい

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide