Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

本セッションのゴール

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

自己紹介

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

背景

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

実例の共有

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

Copyright levii Inc. All rights reserved. common Model communication admin.user billing Controller Model Controller Model Controller Model User Model Session Model ロギング エラーハン ドリング ...... コミュニケー ション 機能 ● コメント投稿 ● コメントのモデレー ト ● ... 課金機能 ● 課金プランの設定 ● 決済方法の設定 ● 解約予約の受付 ● ... ユーザ管理機 能 ● サービス運営者の識 別 ● ユーザの状況把握 ● ... Webアプリケーション基盤 ● セッション管理、認証、ロギング、etc の「横断的関心事」と呼ばれるものたち

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

もう少し実装よりの例

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

Copyright levii Inc. All rights reserved. User は、 ほぼ全てのパッケージから利用される = ほぼ全てのパッケージに 責務を提供している

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

Copyright levii Inc. All rights reserved. それぞれのドメインによって、 User の使い方は違うはず。 = User の提供すべき責務も異なるはず。

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

まとめ

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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