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

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

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)

Akira Yumiyama

February 16, 2020
Tweet

More Decks by Akira Yumiyama

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    変更しやすくなる

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  9. 自己紹介

    View Slide

  10. Copyright levii Inc. All rights reserved.
    弓山 彬 @akiray03
    株式会社レヴィ 共同創業者兼CTO
    10

    View Slide

  11. Copyright levii Inc. All rights reserved.
    レヴィの提案するシステムデザインのフレームワーク
    システミング
    製品・サービスをシステムとして捉えて、
    チームで共通のゴールを描きながら価値提供を実現するためのフレームワーク
    様々な立場や観点から見たシステム
    について考えます。
    チームやステークホルダと認識を
    あわせながらデザインを進めま
    す。
    価値の検証、整合性の検証、チーム
    やステークホルダとの合意を大切に
    します。

    View Slide

  12. Copyright levii Inc. All rights reserved.
    レヴィの提供するサービス全体像
    “Same Page” を描き、チームでシステムデザインを行うための
    フレームワーク、ノウハウ、実行スキルを育成・提供します。
    システミング SaaS プラットフォーム
    システミング
    診断
    オンライン/
    オフライン研修
    実践ワーク
    ショップ
    プロジェクト
    並走コンサル
    システムデザインの方法論
    システミング
    トライアル
    ワークショップ

    View Slide

  13. 背景

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  19. 実例の共有

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  26. Copyright levii Inc. All rights reserved.
    Webアプリケーションが担う責務を
    Controller と Model に分けた

    View Slide

  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

    View Slide

  28. Copyright levii Inc. All rights reserved.
    「ModelはControllerに対していろいろ
    な責務を提供している」

    View Slide

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

    View Slide

  30. Copyright levii Inc. All rights reserved.
    シンプルな言葉で
    「責務」を説明できるように、
    Controller, Model の切り口とは
    違う視点で分けてみる

    View Slide

  31. Copyright levii Inc. All rights reserved.
    ① ビジネスのドメイン(関心事・領域)
    で分けてみる

    View Slide

  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
    コミュニケーション
    機能
    ● コメント投稿
    ● コメントのモデレート
    ● ...
    課金機能
    ● 課金プランの設定
    ● 決済方法の設定
    ● 解約予約の受付
    ● ...
    ユーザ管理機能
    ● サービス運営者の識別
    ● ユーザの状況把握
    ● ...

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  36. Copyright levii Inc. All rights reserved.
    Webアプリケーションの
    あちこちから使われるものがある

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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 の「横断的関心事」と呼ばれるものたち

    View Slide

  41. Copyright levii Inc. All rights reserved.
    Webアプリケーションのコアバリューは
    基盤の上に乗っている機能群
    それを支える基盤が堅牢でなければ、
    コアバリューを変更しやすく維持するの
    は難しい

    View Slide

  42. Copyright levii Inc. All rights reserved.
    アプリケーション基盤(横断的関心事)
    の利用者は同じアプリ内のシステム

    ステークホルダーは(ある意味)自分自身

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    ほぼ全てのパッケージに
    責務を提供している

    View Slide

  47. Copyright levii Inc. All rights reserved.
    提供している「責務」は全て同じ?

    View Slide

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

    User の提供すべき責務も異なるはず。

    View Slide

  49. Copyright levii Inc. All rights reserved.
    common
    communication admin.user
    billing
    User Model
    Comment
    Controller
    Billing
    Controller
    UserAdmin
    Controller
    ユーザ情報の
    参照
    ユーザ状態の
    変更
    名前・住所の
    参照
    表示名の参照
    パスワードの
    検証
    ......
    ... ... ...

    View Slide

  50. Copyright levii Inc. All rights reserved.
    ユーザ管理機能の必要とする
    ユーザ編集やユーザ削除の責務は
    Communication機能には不要
    (間違えて呼び出せてしまう... のは事故の元)

    View Slide

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

    View Slide

  52. Copyright levii Inc. All rights reserved.
    それぞれのパッケージに
    そのパッケージで必要としている
    責務を提供してくれる User を作る

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  57. まとめ

    View Slide

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

    変更しやすくなる
    「アプリケーションアーキテクチャ」

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide