Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
実践オブジェクト指向設計 〜Javaで学ぶオブジェクト指向(応⽤)〜
Search
Recruit
PRO
August 09, 2024
Technology
3
1.5k
実践オブジェクト指向設計 〜Javaで学ぶオブジェクト指向(応⽤)〜
2024年度リクルート エンジニアコース新人研修の講義資料です
Recruit
PRO
August 09, 2024
Tweet
Share
More Decks by Recruit
See All by Recruit
Azure Functions HTTPトリガーにおけるタイムアウトでハマったこと
recruitengineers
PRO
2
180
実務につなげる数理最適化
recruitengineers
PRO
7
740
うちにも入れたいDatadog
recruitengineers
PRO
2
580
リクルートのデータ基盤 Crois 年3倍成長!1日40,000コンテナの実行を支える AWS 活用とプラットフォームエンジニアリング
recruitengineers
PRO
2
350
Splunk Enterpriseで S3のデータを直接検索してみた!
recruitengineers
PRO
2
160
Looker APIを使い倒す ユーザーフィードバックを基にした継続的改善サイクル
recruitengineers
PRO
3
58
Kaggleふりかえり会〜LLM 20 Questions & ISIC 2024
recruitengineers
PRO
2
240
Balancing Revenue Goals and Off-Policy Evaluation Performance in Coupon Allocation
recruitengineers
PRO
2
52
Flutterによる 効率的なAndroid・iOS・Webアプリケーション開発の事例
recruitengineers
PRO
0
400
Other Decks in Technology
See All in Technology
マイクロサービスにおける容易なトランザクション管理に向けて
scalar
0
190
Oracle Cloudの生成AIサービスって実際どこまで使えるの? エンジニア目線で試してみた
minorun365
PRO
4
300
re:Invent 2024 Innovation Talks(NET201)で語られた大切なこと
shotashiratori
0
320
AWS re:Invent 2024で発表された コードを書く開発者向け機能について
maruto
0
210
KnowledgeBaseDocuments APIでベクトルインデックス管理を自動化する
iidaxs
1
280
能動的ドメイン名ライフサイクル管理のすゝめ / Practice on Active Domain Name Lifecycle Management
nttcom
0
240
ハイテク休憩
sat
PRO
2
180
AWS re:Invent 2024 ふりかえり勉強会
yhana
0
450
生成AIをより賢く エンジニアのための RAG入門 - Oracle AI Jam Session #20
kutsushitaneko
4
290
TypeScript開発にモジュラーモノリスを持ち込む
sansantech
PRO
2
640
日本版とグローバル版のモバイルアプリ統合の開発の裏側と今後の展望
miichan
1
140
あの日俺達が夢見たサーバレスアーキテクチャ/the-serverless-architecture-we-dreamed-of
tomoki10
0
500
Featured
See All Featured
A designer walks into a library…
pauljervisheath
205
24k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
How STYLIGHT went responsive
nonsquared
96
5.2k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.3k
How to Ace a Technical Interview
jacobian
276
23k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2k
Documentation Writing (for coders)
carmenintech
67
4.5k
The Cost Of JavaScript in 2023
addyosmani
46
7k
How to train your dragon (web standard)
notwaldorf
88
5.7k
Visualization
eitanlees
146
15k
Transcript
実践オブジェクト指向設計 〜Javaで学ぶオブジェクト指向(応⽤)〜 プロジェクト推進部 藤本 毅
(C) Recruit Co.,Ltd. All rights reserved. 2 講師自己紹介 【名前】 藤本
毅(フジモト タケシ) 【所属】 プロジェクト推進部 【経歴】 IT企業、常駐型開発会社、スタート アップ⽀援会社、通信キャリア等を 通してB2BからB2Cまで官公庁シス テムからチャットサービス、広告、 ⾳楽、エンタメ、旅⾏、⾦融、飲⾷、 HR等様々なシステムの開発に携わ る
(C) Recruit Co.,Ltd. All rights reserved. 3 【⾔語・OS・フレームワーク等】 Mac, Linux(CentOS,
Debian, Ubuntu, Kali, Raspberry Pi ), Windows C#、C、C++、Clojure、Ruby、Python、Ocaml、Haskell、PHP、Java、 Kotolin、Scala、Swift、Objective-C、JavaScript、CoffeeScript、 TypeScript、Go Ruby On Rails、CodeIgniter、Django、Spring、Laravel、 Playframework、sokko、 React、 Backbone.js、Vue.js、Unity、 Metasploit、Nessus、TensorFlow ..etc 【直近の活動】 Web(フロントエンド、バックエンド)、インフラ(オンプレミス・クラウド)、 サイバーセキュリティ、スマートフォン(iOS、Android、Tyzen)、電⼦回 路・FPGA、機械学習・ディープラーニング、3Dゲーム開発、OSやネットワー ク等の低レイヤー技術等、⻑年の試作やOSSの解析、業務経験等を通して得た 様々な知⾒や技術を活かし、それらを統合する研究を個⼈でおこなっている 講師自己紹介②
(C) Recruit Co.,Ltd. All rights reserved. 4 当講座と『実践データベース設計』 の2講座を通しての⽬的 架空のECサイトR書店(仮)
を題材にデー タベースからアプリケーションの設計・実装 までの広範なナレッジを体系的に整理しなが ら、実践的な内容を解説する
(C) Recruit Co.,Ltd. All rights reserved. 5 本⽇の講義のメインテーマ アプリケーション設計におけるモデルの 重要性
(C) Recruit Co.,Ltd. All rights reserved. 6 モデルを中⼼に据えた設計の意義 変更に強く、理解・把握がし易く、安定した アプリケーションを実現できる
(C) Recruit Co.,Ltd. All rights reserved. 7 モデルはシステムやアプリケーションの開 発において最も重要な要素であるといえる
(C) Recruit Co.,Ltd. All rights reserved. 8 『モデル』とは︖
(C) Recruit Co.,Ltd. All rights reserved. 9 モデルが⽣まれた背景には、研究者のアラン・ケイが提唱し た「Dynabook(ダイナブック)」という構想が端を発してい る
引用元:https://www.kyotoprize.org/2019/02/4550/
(C) Recruit Co.,Ltd. All rights reserved. 10 ダイナブックは現代のPCやスマートフォンの起源になっ ている重要なコンセプト 引⽤元︓
https://t-press-plus.com/compare_macbook_with_ipad/
(C) Recruit Co.,Ltd. All rights reserved. 11 Dynabook(ダイナブック) iPadに似てる… 引用元:https://ja.wikipedia.org/wiki/%E3%83%80%E3%82%A4%E3%83%8A%E3%83%96%E3%83%83%E3%82%AF
(C) Recruit Co.,Ltd. All rights reserved. 12 ”ダイナブック”とオブジェクト指向 ダイナブックを構成する要素としてオブジェクト指向⾔ 語のSmall
Talk(スモール・トーク)が作られた
(C) Recruit Co.,Ltd. All rights reserved. 13 オブジェクト指向とMVC Small Talkで実装する際の設計指針として
MVCアーキテクチャが提唱された
(C) Recruit Co.,Ltd. All rights reserved. 14 M : モデル(Model)
V : ビュー(View) C : コントローラ(Controller) MVCアーキテクチャ システムを以下の要素に分けたシステムのアーキテクチャ
(C) Recruit Co.,Ltd. All rights reserved. 15 モデル(Model) ビジネスロジックやデータ処理を担当 ビュー(View)
ユーザーに表⽰される画⾯やUIを担当 コントローラ(Controller) モデルとビューの間の橋渡し役 ※ViewやControllerはビジネスロジックを持たない
(C) Recruit Co.,Ltd. All rights reserved. 16 MVCは現在もWebアプリやRESTful API等で 幅広く⽤いられている
(C) Recruit Co.,Ltd. All rights reserved. 17 MVCの提唱者 MVCはアラン・ケイと同じXEROX PARC(ゼロックス・
パロアルト研究所)のトリグヴェ・リーンスカウク (Trygve Reenskaug)が1978-79年に提唱 引用元: https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%AA%E3%82%B0%E3%83%B4%E3%82%A7%E3%83%BB%E3%83%AA%E3%83%BC% E3%83%B3%E3%82%B9%E3%82%AB%E3%82%A6%E3%82%AF
(C) Recruit Co.,Ltd. All rights reserved. 18 “モデル”は元々はシステムに対するユーザの理解(mental model)とプログラムの構造を⼀致させるための概念として考案 された
MVC提唱当時の”モデル” 引用元:https://folk.universitetetioslo.no/trygver/themes/mvc/mvc-index.html
(C) Recruit Co.,Ltd. All rights reserved. 19 モデルの構成要素 データ ビジネスドメインに関連するデータ(複数ある場合はデータ間
の”関連性”も含む) ビジネスロジック モデルが表現する概念を実現するためのビジネスルールや操作 を含む振る舞い
(C) Recruit Co.,Ltd. All rights reserved. 20 モデルとオブジェクト指向 モデルは、「オブジェクトは属性(データ)と振る 舞い(関数・メソッド)を持つ」というオブジェク
ト指向の原則にも則っている
(C) Recruit Co.,Ltd. All rights reserved. 21 リーンスカウクが提唱した当時の”モデ ル”と現在の”モデル” リーンスカウクがXerox
PARCでMVCパターンを提 唱した際の「モデル」は、ビジネスロジックの点で 現代的な理解とは若⼲異なるニュアンスで使われて いた
(C) Recruit Co.,Ltd. All rights reserved. 22 ビジネスロジック(狭義/当時) ビジネスロジックは本来、アプリケーションの中核と なる機能やビジネス上の処理を実現するための振る舞
いを表すために使⽤される概念
(C) Recruit Co.,Ltd. All rights reserved. 23 つまり、ざっくりモデルは当初ユーザー から⾒たシステムの核⼼部分(特性や機 能)を表す概念だった
(C) Recruit Co.,Ltd. All rights reserved. 24 現代のシステム開発においては、プレゼンテーション層(画⾯) とデータアクセス層以外の全てのロジックをビジネスロジックに 該当するとみなすのが⼀般的
ビジネスロジック(広義/現代解釈) アプリケーションに必要な機 能やビジネスプロセスを実 現するために必要なロジック (データの参照・生成・更新・ バリデーション、演算・判 定...etc) プレゼンテーション層 (ControllerやView) アプリケーション層 (ServiceやModel等を含む) データアクセス層
(C) Recruit Co.,Ltd. All rights reserved. 25 現在のソフトウェア開発で⽤いられるモデル のパラダイムは2種類 データモデルとドメインモデル
(C) Recruit Co.,Ltd. All rights reserved. 26 データモデル データとその関連に焦点を合わせて、主にデータベースのレ コードを表現した(ソフトウェアの設計をデータベースの構
造に合わせた)モデル ドメインモデル (狭義の)ビジネスロジックに焦点を合わせたモデル リーンスカウクが提唱した当初のモデルに近い
(C) Recruit Co.,Ltd. All rights reserved. 27 ビジネスの問題領域の複雑性を抽象化して表現 ドメインモデル プレゼンテーション層
アプリケーション層 データアクセス層 ドメイン層 ドメインモデル エンティティ 集約 値オブジェクト
(C) Recruit Co.,Ltd. All rights reserved. 28 データベースの構造を表現 プレゼンテーション層 アプリケーション層
データアクセス層 データモデル エンティティ / DTO等※ ※データモデルのエンティティ とドメインモデルのエンティティ とは同一の概念ではないので 注意。またDTOは厳密にはモ デルではないが、事実上モデ ルとして使用されることがある データモデル
(C) Recruit Co.,Ltd. All rights reserved. 29 データベースの”データモデル”と アプリケーションの”データモデル”の関係 ここでの”データ
モデル”こちらを 指す
(C) Recruit Co.,Ltd. All rights reserved. 30 データモデリングはデータを中⼼に、 ドメインモデリングはビジネスロジック を中⼼に設計を⾏う⼿法
(C) Recruit Co.,Ltd. All rights reserved. 31 補⾜︓ドメインとは ドメインとはソフトウェアが扱う対象となるビジネスの知識や 課題、ビジネスルール、ビジネスプロセス、業務内容等を含ん
だ特定の領域(業界独⾃の⽤語や慣習なども含む)を指す
(C) Recruit Co.,Ltd. All rights reserved. 32 補⾜︓ユースケースとドメインの違い ユースケースは、 「システムがどのように使⽤さ
れるのか」に焦点を当て、ユーザから⾒たシステ ムの具体的な機能を表現したもの ⼀⽅、ドメインはユースケースを実現するために 「システムが何を解決しようとしているか」に焦 点を当てたもの
(C) Recruit Co.,Ltd. All rights reserved. 33 ECサイトにおける「注⽂」︓ユースケース観点 ユースケースは、ユーザー(この場合はECサイトの顧客)がシステムを通 じて⽬標を達成するための⼀連のアクションを定義する。具体的な「注⽂
する」までのユースケースを簡略化すると以下のようになる 1. 顧客がログインする 2. 商品を検索する 3. 商品をカートに追加する 4. カートを確認し、チェックアウトする 5. 配送先住所を⼊⼒したり、⽀払い⽅法を選択し、注⽂を確定する 6. 注⽂確認と完了の通知を受け取る このようにユースケースは、ユーザーのインタラクションのフローを詳細 に説明し、システムが提供すべきインターフェイスと機能を明らかにする
(C) Recruit Co.,Ltd. All rights reserved. 34 ECサイトにおける「注⽂」︓ドメイン観点 ドメインモデルを作成し、注⽂プロセスに関連するビジネスの概念やルー ルを体系的に表現する
以下は「注⽂する」プロセスに関連するドメインに紐づく要素の⼀部を⽰す エンティティ(ドメインモデル) 顧客: ⽒名、連絡先情報、認証情報等と関連する振る舞いを持つ 注⽂: 注⽂⽇時、ステータス、顧客情報、注⽂明細等と関連する振る舞いを持つ 商品: 商品名、価格等と関連する振る舞いを持つ 値オブジェクト(ドメインモデル) ⾦額: 通貨や数値等を持つ リポジトリ 注⽂リポジトリ: 注⽂情報を永続化する アプリケーションサービス 注⽂処理サービス: 注⽂を受け付け、ドメインモデルを⽤いて在庫を更新したり、 ⽀払いを処理する(プロセス全体のオーケストレーションを担う)
(C) Recruit Co.,Ltd. All rights reserved. 35 モデル中⼼設計のポイント モデルにビジネスロジックを持たせること しかし、データモデル中⼼設計ではモデルに
ビジネスロジックを持たせないことが多い
(C) Recruit Co.,Ltd. All rights reserved. 36 トランザクションスクリプト ユースケース(アクション)を中⼼にオブジェク ト(とその振る舞い)を組み⽴てる実装⽅法で、
データモデル中⼼設計とセットで語られること も多い
(C) Recruit Co.,Ltd. All rights reserved. 37 トランザクションスクリプトの利点 トランザクションスクリプト(データモデル中⼼設 計)は難しく考えずに書け、オブジェクト指向でなく
ても成⽴する。⼀⽅でドメインモデル中⼼設計は設計 に対するエンジニアの教育・維持コストが必要になる
(C) Recruit Co.,Ltd. All rights reserved. 38 トランザクションスクリプトの⽋点 オブジェクト指向の原則に則っておらず、⼿続き型の 持つ上位のモジュールが詳細なモジュールに依存する
ことで変更に弱くなるという⽋点を持ちやすい
(C) Recruit Co.,Ltd. All rights reserved. 39 トランザクションスクリプトとロジックの重複 データモデル中⼼設計(トランザクションスクリプト)は、ユー スケース別に設計されるため、複数のユースケースの間でロジッ
クが重複しても気づかず、同じようなロジックが分散しやすいと いう問題がある ⼀⽅、ドメインモデルでは、ドメインオブジェクトごとに振る舞 いが割り当て、何か新しい振る舞いを追加するときは、既存のメ ソッドを調べたうえで、無かったら追加していくため、重複がお きにくいという利点がある
(C) Recruit Co.,Ltd. All rights reserved. 40 データモデル中⼼の設計 シンプルで学習コストは低いが、設計や実装 が崩れやすい(⻑期スパンで負債になりやす
い) ドメインモデル中⼼の設計 学習コストは⾼いが、コードの可読性や変更 容易性が向上し、設計が安定する
(C) Recruit Co.,Ltd. All rights reserved. 41 ⼤規模開発の現場における制約 開発者の知識やスキルが⼀定でない(経験値や技術⼒ の異なる開発者が集まる)ため、全員が理解し、実践
できるルールや⼿法を⽤いる必要がある また、定期的な⼈員の⼊れ替わりも考慮する必要があ る
(C) Recruit Co.,Ltd. All rights reserved. 42 既存のフレームワークの構造 Springをはじめとした多くのフレームワークがデー タモデルを前提とした構造になっている
(C) Recruit Co.,Ltd. All rights reserved. 43 当講義では データモデル中⼼の設計とドメインモデル中 ⼼の設計の両⽅のアプローチからR書店の設
計・実装を解説する
(C) Recruit Co.,Ltd. All rights reserved. 44 サブ資料①:オブジェクト指向の基礎 サブ資料②:データモデル中心の設計 サブ資料③:ドメインモデル中心の設計
本講義のサブ資料⼀覧 詳細はサブ資料で解説
(C) Recruit Co.,Ltd. All rights reserved. 45 副読本について
(C) Recruit Co.,Ltd. All rights reserved. 46 『良いコード/悪いコードで学ぶ設計⼊⾨』 リクルートのプロダクト開発におけるソースコード共通化等の課題の ヒントになるような項⽬が並び、著者の探求した知⾒が詰まっている
引用元:https://m.media-amazon.com/images/I/817j7UfuaxL._SL1500_.jpg
(C) Recruit Co.,Ltd. All rights reserved. 47 その他推薦書籍
(C) Recruit Co.,Ltd. All rights reserved. 48 『エリック・エヴァンスのドメイン駆動設計』 ドメイン駆動開発に限らない、ソフトウェア設計全 体における深い知⾒が詰まっており、⽇本語で書か
れた設計関連書籍では、現時点で最⾼の本といえる 引用元:https://m.media-amazon.com/images/I/51f7WXHJYCL.jpg
(C) Recruit Co.,Ltd. All rights reserved. 49 『実践ドメイン駆動設計』 エヴァンスの『ドメイン駆動設計』を実装 したもの。通称”IDDD本”
引用元:hYps://m.media-amazon.com/images/I/91aTKucFSKL._SL1500_.jpg
(C) Recruit Co.,Ltd. All rights reserved. 50 『「実践ドメイン駆動設計」から学ぶDDDの実装⼊⾨』 主に⼊⾨者向けの技術書で定評のある著 者が“IDDD本”を⽇本語で解説した書籍
引用元:https://m.media-amazon.com/images/I/81TK4PfumoL._SL1500_.jpg
(C) Recruit Co.,Ltd. All rights reserved. 51 『プリンシプル オブ プログラミング』
3年⽬までに⾝につけたい ⼀⽣役⽴つ101の原理原則 コードベースではないものの、コーディング や設計に必要な考え⽅がまとめられた良書 引用元:hYps://m.media-amazon.com/images/I/61IQxm626YL._SL1500_.jpg
(C) Recruit Co.,Ltd. All rights reserved. 52 『現場で役⽴つシステム設計の原則』 従来のドメイン駆動設計を咀嚼する形で、ドメインモデルを⽤ いた設計について、Webシステムの基礎から触れている良書だ
が、エリック・エヴァンスのドメイン駆動設計とやや異なる点 があるので注意 引用元:https://m.media-amazon.com/images/I/816kPT38qiL._SL1500_.jpg
(C) Recruit Co.,Ltd. All rights reserved. 53 『リーダブルコード』 より良いコードを書くためのシンプルで実践的なテクニック コーディングやコーディングの規則に関して幅
広い層に読まれている書籍 引用元:hYps://m.media-amazon.com/images/I/81+3DpjuMdL._SL1500_.jpg
(C) Recruit Co.,Ltd. All rights reserved. 54 Effective Java 第3版
やや⽂章にクセがありますが、中級以上 のJavaエンジニアは必読の良書 引用元:https://m.media-amazon.com/images/I/71QGo2A2p2L._SL1500_.jpg
(C) Recruit Co.,Ltd. All rights reserved. 55 データベースの基本的な仕組みや正規化について詳しく 解説されている良書 『達⼈に学ぶDB設計
徹底指南書』 引用元:hYps://m.media-amazon.com/images/I/91KkYEHTxXL._SL1500_.jpg
(C) Recruit Co.,Ltd. All rights reserved. 56 当講義の関連リポジトリ(GHE) 架空のECサイトR書店 ※準備中
rbooks (https://ghe.misosiru.io/takeshi-fujimoto/rbooks) rbooks-ddd (https://ghe.misosiru.io/takeshi-fujimoto/rbooks-ddd)
(C) Recruit Co.,Ltd. All rights reserved. 57 推奨リポジトリ(GitHub) IDDD_Samples(https://github.com/VaughnVernon/IDDD_S amples)
『実践ドメイン駆動設計』のリポジトリ dddsample-core(https://github.com/citerus/dddsample- core) DDDの⽣みの親であるEric Evansの会社Domain Language とスウェーデンの Citerusという会社の共同作業で進められているプロジェクト