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

オブジェクト指向で考える アプリケーションアーキテクチャ設計 / Object-Oriented Conference 2020

16fc6001488a519a03dc4c0ca8eb4503?s=47 Akira Yumiyama
February 16, 2020

オブジェクト指向で考える アプリケーションアーキテクチャ設計 / Object-Oriented Conference 2020

[Object Oriented Conference](https://ooc.dev/)での登壇資料です

[オブジェクト指向で考えるアプリケーションアーキテクチャ設計 by 弓山彬 | トーク | Object-Oriented Conference #ooc_2020 - fortee.jp](https://fortee.jp/object-oriented-conference-2020/proposal/12a38ba1-bfbd-4699-a4f8-061de24d0683)

16fc6001488a519a03dc4c0ca8eb4503?s=128

Akira Yumiyama

February 16, 2020
Tweet

Transcript

  1. オブジェクト指向で考える アプリケーションアーキテクチャ設計 弓山 彬 @akiray03 株式会社レヴィ levii.co.jp オブジェクト指向カンファレンス 2020/02/16 #ooc_2020

    #ooc_e
  2. 本セッションのゴール

  3. Copyright levii Inc. All rights reserved. レガシーアプリケーションの どこに手を入れたら良いのかわからない

  4. Copyright levii Inc. All rights reserved. アプリケーションの提供価値(=責務)を 実現するための「構造」が分かりにくい

  5. Copyright levii Inc. All rights reserved. アプリケーションの責務を 分割して、構造化して、 実装と一致させれば分かりやすくなる =

    変更しやすくなる
  6. Copyright levii Inc. All rights reserved. アプリケーション全体で 一気にやろうとすると大仕事 まずは、小さな実験から始めましょう

  7. Copyright levii Inc. All rights reserved. アプリケーション基盤 (横断的関心事) のステークホルダーは ある意味で自分たち開発者自身

  8. Copyright levii Inc. All rights reserved. 今日の発表をヒントにして あなたの現場でも実験してみてください

  9. 自己紹介

  10. Copyright levii Inc. All rights reserved. 弓山 彬 @akiray03 株式会社レヴィ

    共同創業者兼CTO 10
  11. Copyright levii Inc. All rights reserved. レヴィの提案するシステムデザインのフレームワーク システミング 製品・サービスをシステムとして捉えて、 チームで共通のゴールを描きながら価値提供を実現するためのフレームワーク

    様々な立場や観点から見たシステム について考えます。 チームやステークホルダと認識を あわせながらデザインを進めま す。 価値の検証、整合性の検証、チーム やステークホルダとの合意を大切に します。
  12. Copyright levii Inc. All rights reserved. レヴィの提供するサービス全体像 “Same Page” を描き、チームでシステムデザインを行うための

    フレームワーク、ノウハウ、実行スキルを育成・提供します。 システミング SaaS プラットフォーム システミング 診断 オンライン/ オフライン研修 実践ワーク ショップ プロジェクト 並走コンサル システムデザインの方法論 システミング トライアル ワークショップ
  13. 背景

  14. Copyright levii Inc. All rights reserved. 「このクラスの責務が大きいから分割しよう」 「分割したクラスはどのパッケージに置く?」 「この責務も持たせた方が良くない?」

  15. Copyright levii Inc. All rights reserved. Q. いろいろな「責務」を持ったクラスを いくつに分けたら良いですか? どこから分けたら良いですか?

  16. Copyright levii Inc. All rights reserved. Q. いろいろな「責務」を持ったクラスを いくつに分けたら良いですか? どこから分けたら良いですか?

  17. Copyright levii Inc. All rights reserved. A. そのクラスと周囲のクラスとの関係性 パッケージ間の関係性によって決まる

  18. Copyright levii Inc. All rights reserved. あるクラスの「責務」を ・利用している側の視点 ・提供している側の視点 を行き来しながら考えると良さそう

  19. 実例の共有

  20. Copyright levii Inc. All rights reserved. とある、レガシーな Webアプリケーション

  21. Copyright levii Inc. All rights reserved. コメント投稿ができて 有料オプションで便利に使える コミュニティサービス

  22. Copyright levii Inc. All rights reserved. MVCのModelとControllerに着目

  23. Copyright levii Inc. All rights reserved. Controller Model Dashboard Controller

    User Model Comment Controller Comment Model Billing Controller UserAdmin Controller Billing Model Plan Model Comment Summary Model Session Model
  24. Copyright levii Inc. All rights reserved. Controller Model Dashboard Controller

    User Model Comment Controller Comment Model Billing Controller UserAdmin Controller Billing Model Plan Model Comment Summary Model Session Model
  25. Copyright levii Inc. All rights reserved. Controller Model Dashboard Controller

    User Model Comment Controller Comment Model Billing Controller UserAdmin Controller Billing Model Plan Model Comment Summary Model Session Model
  26. Copyright levii Inc. All rights reserved. Webアプリケーションが担う責務を Controller と Model

    に分けた
  27. Copyright levii Inc. All rights reserved. Controller Model Dashboard Controller

    User Model Comment Controller Comment Model Billing Controller UserAdmin Controller Billing Model Plan Model Comment Summary Model Session Model
  28. Copyright levii Inc. All rights reserved. 「ModelはControllerに対していろいろ な責務を提供している」

  29. Copyright levii Inc. All rights reserved. 依存の方向は一方向に揃っているが 関係性は複雑で 全体として良くわからない

  30. Copyright levii Inc. All rights reserved. シンプルな言葉で 「責務」を説明できるように、 Controller, Model

    の切り口とは 違う視点で分けてみる
  31. Copyright levii Inc. All rights reserved. ① ビジネスのドメイン(関心事・領域) で分けてみる

  32. Copyright levii Inc. All rights reserved. Controller Model Dashboard Controller

    User Model Comment Controller Comment Model Billing Controller UserAdmin Controller Billing Model Plan Model Comment Summary Model Session Model コミュニケーション 機能 • コメント投稿 • コメントのモデレート • ... 課金機能 • 課金プランの設定 • 決済方法の設定 • 解約予約の受付 • ... ユーザ管理機能 • サービス運営者の識別 • ユーザの状況把握 • ...
  33. Copyright levii Inc. All rights reserved. communication admin.user billing Controller

    Model Controller Model Controller Model ビジネスのドメイン(関心事・領域) で分ければ充分?
  34. Copyright levii Inc. All rights reserved. Controller Model Dashboard Controller

    User Model Comment Controller Comment Model Billing Controller UserAdmin Controller Billing Model Plan Model Comment Summary Model Session Model
  35. Copyright levii Inc. All rights reserved. Controller Model Dashboard Controller

    User Model Comment Controller Comment Model Billing Controller UserAdmin Controller Billing Model Plan Model Comment Summary Model Session Model
  36. Copyright levii Inc. All rights reserved. Webアプリケーションの あちこちから使われるものがある

  37. Copyright levii Inc. All rights reserved. ② Webアプリケーション全体を支える 基盤を提供する責務と、その利用者

  38. Copyright levii Inc. All rights reserved. Controller Model Dashboard Controller

    User Model Comment Controller Comment Model Billing Controller UserAdmin Controller Billing Model Plan Model Comment Summary Model Session Model
  39. Copyright levii Inc. All rights reserved. common Model communication admin.user

    billing Controller Model Controller Model Controller Model User Model Session Model ロギング エラーハン ドリング ......
  40. Copyright levii Inc. All rights reserved. common Model communication admin.user

    billing Controller Model Controller Model Controller Model User Model Session Model ロギング エラーハン ドリング ...... コミュニケー ション 機能 • コメント投稿 • コメントのモデレー ト • ... 課金機能 • 課金プランの設定 • 決済方法の設定 • 解約予約の受付 • ... ユーザ管理機 能 • サービス運営者の識 別 • ユーザの状況把握 • ... Webアプリケーション基盤 • セッション管理、認証、ロギング、etc の「横断的関心事」と呼ばれるものたち
  41. Copyright levii Inc. All rights reserved. Webアプリケーションのコアバリューは 基盤の上に乗っている機能群 それを支える基盤が堅牢でなければ、 コアバリューを変更しやすく維持するの

    は難しい
  42. Copyright levii Inc. All rights reserved. アプリケーション基盤(横断的関心事) の利用者は同じアプリ内のシステム = ステークホルダーは(ある意味)自分自身

  43. Copyright levii Inc. All rights reserved. 小さく実験を始めるには良い題材

  44. もう少し実装よりの例

  45. Copyright levii Inc. All rights reserved. アプリケーションのさまざまな場所から 利用される User に着目してみる

  46. Copyright levii Inc. All rights reserved. User は、 ほぼ全てのパッケージから利用される =

    ほぼ全てのパッケージに 責務を提供している
  47. Copyright levii Inc. All rights reserved. 提供している「責務」は全て同じ?

  48. Copyright levii Inc. All rights reserved. それぞれのドメインによって、 User の使い方は違うはず。 =

    User の提供すべき責務も異なるはず。
  49. Copyright levii Inc. All rights reserved. common communication admin.user billing

    User Model Comment Controller Billing Controller UserAdmin Controller ユーザ情報の 参照 ユーザ状態の 変更 名前・住所の 参照 表示名の参照 パスワードの 検証 ...... ... ... ...
  50. Copyright levii Inc. All rights reserved. ユーザ管理機能の必要とする ユーザ編集やユーザ削除の責務は Communication機能には不要 (間違えて呼び出せてしまう...

    のは事故の元)
  51. Copyright levii Inc. All rights reserved. common communication admin.user billing

    User Model Comment Controller Billing Controller UserAdmin Controller ユーザの識別 Comment User Billing User Xxx User ... ... ... ...... ...... ...... ...... ...... ......
  52. Copyright levii Inc. All rights reserved. それぞれのパッケージに そのパッケージで必要としている 責務を提供してくれる User

    を作る
  53. Copyright levii Inc. All rights reserved. クラスの粒度だけでなく パッケージの粒度でも 高凝集・疎結合になるように

  54. Copyright levii Inc. All rights reserved. オブジェクト指向の考え方は 単一のクラスだけでなく その集合(パッケージ)構造に対しても 適用できる

  55. Copyright levii Inc. All rights reserved. アプリケーションが ユーザに対して提供する価値(責務)を 再帰的に分解しながら構造化していく

  56. Copyright levii Inc. All rights reserved. 開発者のメンタルモデルと アプリケーションアーキテクチャが 大きく乖離しないように整理すると どこを変更すべきかわかる。

    =変更しやすくなる
  57. まとめ

  58. Copyright levii Inc. All rights reserved. アプリケーションの提供価値(=責務)を 構造化して、分割して、 実装に反映していくと分かりやすくなる =

    変更しやすくなる 「アプリケーションアーキテクチャ」
  59. Copyright levii Inc. All rights reserved. アプリケーション全体で 一気にやろうとすると大仕事 まずは、小さな実験から始めましょう

  60. Copyright levii Inc. All rights reserved. 今日の発表をヒントにして あなたの現場でも実験してみてください

  61. Copyright levii Inc. All rights reserved. ご清聴ありがとうございました