概念投影によるオブジェクト指向設計の考え方とその方法/Conceptual projection design

26e25726fc9da2f1e1f88c7be665407d?s=47 hiro@miraito
February 16, 2020

概念投影によるオブジェクト指向設計の考え方とその方法/Conceptual projection design

オブジェクト指向設計の中でも特に型指向に焦点を当てた概念投影指向という考え方を紹介しています。

アプリケーション設計とはそもそも何をする事なのか?という前提を考える事により、具体的な手法をなぞるのではなくプロダクト毎に柔軟に設計ができるようになるためのガイドラインとしてご覧ください。

※ このスライドは主催する Object-Oriented Conference 2020 の登壇用資料です。

26e25726fc9da2f1e1f88c7be665407d?s=128

hiro@miraito

February 16, 2020
Tweet

Transcript

  1. 概念投影によるオブジェクト指向設 計の考え方とその方法 Object-Oriented Conference 2020 2020.02.16 at お茶の水女子大学 @hirodragon

  2. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 2

  3. オブジェクト指向好きによる オブジェクト指向好きの為の オブジェクト指向トピック満載の カンファレンスです 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 3

  4. Speaker 林 宏勝 hirodragon Twitter: @hirodragon112 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 4 株式会社ミライトデザイン

    CEO/Founder 「確かな設計によるより良いシステムを」 要件定義 | 設計 | プログラミング toB, toC のWebアプリ, スマートフォンアプリ開発 株式会社Jocy CTO 「Create My Life , Bet My Life」 美容室定額サービス「MEZON」開発・運営
  5. Today's Topic my assumptions / prerequisites プログラミングの基礎を理解していて設計に興味がある、 もしくは実践しているがしっくりきていない方へ 設計活動の捉え方を話します I

    will talk about アプリケーション開発における設計活動の考え方 概念投影指向による公理の型と定義の型とは ロジックとアクティビティ(営み) 具体例:まとめ 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 5
  6. Today's Topic I will NOT talk about DDDやICONIX SOLID原則やデザインパターン等 具体的手法や概念の解説

    概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 6
  7. 本日お話しするのは「考え方」 捉え方と言い換えても良いです 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 7

  8. Before Principle Before Pattern Before Paradigm 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 8

  9. ⚫ 正解がわからない ⚫ 指針がわからない ⚫ 何から始めれば良いかわからない ⚫ GOALがわからない 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020

    9 設計が難しく感じる理由 ×暗記 〇応用
  10. 全体像を知っていると同じ道のりでも認識が違う 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 10 まだかか るな 合ってる かな? GOAL START

    合って る? 終わった? あと少し 終わった!
  11. アプリケーション開発とは何をしているのか 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 11

  12. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 12 アプリケーションは 様々な理由で現実世界の活動を代行してくれている -正確だから -高速だから -記録が残るから

  13. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 13 アプリケーション 現実世界 無数のアプリ ケーションが 存在する 各アプリケー ションにより

    実現できる内 容は異なる コンピュータの中の 小人さんに人間の代わりを お願いしているようなもの
  14. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 14

  15. コンピュータの中に小人はいない 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 15

  16. ソフトウェア開発における設計とは 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 16

  17. What この小人さんがいる世界を作る Who 我々エンジニアが 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 17

  18. Where コンピュータの中に Why 現実世界の営みを代行してあげる為 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 18

  19. How …… 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 19

  20. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 20 この「無の世界」に現実世界 を代行してくれる新たな世界 を作り上げる 実際にはい ない システム化したい 領域を投影する

  21. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 21 世界創世

  22. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 22 無から有へ

  23. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 23 エンジニアの力で

  24. ⚫ コンピュータは現実世界を知らない ⚫ 与えられた武器は「プログラミング言語」 ⚫ ここに現実世界の「営み」を代行してくれる小さな世界を 創りあげる 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 24

    世界創世レシピ
  25. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 25 How to 世界創生?

  26. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 26 概念投影

  27. ⚫ コンピュータは現実世界を知らない ⚫ 与えられた武器は「プログラミング言語」 ⚫ ここに現実世界の「営み」を代行してくれる小さな世界を 創りあげる 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 27

    世界創世レシピ
  28. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 28 example 設計をせずともプログラムは 動く。 要件に合わせてプログラミン グ言語の力のみを使い処理を 実装する事ももちろん可能。 例えば左記のような処理が

    あったとします。
  29. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 29 example 人間(現実世界を知っている)の目線ではこう見える 男性を取得する処理だ メンバーのリストを 受け取っている 性別が男性かを比較して 作成された男性メンバーリスト

    を 返却している。 問題なさそうだ。 男性リストに登録して
  30. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 30 ホントにコンピュータもそう理解してますか?

  31. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 31 example 不明な何かを受け取って 不明なプロパティが 文字列の何かと比較をし できた配列を返している 配列に何かを入れて

  32. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 32 無の世界に持ち込まれたのは 「プログラミング言語」の作る世界のみ 人間には 「member」や「Man」の文字を見て 自分の知る世界の概念と照らし合わせる事により 無意識に「認知」ができる

  33. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 33 ただ、これから作る無の世界には そのような概念は存在しない。 せいぜい存在するのは 「プログラミング言語が作成している概念」のみ

  34. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 34 セマンティックギャップ

  35. 概念を投影するとは? 限られた武器で世界を創生する為にはまず、 仮想的な現実世界を 無の世界(コンピュータ)に教えてあげる必要がある。 つまり、「存在」させる必要がある。 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 35

  36. 概念を投影するとは? では、存在とは何か? それは実在する事ではなく「認識」できる事。 「認識」できるとは何か? それは「概念」が定義されている事。 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 36

  37. 例えば… 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 37 棒だ ゴルフ クラブだ ゴルフクラブと言う概念を知 らない この子はゴルフクラブ認識は

    絶対に起こりえない つまりこの子の世界において ゴルフクラブが存在する事は ない ゴルフクラブと言う概念を 知っている 知っているものは認識できる このおじさんにとってこのゴ ルフクラブは存在する
  38. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 38 概念を教えて 仮想的な現実世界を創る 無

  39. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 39 無 ユーザー? アカウント? 商品? 売上? 価格? 税率?

    概念 知識を増やして (存在を教えてあげて) 仮想現実を 作り上げる ユーザー アカウント 商品 売上 価格 税率
  40. ⚫ コンピュータは現実世界を知らない ⚫ 与えられた武器は「プログラミング言語」 ⚫ ここに現実世界の「営み」を代行してくれる小さな世界を 創りあげる 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 40

    世界創世レシピ
  41. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 41 プログラミング言語の型の 力を使って概念を投影する 型による概念投影

  42. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 42 公理と定義

  43. 少し数学用語をお借りして説明します ※ 数学で使用される表現ですが使用方法は若干異なります 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 43

  44. 公理 > その他の命題を導きだすための前提として導入される最も基本的な仮 定のことである。 (Wikipedia より) ここでは 「無条件に正しいと定められているもの」 とします。 概念投影によるオブジェクト指向設計の考え方とその方法

    OOC2020 44
  45. 定義 > コミュニケーションを円滑に行うために、ある言葉の正確な意味や用 法について、人々の間で共通認識を抱くために行われる作業 (Wikipedia より) ここでは 「公理を元に新しく正しいと定めたもの」 とします。 概念投影によるオブジェクト指向設計の考え方とその方法

    OOC2020 45
  46. データ型の種類 公理の型 言語が提供するデータ型 代表的には string, int, bool 等がある。 また、Dateなど言語が用意するClassも公理とする。つまり言語よっ て幅がある

    これらの型は公理としてコンピュータの世界に存在する概念 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 46
  47. データ型の種類 定義の型 公理の型を使用して、現実世界からコンピュータに投影したい概念を定義 する コンピュータに現実世界の営みを代行してもらう為に不可欠 オブジェクト指向においてユーザー定義クラスとして表現される 例: UserName, MemberId, Birthday

    等、投影領域に存在するあらゆる対 象の事 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 47
  48. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 48 世界創生開始時 公理の型による概念のみ存在 当然現実世界の営みを表現で きない int string bool

    float 商品を登録する 商品? 料金を計算する 料金?
  49. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 49 int string bool float 商品を登録する 商品 料金を計算する

    料金 エンジニア Item Price 商品や料金という概念が存 在する世界を創っていく
  50. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 50 example 不明な何かを受け取って 不明なプロパティが 文字列の何かと比較をし できた配列を返している 配列に何かを入れて

  51. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 51 example 公理の型のみを使用している為、 現実世界にある概念が存在しない世界 となってしまっていた。

  52. 何が問題なのか? 「不明な何か」、「文字列の何か」 これらがもし意図しないデータ、例えば性別でなく 誤って住所で判定をしてしまっていてもわかりません。 なぜなら性別も住所も等しく「文字列の何か」なので プログラムは問題なく動きます。 いえ・・・・ 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 52

  53. 動いてしまうでしょう。 意図した処理かどうかに関わらず・・・。 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 53

  54. それでもすぐ発覚すればまだ良い方です。 そのまま一月経ち、意図しないデータだらけのデータ ベースに気づいた時に初めてそのバグに気づいた時、、 想像するだけで恐ろしい話です。 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 54

  55. もちろん、いきなりこんなバグを生むことはほぼ無いでしょう。 ですが、稼働後時間が経ち、新たな機能が追加されていく過程 の中で、この処理に影響が出ないという保証を未来永劫信じる 事ができるでしょうか? 答えは No です。 未来を保証する事は不可能です。 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020

    55
  56. 定義の型を使用して 概念を投影した場合はどうでしょうか? 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 56

  57. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 57 ※ sample コードが PHPなので @var 等が入っていますが、 お使いの言語により適宜読み替えてください

    定義の型により処理に登場する 全ての概念を表現している
  58. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 58 公理の型を使用して定義の型を作る 営みの対象となる概念をClassを使用し投影する

  59. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 59 定義の型により概念を投影し、システムは各概念の存在を「認知」できるにする。 それはつまり、コンパイラや静的解析によって 概念同士のコラボレーションが適切であるかを判断できるという事。 これは今後あらゆる機能が追加された場合でも検査可能となり、 意図せぬ影響を察知しやすくなる。

  60. もうひとつの公理 言語が与えてくれる「型」以外の公理 - 順次 - 選択 - 反復 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020

    60
  61. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 61 これはまた別の機会に お話しできればと思います

  62. ロジックとアクティビティ Description アプリケーションの設計を行う前提として、まずは 無の世界であるコンピュータに、プログラミング言語の力を使って 概念を投影する必要があるという事をご紹介しました。 そこには公理の型と定義の型が存在します。 ここからは概念のもう一つの軸を考察していきます。 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 62

  63. ロジックとアクティビティ Next about 具体的にはLogicとActivity の違いを考察します 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 63

  64. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 64 アプリケーション開発において こんな言葉をよく使いませんか

  65. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 65 ビジネスロジック

  66. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 66 断言します この言葉がアプリケーション開発に 様々な混乱をもたらしています

  67. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 67 データベース上のデータに対する処理手順といったようなものを指す、 (…中略) いずれにしても、ビジネスロジックという用語は明確な定義がなく、 人によって意味が異なる可能性がある。 Wikipedia より

  68. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 68 公理の型を使用して定義の型を定義するという考え方で アプリケーションの中に概念を投影する土台ができました。 しかし、それだけではまだまだ無秩序です。 それらの概念を2つのグループに分け、 より制御しやすくより柔軟性のある世界を創っていきたいと 思います。

  69. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 69 Activity 営み。活動。 我々がアプリケーションに落とし込みたい「対象( Object )」 アプリケーションの有無に限らず存在する大前提。 営みを代行させる手段の一つがアプリケーションであるという立場。

    主に名詞からなる Domain Activity と 手続きを表す UseCase Activity とが存在する
  70. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 70 Application Logic Activity をアプリケーション上で表現する為に必要な論理、ロジック。 アプリケーションを駆動する為に必要不可欠な存在ではあるが、 Activity と違い現実世界の営みに対して影響力を持たない

  71. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 71 定義の型 公理の型 Activity Application Logic 現実世界の 活動の概念表現

    アプリケーションを 成立させる為の概念 表現 言語が初期に 提供する機能 ここは 存在しない
  72. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 72 定義の型 公理の型 Activity Application Logic 現実世界の 活動の概念表現

    アプリケーションを 成立させる為の概念 表現 言語が初期に 提供する機能 ここは 存在しない 言語が 実在する営みを表現する事はない
  73. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 73 定義の型 公理の型 Activity Application Logic 現実世界の 活動の概念表現

    アプリケーションを 成立させる為の概念 表現 言語が初期に 提供する機能 ここは 存在しない プログラミング言語が提供する概念 小さなシステムであれば ここだけでも開発は可能
  74. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 74 定義の型 公理の型 Activity Application Logic 現実世界の 活動の概念表現

    アプリケーションを 成立させる為の概念 表現 言語が初期に 提供する機能 ここは 存在しない Activityをアプリケーション上で実現する為の 概念
  75. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 75 定義の型 公理の型 Activity Application Logic 現実世界の 活動の概念表現

    アプリケーションを 成立させる為の概念 表現 言語が初期に 提供する機能 ここは 存在しない 定義の型により存在させた「営み」 現実世界の活動を表現する アプリケーションの中核 さらに「Domain Activity」と 「UseCase Activity」に分類される
  76. ⚫ コンピュータは現実世界を知らない ⚫ 与えられた武器は「プログラミング言語」 ⚫ ここに現実世界の「営み」を代行してくれる小さな 世界を創りあげる 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 76

    世界創世レシピ
  77. 投影世界の創造 Description ここまで概念投影指向という観点でオブジェクト指向設計をする為に必要な前提知識を あげてきました。 そしてそれはまだ入り口に過ぎません。 最後に具体的な進め方をイメージしていきたいと思います。 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 77

  78. 投影世界の創造 Next about 例を元に公理の型、定義の型、 Acitivity、Application Logic を意識しながら 投影世界を創る工程がどのようなものかを見ていきます。 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020

    78
  79. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 79 例 : ホテル予約システム

  80. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 80 Domain Activity

  81. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 81 Domain Activity 宿泊客、予約、宿泊日、客室、部屋番号、空き室、収容人数、宿泊料金、 アメニティ、予約日、チェックイン時間、チェックアウト時間 …etc 上記の概念達はアプリケーションの有無に限らずホテル予約業務が存在する上で必ず必要となる概念。 アプリケーションが存在しなかったとしてもノートや記憶、電話、FAX、メモ書きや

    台帳などで管理されている アプリケーション設計者は これらを定義の型を用いてActivity としてアプリケーションに存在させる必要がある
  82. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 82 ドメインモデリング このActivityを分析する作業をドメインモデリングと呼びます。 アプリケーションシステムに投影したい実世界の営みを探し出します。 と言っても何も難しく考える必要はありません。 設計者が最初にやる事はいたって単純です。 その投影する営みの様々な対象(オブジェクト)を書き起こしていくだけです。 対象領域の用語集を作成していると言い換えても良いでしょう。

  83. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 83 Activity

  84. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 84 POINT

  85. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 85 ドメインモデリングで重要なのは対象の洗い出しです。 システム化する事を意識する必要はなく、また完全である必要もありません。 (※ クラス図では無い事に注意) 注目するのはアプリケーションの有無に関わらず存在するべき 現実世界における「営み」かどうか。その一点だけです。 対象領域に存在する言葉の一つ一つに注目し、対象同士の関連にも注目しましょう。

    業務システムの場合、実際の業務に従事している人からヒアリングしながら行うとより 精度が高まります。 また、ドメインモデル図で表現できない事はメモをどんどんつけていきます。
  86. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 86 Activity

  87. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 87 ユースケースActivity

  88. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 88 UseCase Activity Domain Activity をドメインモデリングにて洗い出しました。 ただ、それだけでは単なる用語集です。 なんの実用性もまだ持ちえません。

    少しシステムよりに近づけていきます。(と言ってもまだApplication Logic を意識する必 要はありません) 作成した用語集を具体的にどのように使用するか、というのも重要な現実世界の営みの一部 です。 これをUseCase Activity と呼びます。
  89. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 89 ユースケースActivity 本資料はあくまで「概念投影」とい う観点においてActivityの探索を行 うという「考え方」についての説明 です。 具体的なUMLの書き方等については 別途調べてみてください

  90. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 90 ドメインモデリングとユースケース洗い出しによって、 今回システム化したい領域の投影対象が見えてきました。 この「対象」達をアプリケーションに投影します。 具体的には、公理の型を用いて定義の型を作成する事です。 これによりアプリケーションが現実世界の「知識」を持ちます。 この知識を持つという事がアプリケーションをより堅牢に、より柔 軟性を持たせます。

  91. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 91 予約番号 (Domain Activity) 予約確認 (UseCase Activity) Activityにない

    概念(型)が必要となる = Application Logicとなる
  92. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 92 Application Logic 例 - CSVファイル等のファイルレイアウトやそのヘッダ、パース方など - データベースなどの永続化

    - API呼び出し等の外部システム連携 - Job Queue 等技術的手法を実現する為の知識 これらは時によって、Activity と混同しがち。 また、多くの場合ClassではなくInterfaceとして抽象概念として定義される 注意点 - Application Logic は現実世界の営みに組み込まれているように見える場合がある - 例えばCSVでデータを取り込んでいる作業があったとしてもそれがTSVでも代用可能 であればそれは営みを実現する為の手段となるのでCSVであること自体はActivityと はならない
  93. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 93 概念投影指向は考え方のガイドラインとなるものです。 実際の設計活動はこの考え方をベースにしながらも様々な手法や理論を用いる 必要があります。 ただ、それらの手法をただ暗記しても良い設計にはなりません。 設計活動とは、目的がありそれを実現する為のものです。 手法や理論を用いる前にその活動とはいったい何を実現しようとしているのか、 その指針を持つことが重要となるでしょう。

  94. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 94 コンピュータという無機質な仮想世界に、現実世界の概念を投影する事で 仮想世界に現実世界を存在させる。 そしてそれらを協調させて現実世界の営みを代行できる世界を創りあげる。 この前提を認識することが概念投影指向という考え方です。

  95. Next World Description 概念投影指向により、 別の角度の見方をすることができるという紹介をして まとめたいと思います。 Next about 概念の投影を前提としたアプリケーション設計 概念投影によるオブジェクト指向設計の考え方とその方法

    OOC2020 95
  96. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 96 関心の統合 ここまで見て頂いてお気づきの通り、投影された全ては単一で存在する概念です。 むしろAtomicな存在まで概念を分析する事に本質を置きます。 そしてそれらをデータ型とする事でコンピュータの世界に概念を投影していました。 それらはオブジェクト指向において一般的にClassとして表現されます。

  97. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 97 一般的に設計の際に気にする事の一つに「単一責務」や「関心の分離」等があります。 真逆の事を言っているようですがそうではありません。 設計をせず、もしくは考慮が足りない設計を行うと 無意識に複数の責務や関心を持った処理を作成しがちです。 その結果としてfatになり、結果として単一責務や関心の分離が必要となります。

  98. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 98 しかし、概念投影指向は違います。 概念投影指向という前提の元各概念たちは既に単一(Atomic)な存在です。 対象を一つ一つ投影する事が前提だからです。 したがって分離する必要はありません。 むしろそれらの単一の概念を組み合わせより豊かな表現を持つDomainとして統合していく事にな るでしょう。

  99. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 99 レイヤードアーキテクチャ レイヤードアーキテクチャの構成で重要な「Port – Adaptor 」 概念投影指向に基づいたシステムでは抽象化したい概念は Application

    Logic として投影されているでしょう。 ライフサイクルに合わせてレイヤーを切り、そこにPortとして Application Logic を抽象化し てください。 そしてApplicationの成立に必要な具体的な処理の多くはAdapterに収まります
  100. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 100 契約による設計 関数などのシグネチャに型を指定し、各振る舞いの事前条件や事後条件を制限する(契約する) 事により品質を高める考え方があります。 概念投影に基づいた設計は契約による設計と相性が非常に良いです。

  101. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 101 契約による設計 なぜなら契約したい概念のほとんどはActivity と Application Logic としてアプリケーション の世界で認識できるようになっているでしょう。

    あとは、契約を書くだけです。 公理の型のみで作られたアプリケーションは契約を書きたくても書けません (厳密には緩い契約しか書けません)
  102. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 102 DDD Domain の蒸留サイクルを中心に据えた設計手法です。 概念投影指向に基づいたシステムはDDDとの相性も非常に良いです。

  103. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 103 DDD Activity の洗い出しをするドメインモデリングをする際にできたモデルを アプリケーションに落とし込むだけです。 ActivityとApplication Logic の違いを認識した投影は、

    DDDの戦術的な手法にもスムーズに適応するでしょう。 したがってドメインがアプリケーションに振り回されることはありません。 戦略的設計に基づいて、ドメインを蒸留していきましょう。
  104. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 104 まとめ - 設計活動は無の世界に仮想現実を創る - プログラミング言語を導入した時点では公理の型のみ存在する - 公理の型で表現できる幅に現実世界は存在しない

    - 定義の型で概念を投影する - Activity Application Logic という概念の違いを分析する - 概念を協調させて現実世界を代行するさせる
  105. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 105 ご清聴ありがとうございました。 質問等ございましたらお気軽に声かけてください。 引き続きOOC2020を堪能して頂けると嬉しいです!

  106. 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 106 @hirodragon