Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

Speaker 林 宏勝 hirodragon Twitter: @hirodragon112 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 4 株式会社ミライトデザイン CEO/Founder 「確かな設計によるより良いシステムを」 要件定義 | 設計 | プログラミング toB, toC のWebアプリ, スマートフォンアプリ開発 株式会社Jocy CTO 「Create My Life , Bet My Life」 美容室定額サービス「MEZON」開発・運営

Slide 5

Slide 5 text

Today's Topic my assumptions / prerequisites プログラミングの基礎を理解していて設計に興味がある、 もしくは実践しているがしっくりきていない方へ 設計活動の捉え方を話します I will talk about アプリケーション開発における設計活動の考え方 概念投影指向による公理の型と定義の型とは ロジックとアクティビティ(営み) 具体例:まとめ 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 5

Slide 6

Slide 6 text

Today's Topic I will NOT talk about DDDやICONIX SOLID原則やデザインパターン等 具体的手法や概念の解説 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 6

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

⚫ 正解がわからない ⚫ 指針がわからない ⚫ 何から始めれば良いかわからない ⚫ GOALがわからない 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 9 設計が難しく感じる理由 ×暗記 〇応用

Slide 10

Slide 10 text

全体像を知っていると同じ道のりでも認識が違う 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 10 まだかか るな 合ってる かな? GOAL START 合って る? 終わった? あと少し 終わった!

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 13 アプリケーション 現実世界 無数のアプリ ケーションが 存在する 各アプリケー ションにより 実現できる内 容は異なる コンピュータの中の 小人さんに人間の代わりを お願いしているようなもの

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 30 ホントにコンピュータもそう理解してますか?

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

例えば… 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 37 棒だ ゴルフ クラブだ ゴルフクラブと言う概念を知 らない この子はゴルフクラブ認識は 絶対に起こりえない つまりこの子の世界において ゴルフクラブが存在する事は ない ゴルフクラブと言う概念を 知っている 知っているものは認識できる このおじさんにとってこのゴ ルフクラブは存在する

Slide 38

Slide 38 text

概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 38 概念を教えて 仮想的な現実世界を創る 無

Slide 39

Slide 39 text

概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 39 無 ユーザー? アカウント? 商品? 売上? 価格? 税率? 概念 知識を増やして (存在を教えてあげて) 仮想現実を 作り上げる ユーザー アカウント 商品 売上 価格 税率

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

データ型の種類 公理の型 言語が提供するデータ型 代表的には string, int, bool 等がある。 また、Dateなど言語が用意するClassも公理とする。つまり言語よっ て幅がある これらの型は公理としてコンピュータの世界に存在する概念 概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 46

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 48 世界創生開始時 公理の型による概念のみ存在 当然現実世界の営みを表現で きない int string bool float 商品を登録する 商品? 料金を計算する 料金?

Slide 49

Slide 49 text

概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 49 int string bool float 商品を登録する 商品 料金を計算する 料金 エンジニア Item Price 商品や料金という概念が存 在する世界を創っていく

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 88 UseCase Activity Domain Activity をドメインモデリングにて洗い出しました。 ただ、それだけでは単なる用語集です。 なんの実用性もまだ持ちえません。 少しシステムよりに近づけていきます。(と言ってもまだApplication Logic を意識する必 要はありません) 作成した用語集を具体的にどのように使用するか、というのも重要な現実世界の営みの一部 です。 これをUseCase Activity と呼びます。

Slide 89

Slide 89 text

概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 89 ユースケースActivity 本資料はあくまで「概念投影」とい う観点においてActivityの探索を行 うという「考え方」についての説明 です。 具体的なUMLの書き方等については 別途調べてみてください

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 92 Application Logic 例 - CSVファイル等のファイルレイアウトやそのヘッダ、パース方など - データベースなどの永続化 - API呼び出し等の外部システム連携 - Job Queue 等技術的手法を実現する為の知識 これらは時によって、Activity と混同しがち。 また、多くの場合ClassではなくInterfaceとして抽象概念として定義される 注意点 - Application Logic は現実世界の営みに組み込まれているように見える場合がある - 例えばCSVでデータを取り込んでいる作業があったとしてもそれがTSVでも代用可能 であればそれは営みを実現する為の手段となるのでCSVであること自体はActivityと はならない

Slide 93

Slide 93 text

概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 93 概念投影指向は考え方のガイドラインとなるものです。 実際の設計活動はこの考え方をベースにしながらも様々な手法や理論を用いる 必要があります。 ただ、それらの手法をただ暗記しても良い設計にはなりません。 設計活動とは、目的がありそれを実現する為のものです。 手法や理論を用いる前にその活動とはいったい何を実現しようとしているのか、 その指針を持つことが重要となるでしょう。

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

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

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

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

Slide 99

Slide 99 text

概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 99 レイヤードアーキテクチャ レイヤードアーキテクチャの構成で重要な「Port – Adaptor 」 概念投影指向に基づいたシステムでは抽象化したい概念は Application Logic として投影されているでしょう。 ライフサイクルに合わせてレイヤーを切り、そこにPortとして Application Logic を抽象化し てください。 そしてApplicationの成立に必要な具体的な処理の多くはAdapterに収まります

Slide 100

Slide 100 text

概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 100 契約による設計 関数などのシグネチャに型を指定し、各振る舞いの事前条件や事後条件を制限する(契約する) 事により品質を高める考え方があります。 概念投影に基づいた設計は契約による設計と相性が非常に良いです。

Slide 101

Slide 101 text

概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 101 契約による設計 なぜなら契約したい概念のほとんどはActivity と Application Logic としてアプリケーション の世界で認識できるようになっているでしょう。 あとは、契約を書くだけです。 公理の型のみで作られたアプリケーションは契約を書きたくても書けません (厳密には緩い契約しか書けません)

Slide 102

Slide 102 text

概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 102 DDD Domain の蒸留サイクルを中心に据えた設計手法です。 概念投影指向に基づいたシステムはDDDとの相性も非常に良いです。

Slide 103

Slide 103 text

概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 103 DDD Activity の洗い出しをするドメインモデリングをする際にできたモデルを アプリケーションに落とし込むだけです。 ActivityとApplication Logic の違いを認識した投影は、 DDDの戦術的な手法にもスムーズに適応するでしょう。 したがってドメインがアプリケーションに振り回されることはありません。 戦略的設計に基づいて、ドメインを蒸留していきましょう。

Slide 104

Slide 104 text

概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 104 まとめ - 設計活動は無の世界に仮想現実を創る - プログラミング言語を導入した時点では公理の型のみ存在する - 公理の型で表現できる幅に現実世界は存在しない - 定義の型で概念を投影する - Activity Application Logic という概念の違いを分析する - 概念を協調させて現実世界を代行するさせる

Slide 105

Slide 105 text

概念投影によるオブジェクト指向設計の考え方とその方法 OOC2020 105 ご清聴ありがとうございました。 質問等ございましたらお気軽に声かけてください。 引き続きOOC2020を堪能して頂けると嬉しいです!

Slide 106

Slide 106 text

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