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

クリーンな実装を目指して.pdf

syarig
February 11, 2020
2.1k

 クリーンな実装を目指して.pdf

syarig

February 11, 2020
Tweet

Transcript

  1. クリーンな実装を目指して
    Hamee株式会社
    開発部 伊藤有人
    開発部 能美龍星

    View Slide

  2. Hamee開発部
    伊藤 有人
    (Arito Ito)
    新卒2年目Webエンジニア

    画像管理チーム

    1年目はアプリ開発

    @syarig6

    View Slide

  3. Hamee開発部
    能美 龍星
    (とんと)
    新卒2年目Webエンジニア

    1年目はQAエンジニア

    仕事はバックエンド多め

    プライベートはフロント

    @27ma4_ton10

    View Slide

  4. View Slide

  5. 小田原でネットショップの運営と
    ECの業務を自動化する企業

    View Slide

  6. Hameeには二つの軸があります
    ものを
    作る
    ものを
    自動で
    売る

    View Slide

  7. View Slide

  8. View Slide

  9. View Slide

  10. View Slide

  11. 画像同期ツール

    View Slide

  12. 画像をモールに

    登録するぞ

    複数のネットショップを
    運営するAさん

    View Slide

  13. View Slide

  14. View Slide

  15. View Slide

  16. リーダー
    メンバー

    View Slide

  17. Server
    ・バッチの実行
    ・DBとのやり取り
    ・キューの作成
    etc.

    View Slide

  18. Server
    ・バッチの実行
    ・DBとのやり取り
    ・キューの作成
    etc.

    View Slide

  19. Server
    ・バッチの実行
    ・DBとのやり取り
    ・キューの作成
    etc.
    2019年
    7月 
    〜 2019年
    10月

    View Slide

  20. Server
    ・バッチの実行
    ・DBとのやり取り
    ・キューの作成
    etc.
    2019年
    10月
    〜 現在

    View Slide

  21. Server
    ・バッチの実行
    ・DBとのやり取り
    ・キューの作成
    etc.
    2019年
    10月
    〜 現在
    転職します


    View Slide

  22. Server
    ・バッチの実行
    ・DBとのやり取り
    ・キューの作成
    etc.
    ここのタスクが山積み

    View Slide

  23. ドメイン層の設計って
    何が正しいんだ…?
    タスクを消化したいけど
    どこに何を書くべきか迷う…

    View Slide

  24. ドメイン層の設計って
    何が正しいんだ…?
    タスクを消化したいけど
    どこに何を書くべきか迷う…
    試行錯誤したことを話します

    View Slide

  25. こんな疑問を解消したい
    ▷ なぜそのクラスにメソッドを持たすのか
    ▷ そもそもなぜそのクラスを作るのか
    ▷ どうしてインターフェースを作るのか
    注意:レガシーコードにおいてです

    View Slide

  26. View Slide

  27. 話したいこと
    ・木を見て森を見ず
    細部を見ているあまり、
    全体を見るのを忘れてしまうこと
    コンポーネントレベル
    の全体をみたお話をしたい

    View Slide

  28. 結論
    ★ 処理の流れ
    ★ 依存関係
    ★ 集約
    画像同期の開発を例に
    やってよかったことを
    お話します

    View Slide

  29. ネクストエンジンのコンテキスト

    View Slide

  30. 僕らが
    作ったのは
    ここ

    View Slide

  31. 新機能開発

    リファクタリング

    View Slide

  32. View Slide

  33. やってよかった3つのこと
    ▷ JSにViewとPresenterの責務をも
    たせられたこと
    ▷ バリューオブジェクトを追加し
    て概念の統一
    ▷ ドメインサービスの追加で
    垂直分割

    View Slide

  34. ▷ JSにViewとPresenterの責務をも
    たせられたこと
    ▷ バリューオブジェクトを追加し
    て概念の統一
    ▷ ドメインサービスの追加で
    垂直分割
    やってよかった3つのこと

    View Slide

  35. View Slide

  36. 切り離し方式
    ➢ ソースレベル
    ➢ デプロイレベル
    ➢ サービスレベル
    結合度が低くなる

    View Slide

  37. ▷ JSにViewとPresenterの責務をも
    たせられたこと
    ▷ バリューオブジェクトを追加し
    て概念の統一
    ▷ ドメインサービスの追加で
    垂直分割
    やってよかった3つのこと

    View Slide

  38. 既存機能ではユースケースごとに
    ロジックやデータ構造が異なっていた
    でも、どれもやっているのは画像登録

    View Slide

  39. View Slide

  40. ▷ JSにViewとPresenterの責務をも
    たせられたこと
    ▷ バリューオブジェクトを追加し
    て概念の統一
    ▷ ドメインサービスの追加で
    垂直分割
    やってよかった3つのこと

    View Slide

  41. View Slide

  42. View Slide

  43. 集約について
    ➢ 更新を行う単位
    ➢ 外部から呼ばれるはじめの集約
    を集約ルートと呼ぶ

    View Slide

  44. ユースケースによって
    集約ルートが変わるの
    だけどどうしよう...

    View Slide

  45. 注目

    View Slide

  46. まとめ
    ★ 処理の流れ
    ★ 依存関係
    ★ 集約 この3点が管理され
    ていれば改修時の
    ストレス、手戻りが
    かなり減ると感じた

    View Slide

  47. 今後について
    1. レイヤ化アーキテクチャ
    2. DIPの導入
    3. マイクロサービス化

    今ココ

    View Slide

  48. 今後について
    1. レイヤ化アーキテクチャ
    2. DIPの導入
    3. マイクロサービス化

    目指せマイクロサービス化!
    お話したことは
    DIP導入するための準備

    View Slide

  49. 入力から出力に向かっ
    て各レイヤが下方向に
    依存している

    View Slide

  50. 依存先を具象から抽象へ
    Domainにインターフェースを
    作り、Domainに依存するよう
    にする

    View Slide

  51. Hameeにはエンジニアが
    のびのびと開発できる環境があります。
    小田原に遊びに来てください。

    View Slide

  52. View Slide