Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
実践オブジェクト指向設計 〜Javaで学ぶオブジェクト指向(応⽤)〜
Search
Recruit
PRO
August 09, 2024
Technology
3
1.4k
実践オブジェクト指向設計 〜Javaで学ぶオブジェクト指向(応⽤)〜
2024年度リクルート エンジニアコース新人研修の講義資料です
Recruit
PRO
August 09, 2024
Tweet
Share
More Decks by Recruit
See All by Recruit
Balancing Revenue Goals and Off-Policy Evaluation Performance in Coupon Allocation
recruitengineers
PRO
1
35
Flutterによる 効率的なAndroid・iOS・Webアプリケーション開発の事例
recruitengineers
PRO
0
240
VPC Traffic Mirroring とOSS を利⽤した ネットワークフォレンジック基盤の構築・運⽤
recruitengineers
PRO
2
72
スタサプ ForSCHOOLアプリのシンプルな設計
recruitengineers
PRO
3
1.1k
リクルート流データ基盤塾~鶴谷と学ぶ~
recruitengineers
PRO
5
280
『SUUMO』 スマホサイト デザインリニューアルへの挑戦
recruitengineers
PRO
5
360
『リクルートダイレクトスカウト』 のリニューアルから振り返る: ビジョンドリブンの可能性
recruitengineers
PRO
3
340
負債あるモノリスのオブザーバビリティに組織で向き合う
recruitengineers
PRO
9
400
あなたの知らないiOS開発の世界
recruitengineers
PRO
4
340
Other Decks in Technology
See All in Technology
SAP Community and Developer Update
sygyzmundovych
0
360
Postman Flowsで作るAPI連携LINE Bot
miura55
0
220
ARRが3年で10倍になったプロダクト開発とAI活用の軌跡
akiroom
0
170
Nutanixにいらっしゃいませ。Moveと仮想マシン移行のポイント紹介
shadowhat
0
200
2024/11/29_失敗談から学ぶ! エンジニア向けre:Invent攻略アンチパターン集
hiashisan
0
180
もう一度、 事業を支えるシステムに。
leveragestech
6
3k
クラウドインフラ構築における.NETとその他IaCの比較
ymd65536
1
180
専門領域に特化したチームの挑戦
leveragestech
0
200
【Oracle Cloud ウェビナー】【入門&再入門】はじめてのOracle Cloud Infrastructure [+最新情報]
oracle4engineer
PRO
2
110
マルチプロダクト、マルチデータ基盤での Looker活用事例 〜BQじゃなくてもLookerはいいぞ〜
gappy50
0
100
Yahoo! JAPANトップページにおけるマイクロフロントエンド - 大規模組織におけるFE開発を加速させるには
lycorptech_jp
PRO
0
1.7k
生成AIを活用したIT運用高度化への挑戦
iotcomjpadmin
0
170
Featured
See All Featured
What's new in Ruby 2.0
geeforr
343
31k
VelocityConf: Rendering Performance Case Studies
addyosmani
326
24k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
Optimising Largest Contentful Paint
csswizardry
33
2.9k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
YesSQL, Process and Tooling at Scale
rocio
169
14k
Site-Speed That Sticks
csswizardry
0
84
Facilitating Awesome Meetings
lara
50
6.1k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
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という会社の共同作業で進められているプロジェクト