Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
2025-02-27 社内勉強会 オブジェクト指向入門 / Introduction to O...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kentaro Abe
February 27, 2025
Technology
120
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
2025-02-27 社内勉強会 オブジェクト指向入門 / Introduction to Object-Oriented
Kentaro Abe
February 27, 2025
More Decks by Kentaro Abe
See All by Kentaro Abe
2025-08-27 社内勉強会 ソフトウェアテストの基礎 / Basics of Software Testing
abekem
0
58
2025-08-06 社内勉強会 Gitを知る頃 / When You First Know Git
abekem
0
81
2025-07-02 社内勉強会 SQLに親しむ / Getting to Know SQL
abekem
0
87
2025-05-28 社内勉強会 SOLID原則ではじめるよりよい設計の第一歩 / The First Step to Better Software Design with SOLID Principles
abekem
0
140
2025-04-23 社内勉強会 デザインパターン概論 / Overview of Design Patterns
abekem
0
94
2025-03-26 社内勉強会 オブジェクト指向入門 第二部 / Introduction to Object-Oriented Part2
abekem
0
71
SAP Event Meshで始めるイベント・ドリブン・アーキテクチャ / Getting Started with Event-Driven Architecture Using SAP Event Mesh
abekem
0
270
Other Decks in Technology
See All in Technology
AIに任せられるFlutterコードベースを作る 〜仕様をコードで表し、ハーネスで守る〜
myohei
1
630
Consistency for mere mortals - A gentle guide to consistency
ufried
0
120
Content Mapper APIの応用例~CSS Modules、言語ファイル~
uhyo
2
550
re:Inventで、人生は変わったのか? / growth-builders-hub-1-reinvent-2026
mhrtech
2
280
[re:Invent2026事前勉強会(有志開催)]続きは、ラスベガスの廊下で / continue-in-the-vegas-hallway
sh_fk2
0
500
Vue で書く 空間コンピューティング、TresJS と WebXR を使ったXR デバイスのフロントエンド開発
hiranuma
0
150
Devin プロモコードの受け取りと適用(2026.10.27)
kinopeee
1
840
AIコーディングはじめました
miso
0
140
「作れる」と「リリースできる」の間にあったもの── PdMを外して見えた、PdMがやるべき仕事/Buildable ≠ Shippable: What Removing the PM Taught Me About the PM’s Job
yappli_developers
0
440
AX時代の自治体支援リソース再配分と役割分担の再構成:戦略とロードマップ(概要)
sishi2026
0
180
"AWSはちょっと苦手"でも大丈夫。AWS Blocks で手軽に作る Flutter のバックエンド #FlutterKaigi
tacck
PRO
0
130
(swiftc) NonCopyableとライフタイム修飾子
teamhimeh
0
170
Featured
See All Featured
Writing Fast Ruby
sferik
630
63k
How to make the Groovebox
asonas
2
2.5k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.3k
How to Ace a Technical Interview
jacobian
280
24k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
2
430
Designing Powerful Visuals for Engaging Learning
tmiket
1
630
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
390
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
450
Facilitating Awesome Meetings
lara
57
7.2k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
550
Git: the NoSQL Database
bkeepers
PRO
433
67k
Transcript
第一部 クラスの使い方 2025/2/27 社内勉強会 オブジェクト指向入門 1
今日のテーマ 2 simple, small
3 はじめに
4 • 人類は様々な考え方や方法論を生 み出し、バグと戦ってきた • すべてはバグを殲滅するため 人類の (システム開発の) 歴史はバグとの戦い
5 戦いの中で人類が 手に入れた武器のひとつ • オブジェクト指向 • およびその基礎となるクラス
6 オブジェクト指向 およびその基礎となるクラス 🗡🛡⚔🏹🔫
7 • オブジェクト指向/クラスってなに? • 面倒だから/難しいから使いたくない という人に • オブジェクト指向の良さを知ってもらう • クラスを使って実装したくなってもらう
ことを目指す 想定読者とねらい
8 • サンプルプログラムはJavaで書いています ◦ 言語によらない内容なのでJavaを知らなくても大丈夫 • 説明のために簡略化している場合があります 前置き
9 オブジェクト指向とは?
10 オブジェクトとは、プログラミング視点ではデータ構造とその専属手続きを一 つにまとめたものを(中略)指している。(中略)オブジェクト間の相互作用を 重視して、ソフトウェア全体を構築しようとする考え方がオブジェクト指向で ある。 Wikipediaより オブジェクト指向とは?
11 • オブジェクトとは、数値などのデータと、それらを扱うロジックをひとまとめ にしたもの • オブジェクト同士を連携させてシステム全体を構築する考え方を オブジェクト指向という ※オブジェクト≒クラス オブジェクト指向とは?(意訳)
例えばこんなかんじ: Moneyクラス 12
例えばこんなかんじ: Moneyクラス 13 金額を表すデータ 金額データを扱う ロジック
14 データとロジックを ひとまとめにして、 それを組み合わせる オブジェクト指向とは
15 戦いの中で人類が 手に入れた武器のひとつ • オブジェクト指向 • およびその基礎となるクラス
16 オブジェクト指向が なぜバグに有効なのか? データとロジックをひとまとめにする
17 そもそも、バグはなぜ発生する?
18 人間の 1. 勘違い 2. 考慮もれ これらはプログラムの「複雑さ」「大きさ」 に起因する そもそも、バグはなぜ発生する?
19 • if文の範囲を把握しづらい ◦ 勘違いしやすい • 処理のパターンが多い ◦ 考慮もれに繋がる 例えば:
何重にもネストした if文
20 • if文の範囲を把握しづらい ◦ 勘違いしやすい • 処理のパターンが多い ◦ 考慮もれに繋がる 例えば:
何重にもネストした if文 金額が1000円以上なら割引する、 という処理を追加したい場合 どこに書く?
21 • どこで何が行われているか 把握できない ◦ 勘違い ◦ 修正もれ(考慮もれ) 例えば:長〜い関数
22 • どこで何が行われているか 把握できない ◦ 勘違い ◦ 修正もれ(考慮もれ) 例えば:長〜い関数 ここで定義された変数が
ここで使われていたら?
23 • そこでオブジェクト指向 • 例えば「金額」クラス プログラムの 「複雑さ」「大きさ」 を抑制したい
プログラムの 「複雑さ」「大きさ」 を抑制したい 24 金額に関するデータと 金額に関する処理を 切り出してまとめる
25 複雑で大きい プログラムを 意味的にまとまった 小さいクラスに分割し、 クラスの中に 複雑さを閉じ込める オブジェクト指向が示した解決策
26 複雑で大きいプログラムを 意味的にまとまった 小さいクラスに分割し、 クラスの中に複雑さを閉じ込める おや?
27 • 無秩序な複雑さから 複雑さは変わらない? 複雑で大きい プログラム
28 • 無秩序な複雑さからコントロールされた複雑さへ 複雑さは変わらない? 抽出 複雑な 金額クラス 複雑で大きい (金額以外の) プログラム
29 同じ100行の処理でも、、、 金額の計算をしてたり 在庫数を調整してたり よくわかんない よくわかんないけど、 とにかく金額の計算をしている A B
30 同じ100行の処理でも、、、 金額の計算をしてたり 在庫数を調整してたり よくわかんない よくわかんないけど、 とにかく金額の計算をしている A B こっちの方が
安心じゃないですか?
31 同じ100行の処理でも、、、 金額の計算をしてたり 在庫数を調整してたり よくわかんない よくわかんないけど、 とにかく金額の計算をしている A B こっちの方が
安心じゃないですか? =同時に気にするべき ことが少ない
32 同じ100行の処理でも、、、 金額の計算をしてたり 在庫数を調整してたり よくわかんない よくわかんないけど、 とにかく金額の計算をしている A B こっちの方が
安心じゃないですか? =同時に気にするべき ことが少ない =コントロールされた 複雑さ
抽出 複雑な 金額クラス 複雑で大きい (金額以外の) プログラム 33 オブジェクト指向が提供する単純さ ここに現れる金額の処理は 単純になる
この金額の処理は複雑だが コントロールされている
34 • 使う側の単純さ オブジェクト指向が提供する単純さ
35 • 使う側の単純さ オブジェクト指向が提供する単純さ 税率が何%とか、税額の計算方法を 考えなくてよい 税率を変更しても、計算方法を変えても、 使う側に全く影響がない
36 複雑で大きい プログラムを 意味的にまとまった 小さいクラスに分割し、 クラスの中に 複雑さを閉じ込めて 使う側を単純にする オブジェクト指向がバグに有効な理由
37 simple, small 出ました✌
38 • バグは「複雑さ」と「大きさ」から生まれる • オブジェクト指向はプログラムの複雑さを 小さいクラスの中に閉じ込めて、使う側の単純さを担保する考え方 ここまでのまとめ
39 どうやって simple, small を 実現するの?
40 1. 値オブジェクト ◦ 値を扱うための専用クラス 2. コレクションオブジェクト(ファーストクラスコレクション) ◦ コレクションを扱うための専用クラス 2つのテクニック
41 1. 値オブジェクト ◦ 値を扱うための専用クラス 2. コレクションオブジェクト(ファーストクラスコレクション) ◦ コレクションを扱うための専用クラス 2つのテクニック
42 • 数量や金額などを表現したいとき、どうしますか? • int や BigDecimal などの基本データ型を使うことが多い 1. 値オブジェクト
- 基本データ型 の落とし穴 int, BigDecimal, String, LocalDate など はじめから用意されている型
43 • int はマイナス21億からプラス21億までの整数、 BigDecimal は実質無限の範囲の数値を表現できる 1. 値オブジェクト - 基本データ型
の落とし穴 int, BigDecimal, String, LocalDate など はじめから用意されている型
44 • int はマイナス21億からプラス21億までの整数、 BigDecimal は実質無限の範囲の数値を表現できる 1. 値オブジェクト - 基本データ型
の落とし穴 int, BigDecimal, String, LocalDate など はじめから用意されている型 業務上の異常値を表現できてしまうと、 システムが複雑化し、バグが混入する原因になる その範囲、 本当に必要?
45 Quantityクラスを使う限り 数値が1〜100であると 保証される 値の範囲を 制限した例
46 • 値を上書きする(できる)=複雑 • その瞬間にどんな値になっているか、処理を追わないとわからない 1. 値オブジェクト - 不変にする 悪い例
47 • 値を上書きする(できる)=複雑 • その瞬間にどんな値になっているか、処理を追わないとわからない 1. 値オブジェクト - 不変にする 悪い例
3,000円 1,000円
48 • 値を上書きさせず、変数を分ける=単純 • 一つひとつのオブジェクトの用途を限定する 1. 値オブジェクト - 不変にする 良い例
49 不変にするやり方: 1. コンストラクタで値をすべて設定する 2. 値を変更するメソッド(setterメソッド)を作らない 3. 別の値が必要であれば、別のオブジェクトをつくる 1. 値オブジェクト
- 不変にする
50 不変な 値オブジェクトの例 1. コンストラクタで 値を全て設定する 2. 値を変更するメソッド (setterメソッド)を作らない 3.
別の値が必要であれば、 別のオブジェクトを作る
51 • 基本データ型だけで書いたプログラムは、思わぬバグをうむ • 例えば、単価と数量をかけて金額を求める処理 1. 値オブジェクト - 型を使って意図を明確にする
52 • 基本データ型だけで書いたプログラムは、思わぬバグをうむ • 例えば、単価と数量をかけて金額を求める処理 1. 値オブジェクト - 型を使って意図を明確にする エラーにならず実行できてバグ発生
53 • 基本データ型だけで書いたプログラムは、思わぬバグをうむ • 例えば、単価と数量をかけて金額を求める処理 1. 値オブジェクト - 型を使って意図を明確にする
54 • 基本データ型だけで書いたプログラムは、思わぬバグをうむ • 例えば、単価と数量をかけて金額を求める処理 1. 値オブジェクト - 型を使って意図を明確にする 実行前にエラーに気づく
55 1. 値オブジェクト ◦ 値を扱うための専用クラス 2. コレクションオブジェクト(ファーストクラスコレクション) ◦ コレクションを扱うための専用クラス 2つのテクニック
56 配列やコレクションを使おうとすると、以下のような処理が頻出する 1. for 文などループ処理のロジック 2. 配列やコレクションの要素の数が変化する(可能性がある) 3. 個々の要素の内容が変化する(可能性がある) 4.
ゼロ件の場合の処理 5. 要素の最大件数の制限 2. コレクションオブジェクト - 配列やコレクションはコードを複雑にする このようなコードがあちこちに散らばると、 プログラムが複雑になりがち
57 • 考え方は値オブジェクトと同じ • コレクション型の変数を 1つだけ持った専用クラス • コレクションを操作する ロジックをすべて集める ◦
追加、削除、カウント、 特定条件の絞り込み、etc. 2. コレクションオブジェクト - コレクションを扱うための専用クラス
58 • 値オブジェクトと同様、できるだけ不変にする 不変にするやり方: 1. コレクション操作のロジックをコレクションオブジェクトに移動する 2. コレクション操作の結果も同じ型のコレクションオブジェクトとして返す 3. コレクションを不変にして外部に渡す
2. コレクションオブジェクト - 不変にする
59 • コレクション変数をそのまま返すメソッドを用意しない ◦ クラスの外部でコレクションを操作できてしまう 2. コレクションオブジェクト - 不変にする 悪い例
1. コレクション操作のロジックをコレクションオブジェクトに移動する 2. コレクション操作の結果も同じ型のコレクションオブジェクトとして返す 3. コレクションを不変にして外部に渡す
60 • 外部でやりたい操作を、クラスに集められないか検討する • 操作の結果を同じ型のコレクションオブジェクトとして返す 2. コレクションオブジェクト - 不変にする 良い例
1. コレクション操作のロジックをコレクションオブジェクトに移動する 2. コレクション操作の結果も同じ型のコレクションオブジェクトとして返す 3. コレクションを不変にして外部に渡す
61 • どうしてもコレクションを渡す必要がある場合、 変更できないコレクションを返す 2. コレクションオブジェクト - 不変にする 良い例 1.
コレクション操作のロジックをコレクションオブジェクトに移動する 2. コレクション操作の結果も同じ型のコレクションオブジェクトとして返す 3. コレクションを不変にして外部に渡す
62 1. 値オブジェクト 2. コレクションオブジェクト(ファーストクラスコレクション) 2つのテクニック
63 1. 値オブジェクト 2. コレクションオブジェクト(ファーストクラスコレクション) → カプセル化 • データとロジックをひとまとめのクラスにする • データの操作は、クラス内部のロジックで行う
• クラスの外部からデータを操作させない • 内部に複雑さを閉じ込めて、外部からの利用を単純にする 2つのテクニック
64 • オブジェクト指向プログラミングの3大要素 a. カプセル化 b. ポリモーフィズム c. 継承 •
SOLID原則 • デザインパターン • ドメイン駆動設計 オブジェクト指向を使いこなす次のステップ
65 参考文献
これだけ覚えて帰ってください 66 simple, small
67 Appendix
68 • カプセル化 • ポリモーフィズム ◦ 別々のクラスを同じように扱う • 継承 ◦
同系統のクラスを分類する オブジェクト指向プログラミングの3大要素
69 保守性の高い設計の指針 1. 単一責任の原則 Single-responsibility principle 2. 開放閉鎖の原則 Open/closed principle
3. リスコフの置換原則 Liskov substitution principle 4. インターフェース分離の原則 Interface segregation principle 5. 依存性逆転の原則 Dependency inversion principle SOLID原則
70 • ソフトウェア開発で頻出する設計のパターン集 ◦ Strategy パターン ◦ Builder パターン etc. •
Iterator パターンが最も身近だと思う ◦ Javaの拡張 for 文(for (Foo foo : barList))は これで実装されている • Composite パターンもイメージしやすいかも ◦ ファイルシステムのフォルダとファイルの関係はこれ デザインパターン