Slide 1

Slide 1 text

オブジェクト指向入門 カプセル化 ポリモーフィズム nrs @nrslib

Slide 2

Slide 2 text

カプセル化がなぜ必要か

Slide 3

Slide 3 text

カプセル化しなかったときを考えます

Slide 4

Slide 4 text

例えばこんなクラスを使ってみます

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

このプログラム うまく動かないんですけど

Slide 7

Slide 7 text

このプログラム うまく動かないんですけど ちゃんと Strategy 設定した?

Slide 8

Slide 8 text

このプログラム うまく動かないんですけど ちゃんと Strategy 設定した? してないじゃん

Slide 9

Slide 9 text

このプログラム うまく動かないんですけど ・・・・・・ ちゃんと Strategy 設定した? してないじゃん

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

Strategy を設定したら Null落ちしました

Slide 12

Slide 12 text

Logger 設定してないでしょ? Strategy を設定したら Null落ちしました

Slide 13

Slide 13 text

Logger 設定してないでしょ? 設定しなきゃダメだよ Strategy を設定したら Null落ちしました

Slide 14

Slide 14 text

Logger 設定してないでしょ? 設定しなきゃダメだよ ・・・・・・ Strategy を設定したら Null落ちしました

Slide 15

Slide 15 text

こんなやりとりをしたくない

Slide 16

Slide 16 text

こんなやりとりをしたくない だからカプセル化をします

Slide 17

Slide 17 text

こんなやりとりをしたくない だからカプセル化をします これならわかるよね? ありがとうございます!

Slide 18

Slide 18 text

カプセル化

Slide 19

Slide 19 text

カプセル化 実装等を隠蔽し抽象化すること 利用法を示し実装を守る手段

Slide 20

Slide 20 text

カプセル化 難しいこと言われてもわからないよ

Slide 21

Slide 21 text

カプセル化 難しいこと言われてもわからないよ というわけで 基本的なところを ガイドラインにしてみました 法則とかは 棚上げ

Slide 22

Slide 22 text

ガイド① 初期化はコンストラクタ

Slide 23

Slide 23 text

ガイド① 初期化はコンストラクタ

Slide 24

Slide 24 text

ガイド① 初期化はコンストラクタ コンストラクタ = 初期化

Slide 25

Slide 25 text

ガイド① 初期化はコンストラクタ Initialize() などのメソッドを定義しても見落とされます コンストラクタ = 初期化

Slide 26

Slide 26 text

ガイド② 自由な型を便利に使わない

Slide 27

Slide 27 text

ガイド② 自由な型を便利に使わない 任意の文字列で指示する = 実装を知っている

Slide 28

Slide 28 text

任意の文字列で指示する = 実装を知っている 自由度の低い型を指示子として利用します ガイド② 自由な型を便利に使わない

Slide 29

Slide 29 text

任意の文字列で指示する = 実装を知っている 自由度の低い型を指示子として利用します ガイド② 自由な型を便利に使わない

Slide 30

Slide 30 text

ガイド③ メソッドに前後関係は作らない

Slide 31

Slide 31 text

ガイド③ メソッドに前後関係は作らない 前後関係が利用者に関係ないなら内部で処理

Slide 32

Slide 32 text

ガイド④ できることを減らす

Slide 33

Slide 33 text

ガイド④ できることを減らす 一つのクラスで複数の目的を達成すると 全く関係ない処理が同じクラスに記述されます

Slide 34

Slide 34 text

ガイド④ できることを減らす 一つのクラスで複数の目的を達成すると 全く関係ない処理が同じクラスに記述されます 今後も雑多な処理がここに集まり いわゆるゴッドクラスになります

Slide 35

Slide 35 text

ガイド④ できることを減らす 目的が増えた場合は インターフェースを増やすのではなく クラスを増やします

Slide 36

Slide 36 text

ガイド④ できることを減らす 目的が増えた場合は インターフェースを増やすのではなく クラスを増やします

Slide 37

Slide 37 text

ガイド⑤ 副作用をわかりやすく

Slide 38

Slide 38 text

ガイド⑤ 副作用をわかりやすく 副作用が発生するメソッドは扱いが難しいです

Slide 39

Slide 39 text

ガイド⑤ 副作用をわかりやすく 副作用が発生するメソッドは扱いが難しいです

Slide 40

Slide 40 text

ガイド⑤ 副作用をわかりやすく 副作用が発生するメソッドは扱いが難しいです 何も起きない ……?

Slide 41

Slide 41 text

ガイド⑤ 副作用をわかりやすく 副作用が発生するメソッドは扱いが難しいです

Slide 42

Slide 42 text

ガイド⑤ 副作用をわかりやすく 副作用が発生するメソッドは扱いが難しいです

Slide 43

Slide 43 text

ガイド⑤ 副作用をわかりやすく 副作用が発生するメソッドは void 型 戻り値のあるメソッドは副作用を起こさないようにします

Slide 44

Slide 44 text

ガイド⑥ setter は使わない

Slide 45

Slide 45 text

ガイド⑥ setter は使わない 可能な限り

Slide 46

Slide 46 text

setter を用意することによって setter といずれかのメソッドが結びついていることを 意識してもらう必要ができてしまいます。 ガイド⑥ setter は使わない 可能な限り

Slide 47

Slide 47 text

setter を用意することによって setter といずれかのメソッドが結びついていることを 意識してもらう必要ができてしまいます。 ガイド⑥ setter は使わない 可能な限り

Slide 48

Slide 48 text

setter を用意することによって setter といずれかのメソッドが結びついていることを 意識してもらう必要ができてしまいます。 ガイド⑥ setter は使わない 可能な限り

Slide 49

Slide 49 text

setter を利用せず 利用するメソッドの引数や 可能ならコンストラクタで渡すようにします。 ガイド⑥ setter は使わない 可能な限り

Slide 50

Slide 50 text

ガイド⑦ getter は使わない

Slide 51

Slide 51 text

ガイド⑦ getter は使わない 可能な限り

Slide 52

Slide 52 text

setter はよく言われますが getter も不要です ガイド⑦ getter は使わない 可能な限り

Slide 53

Slide 53 text

setter はよく言われますが getter も不要です ガイド⑦ getter は使わない 可能な限り

Slide 54

Slide 54 text

setter はよく言われますが getter も不要です ← コレクションの長さをキャッシュ ガイド⑦ getter は使わない 可能な限り

Slide 55

Slide 55 text

setter はよく言われますが getter も不要です ガイド⑦ getter は使わない 可能な限り

Slide 56

Slide 56 text

クラスを getter の対象にすると 破壊ができてしまう setter はよく言われますが getter も不要です ガイド⑦ getter は使わない 可能な限り

Slide 57

Slide 57 text

getter 使わない? じゃあどうやって結果を取得するの?

Slide 58

Slide 58 text

getter 必要

Slide 59

Slide 59 text

getter 必要 ViewModelに 変換

Slide 60

Slide 60 text

getter 必要 ↓ こういうコードに ↓ ViewModelに 変換

Slide 61

Slide 61 text

getter 必要 ↓ こういうコードに ↓ ViewModelに 変換 シンプル

Slide 62

Slide 62 text

getter を使わない場合

Slide 63

Slide 63 text

getter を使わない場合 結果を収集するクラスを作ります

Slide 64

Slide 64 text

結果を収集 収集クラス

Slide 65

Slide 65 text

結果を収集 収集クラス

Slide 66

Slide 66 text

結果を収集 収集クラス ↓ 利用するとこういうコードに ↓

Slide 67

Slide 67 text

結果を収集 収集クラス getter は消え去った ↓ 利用するとこういうコードに ↓

Slide 68

Slide 68 text

パラメータが増えたら?

Slide 69

Slide 69 text

パラメータが増えたら?

Slide 70

Slide 70 text

パラメータが増えたら?

Slide 71

Slide 71 text

getter の場合

Slide 72

Slide 72 text

getter の場合

Slide 73

Slide 73 text

修正は簡単だけど 同じ修正を何か所でする? getter の場合

Slide 74

Slide 74 text

収集クラス

Slide 75

Slide 75 text

収集クラス

Slide 76

Slide 76 text

収集クラス

Slide 77

Slide 77 text

収集クラス 変更箇所がここに集約

Slide 78

Slide 78 text

収集クラス 変更箇所がここに集約

Slide 79

Slide 79 text

収集クラス 変更箇所がここに集約 メインロジックに修正なし

Slide 80

Slide 80 text

ViewModel の種類が増えたら?

Slide 81

Slide 81 text

getter

Slide 82

Slide 82 text

getter

Slide 83

Slide 83 text

getter シンプル

Slide 84

Slide 84 text

収集クラス

Slide 85

Slide 85 text

収集クラス

Slide 86

Slide 86 text

収集クラス

Slide 87

Slide 87 text

収集クラス

Slide 88

Slide 88 text

収集クラス メソッドが増える……。

Slide 89

Slide 89 text

解決策

Slide 90

Slide 90 text

解決策 ポリモーフィズム

Slide 91

Slide 91 text

収集クラス + ポリモーフィズム

Slide 92

Slide 92 text

収集クラス + ポリモーフィズム

Slide 93

Slide 93 text

収集クラス + ポリモーフィズム

Slide 94

Slide 94 text

収集クラス + ポリモーフィズム

Slide 95

Slide 95 text

収集クラス + ポリモーフィズム クラスが増えても修正不要

Slide 96

Slide 96 text

カプセル化 まとめ ガイド① 初期化はコンストラクタ ガイド② 自由な型を便利に使わない ガイド③ メソッドに前後関係は作らない ガイド④ できることを減らす ガイド⑤ 副作用をわかりやすく ガイド⑥ setter は使わない ガイド⑦ getter は使わない

Slide 97

Slide 97 text

ポリモーフィズムの話をします

Slide 98

Slide 98 text

ポリモーフィズムの種類

Slide 99

Slide 99 text

アドホック多相 パラメータ多相 部分型付け ポリモーフィズムの種類

Slide 100

Slide 100 text

アドホック多相 パラメータ多相 部分型付け オーバーロード ジェネリクス 継承 ポリモーフィズムの種類

Slide 101

Slide 101 text

アドホック多相 パラメータ多相 部分型付け オーバーロード ジェネリクス 継承 ポリモーフィズムの種類

Slide 102

Slide 102 text

アドホック多相

Slide 103

Slide 103 text

アドホック多相

Slide 104

Slide 104 text

アドホック多相

Slide 105

Slide 105 text

アドホック多相 C# だとこの程度

Slide 106

Slide 106 text

部分型付け

Slide 107

Slide 107 text

部分型付け 型継承 実装継承

Slide 108

Slide 108 text

部分型付け 型継承 実装継承 interface super class

Slide 109

Slide 109 text

継承の話をします

Slide 110

Slide 110 text

プログラミングスタイル

Slide 111

Slide 111 text

ボトムアップ トップダウン or プログラミングスタイル

Slide 112

Slide 112 text

ボトムアップ トップダウン or プログラミングスタイル どっち?

Slide 113

Slide 113 text

ボトムアップ トップダウン or 継承を利用するとき

Slide 114

Slide 114 text

ボトムアップ トップダウン or 継承を利用するとき

Slide 115

Slide 115 text

なぜトップダウン?

Slide 116

Slide 116 text

なぜトップダウン? カプセル化もポリモーフィズムも 抽象化のためのもの

Slide 117

Slide 117 text

なぜトップダウン? カプセル化もポリモーフィズムも 抽象化のためのもの 抽象化はなんのため?

Slide 118

Slide 118 text

なぜトップダウン? カプセル化もポリモーフィズムも 抽象化のためのもの 抽象化はなんのため? 利用者のため

Slide 119

Slide 119 text

ボトムアップ

Slide 120

Slide 120 text

ボトムアップ

Slide 121

Slide 121 text

ボトムアップ 実装の共有

Slide 122

Slide 122 text

ボトムアップ 利用者からすると?

Slide 123

Slide 123 text

ボトムアップ 利用者からすると?

Slide 124

Slide 124 text

ボトムアップ 利用者からすると? キャストが必要 Logic の処理を呼び出すには

Slide 125

Slide 125 text

ボトムアップ 利用者からすると? キャストが必要 = インスタンスの型を意識 Logic の処理を呼び出すには

Slide 126

Slide 126 text

ボトムアップ 利用者からすると? キャストが必要 = インスタンスの型を意識 Logic の処理を呼び出すには 抽象化できない

Slide 127

Slide 127 text

トップダウン

Slide 128

Slide 128 text

トップダウン

Slide 129

Slide 129 text

トップダウン ロジック二つを Roopで実行したい

Slide 130

Slide 130 text

トップダウン ロジック二つを Roopで実行したい とりあえず ILogic にして List に放り込んで

Slide 131

Slide 131 text

トップダウン ロジック二つを Roopで実行したい とりあえず ILogic にして List に放り込んで Execute()

Slide 132

Slide 132 text

トップダウン ロジック二つを Roopで実行したい あとは BusinessLogic で ILogic を実装すれば… とりあえず ILogic にして List に放り込んで Execute()

Slide 133

Slide 133 text

トップダウン できあがり

Slide 134

Slide 134 text

実装継承は?

Slide 135

Slide 135 text

実装継承は? ポリモーフィズムを利用するだけなら 不要

Slide 136

Slide 136 text

実装継承は? ポリモーフィズムを利用するだけなら 不要 = 実装継承の 目的

Slide 137

Slide 137 text

実装継承は? ポリモーフィズムを利用するだけなら 不要 実装者の 負担を減らす = 実装継承の 目的

Slide 138

Slide 138 text

実装継承は? ポリモーフィズムを利用するだけなら 不要 実装者の 負担を減らす = ポリモーフィズムを利用した上で 共通部分があるときに利用 実装継承の 目的

Slide 139

Slide 139 text

継承 まとめ ポリモーフィズムの中の一つ 型継承と実装継承に分かれる トップダウンで設計をする 実装継承は実装者の負担を減らす

Slide 140

Slide 140 text

ポリモーフィズムの実践

Slide 141

Slide 141 text

復習 ポリモーフィズムのメリットは?

Slide 142

Slide 142 text

復習 条件分岐を減らす ポリモーフィズムのメリットは?

Slide 143

Slide 143 text

復習 条件分岐を減らす ポリモーフィズムのメリットは?

Slide 144

Slide 144 text

復習 条件分岐をメイン処理から移動する ポリモーフィズムのメリットは?

Slide 145

Slide 145 text

復習 ポリモーフィズムのメリットは? 条件分岐をメイン処理から移動する メイン処理がシンプルになる

Slide 146

Slide 146 text

メイン処理をシンプルにしてみます

Slide 147

Slide 147 text

No content

Slide 148

Slide 148 text

このフィールドが 条件によって使われたり 使われなかったり

Slide 149

Slide 149 text

パターンによって 設定されたり されなかったりする値

Slide 150

Slide 150 text

お互いには全く 関係ない処理が 同じクラスの中に

Slide 151

Slide 151 text

ポリモーフィズム で 書き直そう

Slide 152

Slide 152 text

① 処理を抽象化してクラスで実装

Slide 153

Slide 153 text

① 処理を抽象化してクラスで実装

Slide 154

Slide 154 text

① 処理を抽象化してクラスで実装 関係ない処理が それぞれ独立

Slide 155

Slide 155 text

① 処理を抽象化してクラスで実装 余計な フィールドはない

Slide 156

Slide 156 text

② 抽象化したクラスを作るメソッド or クラスを作る

Slide 157

Slide 157 text

② 抽象化したクラスを作るメソッド or クラスを作る メソッド版

Slide 158

Slide 158 text

② 抽象化したクラスを作るメソッド or クラスを作る メソッド版

Slide 159

Slide 159 text

② 抽象化したクラスを作るメソッド or クラスを作る クラス版

Slide 160

Slide 160 text

② 抽象化したクラスを作るメソッド or クラスを作る クラス版 直接利用しないフィールドが メイン処理から消えている

Slide 161

Slide 161 text

③ 抽象化したクラスを使う

Slide 162

Slide 162 text

③ 抽象化したクラスを使う

Slide 163

Slide 163 text

③ 抽象化したクラスをそのまま使う ① 処理を抽象化してクラスで実装 ② 抽象化したクラスを作るメソッド or クラスを作る

Slide 164

Slide 164 text

③ 抽象化したクラスをそのまま使う ① 処理を抽象化してクラスで実装 ② 抽象化したクラスを作るメソッド or クラスを作る ボトムアップでは?

Slide 165

Slide 165 text

③ 抽象化したクラスをそのまま使う ① 処理を抽象化してクラスで実装 ② 抽象化したクラスを作るメソッド or クラスを作る ボトムアップでは? →リファクタリングだったのでボトムアップになりがち

Slide 166

Slide 166 text

① 抽象化したクラスをそのまま使うことを想定

Slide 167

Slide 167 text

① 抽象化したクラスをそのまま使うことを想定

Slide 168

Slide 168 text

① 抽象化したクラスをそのまま使うことを想定

Slide 169

Slide 169 text

② 抽象化したクラスを作るメソッド or クラスを作る

Slide 170

Slide 170 text

② 抽象化したクラスを作るメソッド or クラスを作る

Slide 171

Slide 171 text

② 抽象化したクラスを作るメソッド or クラスを作る 具体的な処理はまだないので未実装

Slide 172

Slide 172 text

② 抽象化したクラスを作るメソッド or クラスを作る

Slide 173

Slide 173 text

② 抽象化したクラスを作るメソッド or クラスを作る

Slide 174

Slide 174 text

③ 型継承して実装

Slide 175

Slide 175 text

③ 型継承して実装

Slide 176

Slide 176 text

③ 型継承して実装

Slide 177

Slide 177 text

③ 型継承して実装

Slide 178

Slide 178 text

③ 型継承して実装

Slide 179

Slide 179 text

③ 型継承して実装

Slide 180

Slide 180 text

③ 型継承して実装

Slide 181

Slide 181 text

① 抽象化したクラスをそのまま使うことを想定 ② 抽象化したクラスを作るメソッド or クラスを作る ③ 型継承して実装

Slide 182

Slide 182 text

トップダウン ① 抽象化したクラスをそのまま使うことを想定 ② 抽象化したクラスを作るメソッド or クラスを作る ③ 型継承して実装

Slide 183

Slide 183 text

メリット

Slide 184

Slide 184 text

メリット 条件分岐がメイン処理から消えた

Slide 185

Slide 185 text

メリット 条件分岐がメイン処理から消えた 条件分岐が増えても = 新機能が増えても メイン処理は修正不要

Slide 186

Slide 186 text

メリット 条件分岐がメイン処理から消えた 条件分岐が増えても = 新機能が増えても メイン処理は修正不要 開放/閉鎖原則

Slide 187

Slide 187 text

いまいち使いどころが……

Slide 188

Slide 188 text

よくある MVC フレームワーク(コードはASP.net)

Slide 189

Slide 189 text

よくある MVC フレームワーク(コードはASP.net)

Slide 190

Slide 190 text

ポリモーフィズム実践 まとめ (1)抽象の生成する部分 (2)抽象を利用する部分 (3)抽象を実装する部分 この三つでワンセット

Slide 191

Slide 191 text

Auther nrs HomePage https://nrslib.com Twitter @nrslib