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
オブジェクト指向 カプセル化・ポリモーフィズム / OOP2
Search
nrs
June 20, 2018
Programming
5.9k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
オブジェクト指向 カプセル化・ポリモーフィズム / OOP2
勉強会での登壇用資料です。
オブジェクト指向のカプセル化とポリモーフィズムについての解説です。
https://nrslib.com
nrs
June 20, 2018
More Decks by nrs
See All by nrs
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
360
どこまでを引き受けるのか — 変わり続ける役割と、変わらない思考法 / How Much We Take On — Evolving Roles and Enduring Ways of Thinking
nrslib
2
1.4k
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
5
2.1k
実装は速くなった、レビューはどうする? ― 自身のレビューをAIで再現させるサーヴァントエンジニアリングのすゝめ / Implementation got faster. So what about reviews? — An invitation to Servant Engineering: Recreating your own code reviews with AI
nrslib
9
5.9k
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
15
7.2k
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
370
脅威をエンジニアリングの糧にして:恐怖を乗り越えた先にあったもの / Turn threats into fuel for engineering: what lay beyond overcoming fear
nrslib
1
510
AIチームを指揮するOSS「TAKT」活用術 / How to Use “TAKT,” an OSS Tool for Orchestrating AI Teams
nrslib
6
1.4k
実践ハーネスエンジニアリング:ステアリングループを実例から読み解く / Practical Harness Engineering: Understanding Steering Loops Through Real-World Examples
nrslib
7
7.6k
Other Decks in Programming
See All in Programming
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2k
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
4
3.1k
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
200
Are APIs Still Relevant in the AI Era?
soyuka
0
230
What We Talk About When We Talk About XP
m_seki
2
630
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
220
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
170
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
3k
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
280
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
140
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
0
1.4k
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
1
1.2k
Featured
See All Featured
Are puppies a ranking factor?
jonoalderson
2
3.9k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
330
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
740
Exploring anti-patterns in Rails
aemeredith
4
510
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
280
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Producing Creativity
orderedlist
PRO
348
41k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
280
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
330
Transcript
オブジェクト指向入門 カプセル化 ポリモーフィズム nrs @nrslib
カプセル化がなぜ必要か
カプセル化しなかったときを考えます
例えばこんなクラスを使ってみます
None
このプログラム うまく動かないんですけど
このプログラム うまく動かないんですけど ちゃんと Strategy 設定した?
このプログラム うまく動かないんですけど ちゃんと Strategy 設定した? してないじゃん
このプログラム うまく動かないんですけど ・・・・・・ ちゃんと Strategy 設定した? してないじゃん
None
Strategy を設定したら Null落ちしました
Logger 設定してないでしょ? Strategy を設定したら Null落ちしました
Logger 設定してないでしょ? 設定しなきゃダメだよ Strategy を設定したら Null落ちしました
Logger 設定してないでしょ? 設定しなきゃダメだよ ・・・・・・ Strategy を設定したら Null落ちしました
こんなやりとりをしたくない
こんなやりとりをしたくない だからカプセル化をします
こんなやりとりをしたくない だからカプセル化をします これならわかるよね? ありがとうございます!
カプセル化
カプセル化 実装等を隠蔽し抽象化すること 利用法を示し実装を守る手段
カプセル化 難しいこと言われてもわからないよ
カプセル化 難しいこと言われてもわからないよ というわけで 基本的なところを ガイドラインにしてみました 法則とかは 棚上げ
ガイド① 初期化はコンストラクタ
ガイド① 初期化はコンストラクタ
ガイド① 初期化はコンストラクタ コンストラクタ = 初期化
ガイド① 初期化はコンストラクタ Initialize() などのメソッドを定義しても見落とされます コンストラクタ = 初期化
ガイド② 自由な型を便利に使わない
ガイド② 自由な型を便利に使わない 任意の文字列で指示する = 実装を知っている
任意の文字列で指示する = 実装を知っている 自由度の低い型を指示子として利用します ガイド② 自由な型を便利に使わない
任意の文字列で指示する = 実装を知っている 自由度の低い型を指示子として利用します ガイド② 自由な型を便利に使わない
ガイド③ メソッドに前後関係は作らない
ガイド③ メソッドに前後関係は作らない 前後関係が利用者に関係ないなら内部で処理
ガイド④ できることを減らす
ガイド④ できることを減らす 一つのクラスで複数の目的を達成すると 全く関係ない処理が同じクラスに記述されます
ガイド④ できることを減らす 一つのクラスで複数の目的を達成すると 全く関係ない処理が同じクラスに記述されます 今後も雑多な処理がここに集まり いわゆるゴッドクラスになります
ガイド④ できることを減らす 目的が増えた場合は インターフェースを増やすのではなく クラスを増やします
ガイド④ できることを減らす 目的が増えた場合は インターフェースを増やすのではなく クラスを増やします
ガイド⑤ 副作用をわかりやすく
ガイド⑤ 副作用をわかりやすく 副作用が発生するメソッドは扱いが難しいです
ガイド⑤ 副作用をわかりやすく 副作用が発生するメソッドは扱いが難しいです
ガイド⑤ 副作用をわかりやすく 副作用が発生するメソッドは扱いが難しいです 何も起きない ……?
ガイド⑤ 副作用をわかりやすく 副作用が発生するメソッドは扱いが難しいです
ガイド⑤ 副作用をわかりやすく 副作用が発生するメソッドは扱いが難しいです
ガイド⑤ 副作用をわかりやすく 副作用が発生するメソッドは void 型 戻り値のあるメソッドは副作用を起こさないようにします
ガイド⑥ setter は使わない
ガイド⑥ setter は使わない 可能な限り
setter を用意することによって setter といずれかのメソッドが結びついていることを 意識してもらう必要ができてしまいます。 ガイド⑥ setter は使わない 可能な限り
setter を用意することによって setter といずれかのメソッドが結びついていることを 意識してもらう必要ができてしまいます。 ガイド⑥ setter は使わない 可能な限り
setter を用意することによって setter といずれかのメソッドが結びついていることを 意識してもらう必要ができてしまいます。 ガイド⑥ setter は使わない 可能な限り
setter を利用せず 利用するメソッドの引数や 可能ならコンストラクタで渡すようにします。 ガイド⑥ setter は使わない 可能な限り
ガイド⑦ getter は使わない
ガイド⑦ getter は使わない 可能な限り
setter はよく言われますが getter も不要です ガイド⑦ getter は使わない 可能な限り
setter はよく言われますが getter も不要です ガイド⑦ getter は使わない 可能な限り
setter はよく言われますが getter も不要です ← コレクションの長さをキャッシュ ガイド⑦ getter は使わない 可能な限り
setter はよく言われますが getter も不要です ガイド⑦ getter は使わない 可能な限り
クラスを getter の対象にすると 破壊ができてしまう setter はよく言われますが getter も不要です ガイド⑦ getter
は使わない 可能な限り
getter 使わない? じゃあどうやって結果を取得するの?
getter 必要
getter 必要 ViewModelに 変換
getter 必要 ↓ こういうコードに ↓ ViewModelに 変換
getter 必要 ↓ こういうコードに ↓ ViewModelに 変換 シンプル
getter を使わない場合
getter を使わない場合 結果を収集するクラスを作ります
結果を収集 収集クラス
結果を収集 収集クラス
結果を収集 収集クラス ↓ 利用するとこういうコードに ↓
結果を収集 収集クラス getter は消え去った ↓ 利用するとこういうコードに ↓
パラメータが増えたら?
パラメータが増えたら?
パラメータが増えたら?
getter の場合
getter の場合
修正は簡単だけど 同じ修正を何か所でする? getter の場合
収集クラス
収集クラス
収集クラス
収集クラス 変更箇所がここに集約
収集クラス 変更箇所がここに集約
収集クラス 変更箇所がここに集約 メインロジックに修正なし
ViewModel の種類が増えたら?
getter
getter
getter シンプル
収集クラス
収集クラス
収集クラス
収集クラス
収集クラス メソッドが増える……。
解決策
解決策 ポリモーフィズム
収集クラス + ポリモーフィズム
収集クラス + ポリモーフィズム
収集クラス + ポリモーフィズム
収集クラス + ポリモーフィズム
収集クラス + ポリモーフィズム クラスが増えても修正不要
カプセル化 まとめ ガイド① 初期化はコンストラクタ ガイド② 自由な型を便利に使わない ガイド③ メソッドに前後関係は作らない ガイド④ できることを減らす
ガイド⑤ 副作用をわかりやすく ガイド⑥ setter は使わない ガイド⑦ getter は使わない
ポリモーフィズムの話をします
ポリモーフィズムの種類
アドホック多相 パラメータ多相 部分型付け ポリモーフィズムの種類
アドホック多相 パラメータ多相 部分型付け オーバーロード ジェネリクス 継承 ポリモーフィズムの種類
アドホック多相 パラメータ多相 部分型付け オーバーロード ジェネリクス 継承 ポリモーフィズムの種類
アドホック多相
アドホック多相
アドホック多相
アドホック多相 C# だとこの程度
部分型付け
部分型付け 型継承 実装継承
部分型付け 型継承 実装継承 interface super class
継承の話をします
プログラミングスタイル
ボトムアップ トップダウン or プログラミングスタイル
ボトムアップ トップダウン or プログラミングスタイル どっち?
ボトムアップ トップダウン or 継承を利用するとき
ボトムアップ トップダウン or 継承を利用するとき
なぜトップダウン?
なぜトップダウン? カプセル化もポリモーフィズムも 抽象化のためのもの
なぜトップダウン? カプセル化もポリモーフィズムも 抽象化のためのもの 抽象化はなんのため?
なぜトップダウン? カプセル化もポリモーフィズムも 抽象化のためのもの 抽象化はなんのため? 利用者のため
ボトムアップ
ボトムアップ
ボトムアップ 実装の共有
ボトムアップ 利用者からすると?
ボトムアップ 利用者からすると?
ボトムアップ 利用者からすると? キャストが必要 Logic の処理を呼び出すには
ボトムアップ 利用者からすると? キャストが必要 = インスタンスの型を意識 Logic の処理を呼び出すには
ボトムアップ 利用者からすると? キャストが必要 = インスタンスの型を意識 Logic の処理を呼び出すには 抽象化できない
トップダウン
トップダウン
トップダウン ロジック二つを Roopで実行したい
トップダウン ロジック二つを Roopで実行したい とりあえず ILogic にして List に放り込んで
トップダウン ロジック二つを Roopで実行したい とりあえず ILogic にして List に放り込んで Execute()
トップダウン ロジック二つを Roopで実行したい あとは BusinessLogic で ILogic を実装すれば… とりあえず ILogic
にして List に放り込んで Execute()
トップダウン できあがり
実装継承は?
実装継承は? ポリモーフィズムを利用するだけなら 不要
実装継承は? ポリモーフィズムを利用するだけなら 不要 = 実装継承の 目的
実装継承は? ポリモーフィズムを利用するだけなら 不要 実装者の 負担を減らす = 実装継承の 目的
実装継承は? ポリモーフィズムを利用するだけなら 不要 実装者の 負担を減らす = ポリモーフィズムを利用した上で 共通部分があるときに利用 実装継承の 目的
継承 まとめ ポリモーフィズムの中の一つ 型継承と実装継承に分かれる トップダウンで設計をする 実装継承は実装者の負担を減らす
ポリモーフィズムの実践
復習 ポリモーフィズムのメリットは?
復習 条件分岐を減らす ポリモーフィズムのメリットは?
復習 条件分岐を減らす ポリモーフィズムのメリットは?
復習 条件分岐をメイン処理から移動する ポリモーフィズムのメリットは?
復習 ポリモーフィズムのメリットは? 条件分岐をメイン処理から移動する メイン処理がシンプルになる
メイン処理をシンプルにしてみます
None
このフィールドが 条件によって使われたり 使われなかったり
パターンによって 設定されたり されなかったりする値
お互いには全く 関係ない処理が 同じクラスの中に
ポリモーフィズム で 書き直そう
① 処理を抽象化してクラスで実装
① 処理を抽象化してクラスで実装
① 処理を抽象化してクラスで実装 関係ない処理が それぞれ独立
① 処理を抽象化してクラスで実装 余計な フィールドはない
② 抽象化したクラスを作るメソッド or クラスを作る
② 抽象化したクラスを作るメソッド or クラスを作る メソッド版
② 抽象化したクラスを作るメソッド or クラスを作る メソッド版
② 抽象化したクラスを作るメソッド or クラスを作る クラス版
② 抽象化したクラスを作るメソッド or クラスを作る クラス版 直接利用しないフィールドが メイン処理から消えている
③ 抽象化したクラスを使う
③ 抽象化したクラスを使う
③ 抽象化したクラスをそのまま使う ① 処理を抽象化してクラスで実装 ② 抽象化したクラスを作るメソッド or クラスを作る
③ 抽象化したクラスをそのまま使う ① 処理を抽象化してクラスで実装 ② 抽象化したクラスを作るメソッド or クラスを作る ボトムアップでは?
③ 抽象化したクラスをそのまま使う ① 処理を抽象化してクラスで実装 ② 抽象化したクラスを作るメソッド or クラスを作る ボトムアップでは? →リファクタリングだったのでボトムアップになりがち
① 抽象化したクラスをそのまま使うことを想定
① 抽象化したクラスをそのまま使うことを想定
① 抽象化したクラスをそのまま使うことを想定
② 抽象化したクラスを作るメソッド or クラスを作る
② 抽象化したクラスを作るメソッド or クラスを作る
② 抽象化したクラスを作るメソッド or クラスを作る 具体的な処理はまだないので未実装
② 抽象化したクラスを作るメソッド or クラスを作る
② 抽象化したクラスを作るメソッド or クラスを作る
③ 型継承して実装
③ 型継承して実装
③ 型継承して実装
③ 型継承して実装
③ 型継承して実装
③ 型継承して実装
③ 型継承して実装
① 抽象化したクラスをそのまま使うことを想定 ② 抽象化したクラスを作るメソッド or クラスを作る ③ 型継承して実装
トップダウン ① 抽象化したクラスをそのまま使うことを想定 ② 抽象化したクラスを作るメソッド or クラスを作る ③ 型継承して実装
メリット
メリット 条件分岐がメイン処理から消えた
メリット 条件分岐がメイン処理から消えた 条件分岐が増えても = 新機能が増えても メイン処理は修正不要
メリット 条件分岐がメイン処理から消えた 条件分岐が増えても = 新機能が増えても メイン処理は修正不要 開放/閉鎖原則
いまいち使いどころが……
よくある MVC フレームワーク(コードはASP.net)
よくある MVC フレームワーク(コードはASP.net)
ポリモーフィズム実践 まとめ (1)抽象の生成する部分 (2)抽象を利用する部分 (3)抽象を実装する部分 この三つでワンセット
Auther nrs HomePage https://nrslib.com Twitter @nrslib