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
2025-02-27 社内勉強会 オブジェクト指向入門
Search
Kentaro Abe
February 27, 2025
Technology
0
7
2025-02-27 社内勉強会 オブジェクト指向入門
Kentaro Abe
February 27, 2025
Tweet
Share
Other Decks in Technology
See All in Technology
実は強い 非ViTな画像認識モデル
tattaka
1
610
コンピュータビジョンの社会実装について考えていたらゲームを作っていた話
takmin
1
530
次世代KYC活動報告 / 20250219-BizDay17-KYC-nextgen
oidfj
0
440
Swiftの “private” を テストする / Testing Swift "private"
yutailang0119
0
140
株式会社EventHub・エンジニア採用資料
eventhub
0
4.3k
あれは良かった、あれは苦労したB2B2C型SaaSの新規開発におけるCloud Spanner
hirohito1108
2
820
The Future of SEO: The Impact of AI on Search
badams
0
250
一度 Expo の採用を断念したけど、 再度 Expo の導入を検討している話
ichiki1023
1
240
OpenID BizDay#17 KYC WG活動報告(法人) / 20250219-BizDay17-KYC-legalidentity
oidfj
0
420
Culture Deck
optfit
0
510
LINEギフトにおけるバックエンド開発
lycorptech_jp
PRO
0
140
Two Blades, One Journey: Engineering While Managing
ohbarye
2
490
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
244
12k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.6k
Bash Introduction
62gerente
611
210k
How to Think Like a Performance Engineer
csswizardry
22
1.4k
Into the Great Unknown - MozCon
thekraken
35
1.6k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
9
500
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.3k
Product Roadmaps are Hard
iamctodd
PRO
50
11k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
175
52k
Statistics for Hackers
jakevdp
797
220k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
30
4.6k
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 パターンもイメージしやすいかも ◦ ファイルシステムのフォルダとファイルの関係はこれ デザインパターン