Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

20171207 Gaiaxエンジニア勉強会 プログラマーのためのDCIアーキテクチャ一夜漬け

2017/11/12 に開催された『DCI Tokyo Review』
https://dcitokyo.connpass.com/event/70323/
およびそれに先立っての『Lean Architecture / DCI Evening』
https://mpdosaka.connpass.com/event/69002/
に触発されて、DCIについての個人的なまとめをGaiaxエンジニア勉強会にて共有しました。
参考文献:
『Lean Architecture / DCI Evening」参加レポート』
http://phpmentors.jp/post/167325394103/lean-architecture-dci-evening-report
『Lean Architecture: for Agile Software Development』
https://www.amazon.co.jp/dp/0470684208
『Trygve Reenskaug - Object Orientation Revisited. Simplicity and power with DCI.』
https://vimeo.com/43536416
『James Coplien - The DCI Architecture: Supporting the Agile Agenda』
https://vimeo.com/8235574

  • Be the first to comment

20171207 Gaiaxエンジニア勉強会 プログラマーのためのDCIアーキテクチャ一夜漬け

  1. 1. プログラマーのための DCIアーキテクチャ 一夜漬け (Data, Context and Interaction) 2017/12/07 Gaiax エンジニア勉強会
  2. 2. 今日のアジェンダ 第一部 DCI概説、からサンプル実装の提示 第二部 アジャイルとリーン
  3. 3. 発表者情報 堤 大河(つつみ たいが) DCD(Gaiax社の受託開発部門的なところ) パートナーとして 2011〜 2000年よりこの業界。 エンタープライズもWEB系も、 大規模も小規模も、 あちこちでいろいろやってきてます。 facebook.com/taiga.tsutsumi
  4. 4. 今日のアジェンダ 第一部 DCI概説、からサンプル実装の提示 第二部 アジャイルとリーン
  5. 5. DCIアーキテクチャとは 第一部 DCI概説、からサンプル実装の提示 • 2009年、MVCアーキテクチャのオリジネイターであ る Trygve Reenskaug 氏と、『マルチパラダイムデ ザイン』の著者である James O. Coplien氏によって 提唱されはじめた。 • 本来の意味でのオブジェクト指向、つまり ユーザーのメンタルモデルに忠実な構造を目指す。
  6. 6. DCIアーキテクチャとは 第一部 DCI概説、からサンプル実装の提示 • ソフトウェアアーキテクチャあるいは実装パターン のひとつ。”MVC”とかと同じ次元の話。 • Data, Context and Interaction の略。 ここでいうData は、振る舞いを定義しないプレーンなオブジェクト (クラス) • “ロール”という概念を設定・実装する。 ロールは、オブジェクトの振る舞いを表現する。 コンテキストに従って、(ロールを演じる)プレーンなオブジェクトに ロールを注入することで、振る舞いを実現する。
  7. 7. https://vimeo.com/43536416
  8. 8. DCIの視座 第一部 DCI概説、からサンプル実装の提示 • 従来のオブジェクト志向言語による実装は、 静的な構造は表現出来ていても、動的な振る舞いを 表現できていなかった。これは人間の認識モデルとは 乖離している。 銀行口座間の送金を例にとるなら、 「振込先口座」と「振込元口座」は、 ヒトのメンタルモデル上明らかに別物。 なぜなら役割が、振る舞いが、異なるから。 これを、どっちも「口座クラス」、で 片付けていいのか?
  9. 9. DCIの視座 第一部 DCI概説、からサンプル実装の提示 • 口座クラスは、”is = 構造” を表現しているに過ぎない。 • では、”does = 振る舞い” を表現するのは? ↓ それはクラスではない別な オブジェクトだ 役割(ロール) そしてロールは文脈(コンテキスト) によって決定づけられる。 =
  10. 10. 第一部 DCI概説、からサンプル実装の提示 映画『マトリックス』 • ネオとトリニティがヘリコプターで脱出するシーン • トリニティはヘリコプターを操縦できない • が、ヘリコプターパイロットのプログラムを ダウンロード • それで操縦できるようになった ※操縦には、元からある四肢を使用する これがDCIのちょうどいいメタファーになっている。
  11. 11. DCIの登場人物図解 第一部 DCI概説、からサンプル実装の提示
  12. 12. 第一部 DCI概説、からサンプル実装の提示 ロールとコンテキストはどこから来るのか?
  13. 13. 第一部 DCI概説、からサンプル実装の提示 別にむずかしい話ではなかった。
  14. 14. 第一部 DCI概説、からサンプル実装の提示 じゃあちょっと実装してみるか。
  15. 15. 花キューピッド 第一部 DCI概説、からサンプル実装の提示
  16. 16. 第一部 DCI概説、からサンプル実装の提示 DCIのモデルケースとして、花宅配システム 仮称:hana9(はなきゅー) の仕様を検討して、そして実装しよう。 ※注:この間、システム設計の一般的な話が続きます。 なので、DCIに立脚しない話も混じります。
  17. 17. 第一部 DCI概説、からサンプル実装の提示 hana9 の概要(ユースケース?ユーザーストーリー?) • ユーザーは、hana9アプリから、希望のタイプの花 と数量を選び、希望の日に、希望の場所への配達を 注文する。 • 注文を受けたhana9運営は、加盟店に配達指示を 出して、注文を実現する。
  18. 18. 第一部 DCI概説、からサンプル実装の提示 まずはざっくり、エンティティを抽出
  19. 19. 第一部 DCI概説、からサンプル実装の提示 ユースケースをくわしく分析 受注時 配達指示時 <データ> <アルゴリズム/ビジネスロジック> 商品注文
  20. 20. 第一部 DCI概説、からサンプル実装の提示 ユースケースをくわしく分析 受注時 配達指示時 <データ> <アルゴリズム/ビジネスロジック> • お届け希望日 • 配達先住所(市区町村) • その注文(明細)を受けられる加 盟店が1軒でもあれば、注文(明 細)を成立させる • お届け希望日 • 配達先住所(市区町村) 商品注文
  21. 21. 第一部 DCI概説、からサンプル実装の提示 “その注文(明細)を受けられる”=モノがあること。 受注時 配達指示時 <データ> <アルゴリズム/ビジネスロジック> • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • その注文(明細)を受けられる加 盟店が1軒でもあれば、注文(明 細)を成立させる • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 商品注文
  22. 22. 第一部 DCI概説、からサンプル実装の提示 データモデルを修正
  23. 23. 第一部 DCI概説、からサンプル実装の提示 データモデルを修正
  24. 24. 第一部 DCI概説、からサンプル実装の提示 データモデルを修正
  25. 25. 第一部 DCI概説、からサンプル実装の提示 受注時 配達指示時 <データ> <アルゴリズム/ビジネスロジック> • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • その注文(明細)を受けられる加 盟店が1軒でもあれば、注文(明 細)を成立させる • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 商品注文
  26. 26. 第一部 DCI概説、からサンプル実装の提示 待って、モノがあっても配達できなければ・・ 受注時 配達指示時 <データ> <アルゴリズム/ビジネスロジック> • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • その注文(明細)を受けられる加 盟店が1軒でもあれば、注文(明 細)を成立させる • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 商品注文
  27. 27. 第一部 DCI概説、からサンプル実装の提示 データモデルを再度修正
  28. 28. 第一部 DCI概説、からサンプル実装の提示 受注時 配達指示時 <データ> <アルゴリズム/ビジネスロジック> • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • その注文(明細)を受けられる加 盟店が1軒でもあれば、注文(明 細)を成立させる • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 商品注文
  29. 29. 第一部 DCI概説、からサンプル実装の提示 核心のアルゴリズムに行き当たった 受注時 配達指示時 <データ> <アルゴリズム/ビジネスロジック> • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • 加盟店の手数料率 • その注文(明細)を受けられる加 盟店が1軒でもあれば、注文(明 細)を成立させる • その注文(明細)を受けられる加 盟店群のうちから1軒を選択。そ れをどのように選ぶか。 1. 手数料を多く取れる加盟店から 優先して選ぶ 2. 全加盟店の稼働が均等になるよ うに選ぶ ↓ ※この2種類をソート結果として提示する 商品注文
  30. 30. みたびデータモデル修正 第一部 DCI概説、からサンプル実装の提示
  31. 31. 第一部 DCI概説、からサンプル実装の提示 受注時 配達指示時 <データ> <アルゴリズム/ビジネスロジック> • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • 加盟店の手数料率 • その注文(明細)を受けられる加 盟店が1軒でもあれば、注文(明 細)を成立させる • その注文(明細)を受けられる加 盟店群のうちから1軒を選択。そ れをどのように選ぶか。 1. 手数料を多く取れる加盟店から 優先して選ぶ 2. 全加盟店の稼働が均等になるよ うに選ぶ ↓ ※この2種類をソート結果として提示する 商品注文
  32. 32. 第一部 DCI概説、からサンプル実装の提示 その他、見逃されがちだけど・・・ 受注時 配達指示時 <データ> <アルゴリズム/ビジネスロジック> • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • 人気度(今、売れています!) • 季節要因(値下げしました!) • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • 加盟店の手数料率 • その注文(明細)を受けられる加 盟店が1軒でもあれば、注文(明 細)を成立させる • その商品の人気度の導出 • その商品の、「値下げ鮮度」 の導出 • その注文(明細)を受けられる加 盟店群のうちから1軒を選択。そ れをどのように選ぶか。 1. 手数料を多く取れる加盟店から 優先して選ぶ 2. 全加盟店の稼働が均等になるよ うに選ぶ ↓ ※この2種類をソート結果として提示する 商品注文
  33. 33. ロールとエンティティとコンテキスト。部品が揃った。 受注時 配達指示時 <データ> <アルゴリズム/ビジネスロジック> • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • 人気度(今、売れています!) • 季節要因(値下げしました!) • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • 加盟店の手数料率 • その注文(明細)を受けられる加 盟店が1軒でもあれば、注文(明 細)を成立させる • その商品の人気度の導出 • その商品の、「値下げ鮮度」 の導出 • その注文(明細)を受けられる加 盟店群のうちから1軒を選択。そ れをどのように選ぶか。 1. 手数料を多く取れる加盟店から 優先して選ぶ 2. 全加盟店の稼働が均等になるよ うに選ぶ ↓ ※この2種類をソート結果として提示する 第一部 DCI概説、からサンプル実装の提示 商品注文 ロール ロール
  34. 34. ロールとエンティティとコンテキスト。部品が揃った。 受注時 配達指示時 <データ> <アルゴリズム/ビジネスロジック> • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • 人気度(今、売れています!) • 季節要因(値下げしました!) • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • 加盟店の手数料率 • その注文(明細)を受けられる加 盟店が1軒でもあれば、注文(明 細)を成立させる • その商品の人気度の導出 • その商品の、「値下げ鮮度」 の導出 • その注文(明細)を受けられる加 盟店群のうちから1軒を選択。そ れをどのように選ぶか。 1. 手数料を多く取れる加盟店から 優先して選ぶ 2. 全加盟店の稼働が均等になるよ うに選ぶ ↓ ※この2種類をソート結果として提示する 第一部 DCI概説、からサンプル実装の提示 商品注文 エンティティクラス
  35. 35. ロールとエンティティとコンテキスト。部品が揃った。 受注時 配達指示時 <データ> <アルゴリズム/ビジネスロジック> • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • 人気度(今、売れています!) • 季節要因(値下げしました!) • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • 加盟店の手数料率 • その注文(明細)を受けられる加 盟店が1軒でもあれば、注文(明 細)を成立させる • その商品の人気度の導出 • その商品の、「値下げ鮮度」 の導出 • その注文(明細)を受けられる加 盟店群のうちから1軒を選択。そ れをどのように選ぶか。 1. 手数料を多く取れる加盟店から 優先して選ぶ 2. 全加盟店の稼働が均等になるよ うに選ぶ ↓ ※この2種類をソート結果として提示する 第一部 DCI概説、からサンプル実装の提示 商品注文 コンテキストクラス コンテキストクラス
  36. 36. ※属性のオーナーの適切さ 受注時 配達指示時 <データ> <アルゴリズム/ビジネスロジック> • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • 人気度(今、売れています!) • 季節要因(値下げしました!) • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • 加盟店の手数料率 • その注文(明細)を受けられる加 盟店が1軒でもあれば、注文(明 細)を成立させる • その商品の人気度の導出 • その商品の、「値下げ鮮度」 の導出 • その注文(明細)を受けられる加 盟店群のうちから1軒を選択。そ れをどのように選ぶか。 1. 手数料を多く取れる加盟店から 優先して選ぶ 2. 全加盟店の稼働が均等になるよ うに選ぶ ↓ ※この2種類をソート結果として提示する 第一部 DCI概説、からサンプル実装の提示 商品注文 DCIでは ロールは、データを持たないのが原 則とされている。 なのでこのケースように、特定の ロールにのみ関わるデータであって も、それをロールの属性としてはい けない。
  37. 37. ※属性のオーナーの適切さ 受注時 配達指示時 <データ> <アルゴリズム/ビジネスロジック> • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • 人気度(今、売れています!) • 季節要因(値下げしました!) • お届け希望日 • 配達先住所(市区町村) • 希望日時点での引当可能在庫 • 当日の店舗の稼働状況 • 加盟店の手数料率 • その注文(明細)を受けられる加 盟店が1軒でもあれば、注文(明 細)を成立させる • その商品の人気度の導出 • その商品の、「値下げ鮮度」 の導出 • その注文(明細)を受けられる加 盟店群のうちから1軒を選択。そ れをどのように選ぶか。 1. 手数料を多く取れる加盟店から 優先して選ぶ 2. 全加盟店の稼働が均等になるよ うに選ぶ ↓ ※この2種類をソート結果として提示する 第一部 DCI概説、からサンプル実装の提示 商品注文 拡張クラスを使えば(いわゆる継 承)この問題を処理できる。 拡張された商品クラスである”販売 中商品クラス”を置き、受注コンテ キストクラスからはをそれを使うよ うにする。 ↓ 継承 受注 コンテキストクラス 配達指示 コンテキストクラス
  38. 38. 第一部 DCI概説、からサンプル実装の提示 サンプル実装 https://github.com/nowavailable/hana9
  39. 39. 第一部 DCI概説、からサンプル実装の提示 Class Composition • Roleはデータを保持しない。 ステートレスな振る舞いだけ。 • Ruby の extend のような、”振る舞い追加注入” 系は IoC パターンを意識。
  40. 40. 第一部 DCI概説、からサンプル実装の提示 Discussion • ロングメソッドに対する議論
  41. 41. 第一部 DCI概説、からサンプル実装の提示 Future Work • GUIクライアントアプリなら? • Actor モデルなら?
  42. 42. データモデリングとユースケース分析、 二方向から検討をした、 その相互作用によって、 “稼働上限” や ”出荷ルール” といった、 あたらしいエンティティを発見できた。 第一部 DCI概説、からサンプル実装の提示 ここまでのふりかえり
  43. 43. 第一部 DCI概説、からサンプル実装の提示 気づきその1:ふたつの世界を行き来することの有益さ
  44. 44. 第一部 DCI概説、からサンプル実装の提示 気づきその2:
  45. 45. 第一部 DCI概説、からサンプル実装の提示 気づきその2:データモデリング≒ドメイン分析 データ モデリング DB スキーマ
  46. 46. 今日のアジェンダ 第一部 DCI概説、からサンプル実装の提示 第二部 アジャイルとリーン
  47. 47. 第二部 アジャイルとリーン アジャイルとリーンの違い
  48. 48. 第二部 アジャイルとリーン アジャイルとリーンの違い アジャイル リーン
  49. 49. 第二部 アジャイルとリーン アジャイルとリーンの違い アジャイル リーン • 長い期間のプランニングが必要/大事。 • 深いレベルの専門家が作る。 • フィードバックに応じた再調整が肝要。 • 直接の商品は、こっち。我々が売って いるのはクラスではなくユースケース。

×