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
1
1.2k
実践オブジェクト指向設計 〜Javaで学ぶオブジェクト指向(応⽤)〜
2024年度リクルート エンジニアコース新人研修の講義資料です
Recruit
PRO
August 09, 2024
Tweet
Share
More Decks by Recruit
See All by Recruit
OR学会2024秋_短期収益と将来のオフ方策評価性能を考慮したクーポン割当方策混合比の決定
recruitengineers
PRO
3
70
リクルート新人研修2024 テキスト生成AI活用
recruitengineers
PRO
10
460
リクルートのデータマネジメント組織に 求められてきたコト
recruitengineers
PRO
4
350
最短最速に魂を売る! 新しいアーキテクチャとプロセスの提案!
recruitengineers
PRO
5
100
プロデザ! BY リクルートvol.22_様々なプロダクト経験の中で活きたPdMのスキル
recruitengineers
PRO
3
180
JavaScript研修 (2024)
recruitengineers
PRO
7
3.5k
TypeScript入門 2024
recruitengineers
PRO
25
14k
React 研修 (2024)
recruitengineers
PRO
38
14k
Next.js 研修 2024
recruitengineers
PRO
12
2.3k
Other Decks in Technology
See All in Technology
脆弱星に導かれて
nishimunea
1
1.6k
手軽に始める? おうちサーバーのすゝめ
nyagasan
0
190
すぐに始めるAWSコスト削減。短期でできる改善策と長期的な運用負荷軽減への取り組み方を解説
ncdc
1
500
AWS SAW を広めたい @四国クラウドお遍路
kazzpapa3
0
180
AI でアップデートする既存テクノロジーと、クラウドエンジニアの生きる道
soracom
PRO
1
320
四国クラウドお遍路 2024 in 高知 オープニング
yukataoka
0
140
株式会社M2X エンジニアチーム紹介資料
m2xsoftware
0
410
目標設定と習慣化で今よりも一歩生産性を上げる
sansantech
PRO
7
2.4k
20240906_JAWS_Yamanashi_#1_leap_beyond_the_AWS_all_certifications
tsumita
1
210
LLM を現場で評価する
asei
4
700
Estrategias de escalabilidade para projetos web
jessilyneh
2
190
Staff Engineer / 20240827 Yuichiro Masui
shift_evolve
0
160
Featured
See All Featured
How GitHub Uses GitHub to Build GitHub
holman
472
290k
Large-scale JavaScript Application Architecture
addyosmani
508
110k
Git: the NoSQL Database
bkeepers
PRO
425
64k
Build The Right Thing And Hit Your Dates
maggiecrowley
30
2.2k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
663
120k
The Invisible Side of Design
smashingmag
295
50k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
225
22k
YesSQL, Process and Tooling at Scale
rocio
167
14k
The Language of Interfaces
destraynor
153
23k
VelocityConf: Rendering Performance Case Studies
addyosmani
321
23k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
157
15k
Pencils Down: Stop Designing & Start Developing
hursman
118
11k
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という会社の共同作業で進められているプロジェクト