×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
第二部 継承とポリモーフィズム 2025/03/26 社内勉強会 オブジェクト指向入門 1
Slide 2
Slide 2 text
2 ● サンプルプログラムはJavaで書いています ○ 言語によらない内容なのでJavaを知らなくても大丈夫 ● 説明のために簡略化している場合があります 前置き
Slide 3
Slide 3 text
3 ● オブジェクト指向ってなに? ● 面倒だから/難しいから使いたくない という人に ● オブジェクト指向の良さを知ってもらう ● クラスを使って実装したくなってもらう ことを目指す 想定読者とねらい
Slide 4
Slide 4 text
4 はじめに
Slide 5
Slide 5 text
5 1. クラス(カプセル化) 2. 継承 3. ポリモーフィズム オブジェクト指向の三大要素
Slide 6
Slide 6 text
1. クラス(カプセル化) 2. 継承 3. ポリモーフィズム 6 オブジェクト指向 の三大要素 関連するデータとロジックをまとめる オブジェクト指向は バグを減らすための考え方
Slide 7
Slide 7 text
例えばこんなかんじ: Moneyクラス 7 金額を表すデータ 金額データを扱う ロジック
Slide 8
Slide 8 text
これだけ覚えて帰ってください 8 simple, small
Slide 9
Slide 9 text
9 1. クラス(カプセル化) 2. 継承 3. ポリモーフィズム オブジェクト指向の三大要素 今回はこちらについて話します
Slide 10
Slide 10 text
10 ● 保守しやすいコードを書くために大事な概念 ● 実務でもよく登場する設計パターン なぜこの話をするのか?
Slide 11
Slide 11 text
11 ● 保守しやすいコードを書くために大事な概念 ● 実務でもよく登場する設計パターン なぜこの話をするのか? ● 理解しやすい ● 変更しやすい ● テストしやすい
Slide 12
Slide 12 text
12 複雑な条件分岐 こんな経験ないですか?
Slide 13
Slide 13 text
13 複雑な条件分岐 なぜ条件分岐なんてものが存在するのか? こんな経験ないですか?
Slide 14
Slide 14 text
14 なぜ条件分岐なんてものが 存在するのか?
Slide 15
Slide 15 text
15 なぜ条件分岐なんてものが 存在するのか? 基本的に同じだけどちょっとだけ違う
Slide 16
Slide 16 text
あるある ● 区分によって処理を変えたい ● 条件に当てはまるデータだけ 処理したい 16 なぜ条件分岐なんてものが 存在するのか? 基本的に同じ だけどちょっとだけ違う
Slide 17
Slide 17 text
17 基本的に同じだけど ちょっとだけ違う 今回のキーワード
Slide 18
Slide 18 text
18 継承 ポリモーフィズム 基本的に同じだけどちょっとだけ違うものをうまく扱う
Slide 19
Slide 19 text
19 継承 Inheritance
Slide 20
Slide 20 text
20 親クラスの機能を子クラスが引き継ぐ仕組み 継承とは? クラス 機能
Slide 21
Slide 21 text
21 親クラスの機能を子クラスが引き継ぐ仕組み 継承とは? 犬は「吠える」「走る」だけでなく 「食べる」「眠る」もできる (動物の機能を引き継ぐ) クラス 機能
Slide 22
Slide 22 text
22 継承の実装例
Slide 23
Slide 23 text
23 継承の実装例
Slide 24
Slide 24 text
24 ● 共通処理の再利用 ● コードの重複削減 継承のうれしさ
Slide 25
Slide 25 text
25 継承を使わない場合 コードの重複
Slide 26
Slide 26 text
26 継承を使う場合 共通処理は親クラスに 切り出して再利用 子クラスには差分を記述
Slide 27
Slide 27 text
27 共通化・重複削減だけを 目的に継承するのは危険 ただし
Slide 28
Slide 28 text
28 ● 親クラスを変更すると子クラスの振る舞いも変わる ○ 関連の薄い親子は思わぬバグが発生する ○ 親クラスが子クラスのことを気にし始めるとよくない ● 継承を繰り返すと階層が深くなっていく ○ 階層が深くなるほど保守性が下がる ○ ソースコードを読みづらい、変更が大変 継承の乱用は危険
Slide 29
Slide 29 text
29 1. 「一種である(is-a)」関係 2. リスコフの置換原則(SOLID原則の”L”) 継承をうまく扱うガイドライン
Slide 30
Slide 30 text
30 継承を使う場合、これを満たすことを絶対に確認するべき ● 犬は動物の一種である(dog is-a animal) 「一種である( is-a)」関係 動物 犬 ヒト
Slide 31
Slide 31 text
31 親クラスを子クラスに置き換えても問題なく動作しなければならない リスコフの置換原則 原文はけっこう難しいので意訳
Slide 32
Slide 32 text
32 親クラスを子クラスに置き換えても問題なく動作しなければならない リスコフの置換原則 原文はけっこう難しいので意訳 ハトは飛べるが、ペンギンは飛べない →リスコフの置換原則に違反🙅
Slide 33
Slide 33 text
33 基本的に同じ だけど ちょっとだけ違う 継承
Slide 34
Slide 34 text
34 ポリモーフィズム Polymorphism 多態性
Slide 35
Slide 35 text
35 同じメソッドで、オブジェクトごとに振る舞いが違うこと ポリモーフィズムとは? 同じ「食べる」でも ヒトの「食べる」と 犬の「食べる」は異なる
Slide 36
Slide 36 text
36 ポリモーフィズムの実装例 オーバーライド: 親クラスのメソッドを上書きする
Slide 37
Slide 37 text
37 ポリモーフィズムの実装例
Slide 38
Slide 38 text
38 ポリモーフィズムの実装例
Slide 39
Slide 39 text
子クラスは親クラスの機能を引き継ぐ =子クラスは親クラスとして扱える 39 ポリモーフィズムの真髄
Slide 40
Slide 40 text
40 ポリモーフィズムの真髄 犬クラスは動物クラスとして扱える
Slide 41
Slide 41 text
41 ポリモーフィズムの真髄 犬クラスは動物クラスとして扱える 同じ動物クラス なのに、 振る舞いが異なる !
Slide 42
Slide 42 text
42 1. if文やswitch文などの条件分岐を減らせる 2. コードの再利用性が高まる 3. 新しい機能追加が簡単 ポリモーフィズムのうれしさ
Slide 43
Slide 43 text
43 1. if文やswitch文などの条件分岐を減らせる 引数にヒトクラスを渡すのか、 犬クラスを渡すのかで処理が変わる ポリモーフィズムなし ポリモーフィズムあり
Slide 44
Slide 44 text
44 2. コードの再利用性が高まる 🙅ヒトクラスと犬クラスに対して 個別に実装する 🙆動物クラスに対して実装する →ヒトクラスと犬クラスで再利用できる ポリモーフィズムなし ポリモーフィズムあり
Slide 45
Slide 45 text
猫クラスを追加する場合 45 3. 新しい機能追加が簡単 動物クラスを使う側の実装や、 ヒトクラスと犬クラスの実装を変える必要がない
Slide 46
Slide 46 text
46 親クラスで定義されていないメソッドは使えない ポリモーフィズムの注意点 ヒトクラスと犬クラスをまとめて 動物クラスとして扱うための制約
Slide 47
Slide 47 text
基本的に同じ だけど ちょっとだけ違う 47 ポリモーフィズム
Slide 48
Slide 48 text
48 そうは言っても 実務でどう使うんですか?
Slide 49
Slide 49 text
49 ケース1:コントローラーの共通処理 ケース2:通知方法の切り替え 継承・ポリモーフィズムの簡単なユースケース
Slide 50
Slide 50 text
50 ケース1:コントローラーの共通処理 認証やログなどの共通処理を親クラスに切 り出し、子クラスで再利用する
Slide 51
Slide 51 text
51 ケース2:通知方法の切り替え メール通知とSlack通知をまとめて、条 件分岐せずに処理を切り替える
Slide 52
Slide 52 text
52 1. 継承について最近のトレンド 2. インターフェース 補足
Slide 53
Slide 53 text
53 継承は使い所が難しく、設計が複雑になる より柔軟な設計「コンポジション (委譲)」 ● 「機能を持つ(has-a)」関係 ● 継承よりも先にこちらを検討する 補足:1. 継承について最近のトレンド
Slide 54
Slide 54 text
54 ● UserControllerは認証機能とログ機能を持つ コンポジション 「機能を持つ( has-a)」関係 継承
Slide 55
Slide 55 text
55 インターフェースで定義された機能を実装クラスに持たせる仕組み こちらも、継承より先に検討するべき方法 補足:2. インターフェース
Slide 56
Slide 56 text
56 補足:2. インターフェース インターフェースを実装する 使い方は継承とほぼ変わらない
Slide 57
Slide 57 text
57 1. 複数のインターフェースを実装できる 2. 「暗黙の実装」がない インターフェースの利点
Slide 58
Slide 58 text
58 1. 複数のインターフェースを実装できる ペンギンは飛べないので、 Flyableインターフェースを実装しなければよい
Slide 59
Slide 59 text
59 2. 「暗黙の実装」がない 親クラスの実装を上書きしない選 択も可能 →👿暗黙の実装 実装クラスでは実装が強制される →👼暗黙の実装なし 継承 インターフェース
Slide 60
Slide 60 text
● 基本的に同じだけどちょっとだけ違うものをうまく扱う ● 継承:共通処理の再利用 ● ポリモーフィズム:柔軟な振る舞いの切り替え ● うまく使って保守しやすいコードを書こう! ○ ただし、継承を使う場合はよく検討しましょう ○ コンポジションとインターフェースで実現できるとベター 60 まとめ
Slide 61
Slide 61 text
61 ● SOLID原則 ● デザインパターン ● ドメイン駆動設計 次に学ぶとよいもの(プログラミング関連)
Slide 62
Slide 62 text
62 ● 具体と抽象 次に学ぶとよいもの(プログラミング以外) https://speakerdeck.com/soudai/a bstraction-and-concretization
Slide 63
Slide 63 text
63 参考文献