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
オブジェクト指向入門 カプセル化 ポリモーフィズム 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