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
オブジェクト指向 導入 / OOP1
Search
nrs
May 06, 2018
Programming
32k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
オブジェクト指向 導入 / OOP1
勉強会での登壇用資料です。
オブジェクト指向についての解説の導入です。
オブジェクト指向とは何であるのかについて定義していきます。
https://nrslib.com
nrs
May 06, 2018
More Decks by nrs
See All by nrs
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
250
どこまでを引き受けるのか — 変わり続ける役割と、変わらない思考法 / How Much We Take On — Evolving Roles and Enduring Ways of Thinking
nrslib
2
1.1k
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.7k
実装は速くなった、レビューはどうする? ― 自身のレビューをAIで再現させるサーヴァントエンジニアリングのすゝめ / Implementation got faster. So what about reviews? — An invitation to Servant Engineering: Recreating your own code reviews with AI
nrslib
9
5.5k
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
15
6.2k
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
330
脅威をエンジニアリングの糧にして:恐怖を乗り越えた先にあったもの / Turn threats into fuel for engineering: what lay beyond overcoming fear
nrslib
1
460
AIチームを指揮するOSS「TAKT」活用術 / How to Use “TAKT,” an OSS Tool for Orchestrating AI Teams
nrslib
6
1k
実践ハーネスエンジニアリング:ステアリングループを実例から読み解く / Practical Harness Engineering: Understanding Steering Loops Through Real-World Examples
nrslib
6
7.2k
Other Decks in Programming
See All in Programming
act1-costs.pdf
sumedhbala
0
230
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
270
初めてのKubernetes 本番運用でハマった話
oku053
0
130
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
370
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
330
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
120
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
170
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
410
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
150
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
220
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
230
5分で問診!Composer セキュリティ健康診断
codmoninc
0
240
Featured
See All Featured
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Tell your own story through comics
letsgokoyo
1
990
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Being A Developer After 40
akosma
91
590k
Ruling the World: When Life Gets Gamed
codingconduct
0
280
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Discover your Explorer Soul
emna__ayadi
2
1.2k
Done Done
chrislema
186
16k
For a Future-Friendly Web
brad_frost
183
10k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
Transcript
オブジェクト指向入門 ~導入~ nrs @nrslib
オブジェクト指向とは何か
◆現実をオブジェクトとして表現する手段 ◆継承を使ったプログラミング ◆オブジェクト同士の相互作用でシステムを構築
◆現実をオブジェクトとして表現する手段 ◆継承を使ったプログラミング ◆オブジェクト同士の相互作用でシステムを構築
オブジェクト指向とは何か
抽象化の技法
抽象化の技法 でも抽象化って・・・?
抽象化してみよう
抽象化してみよう Q.あなたの一日を教えてください
Q.あなたの一日を教えてください
Q.あなたの一日を教えてください A.朝8時に起きて、顔を洗った後に朝食を 食べて、着替えて九時前に家を出ます。 九時十分の電車に乗って九時四十分に会社 の近くの駅に着きます。 駅に着いたら近くのコンビニでコーヒーを
Q.あなたの一日を教えてください A.朝8時に起きて、顔を洗った後に朝食を 食べて、着替えて九時前に家を出ます。 九時十分の電車に乗って九時四十分に会社 の近くの駅に着きます。 駅に着いたら近くのコンビニでコーヒーを こんな風に 答える人は いません
起床 -> 通勤 -> 出社 -> 勤務 昼休 -> 勤務
-> 退社 -> 帰宅 Q.あなたの一日を教えてください
起床 -> 通勤 -> 出社 -> 勤務 昼休 -> 勤務
-> 退社 -> 帰宅 Q.あなたの一日を教えてください 十分伝わりますよね
面倒と感じるときはどういうときか
欲しい情報 よりも多くの情報 を渡されたとき 面倒と感じるときはどういうときか
欲しい情報 よりも多くの情報 を渡されたとき 情報量の多いプログラム=面倒 面倒と感じるときはどういうときか
例えばこんなプログラム
None
うわ、なんか ネストいっぱい
うわ、なんか ネストいっぱい format == “csv” って、csv編集かな?
うわ、なんか ネストいっぱい csv作ってるっぽい format == “csv” って、csv編集かな?
うわ、なんか ネストいっぱい csv作ってるっぽい tsvも サポートしてるのか format == “csv” って、csv編集かな?
うわ、なんか ネストいっぱい csv作ってるっぽい tsvも サポートしてるのか 空文字がエラー? format == “csv” って、csv編集かな?
うわ、なんか ネストいっぱい csv作ってるっぽい tsvも サポートしてるのか 空文字がエラー? 読み込まないとわからない format == “csv”
って、csv編集かな?
計算処理を関数にして抽象化
計算処理を関数にして抽象化
CSVとTSVをサポート 空文字はエラーかな? 計算処理を関数にして抽象化
CSVとTSVをサポート 空文字はエラーかな? csv作ってるっぽい 計算処理を関数にして抽象化
CSVとTSVをサポート 空文字はエラーかな? csv作ってるっぽい tsv作ってるっぽい 計算処理を関数にして抽象化
CSVとTSVをサポート 空文字はエラーかな? 必要なければ見なくていい 計算処理を関数にして抽象化
抽象化とは
抽象化とは 思考における手法のひとつで、 対象から注目すべき要素を 重点的に抜き出して 他は無視する方法である。
まだ具体的なところが残っている
まだ具体的なところが残っている
変数で抽象化してみる
悪くはないけれど
悪くはないけれど
悪くはないけれど formatって 何渡せばいいの? あれ? “CSV”って指定し たら空文字が 返ってきた?
「formatに”csv”か”tsv”を指定する」ことを 知っている
実装を具体的に知っているのを前提とする 「formatに”csv”か”tsv”を指定する」ことを 知っている
実装を具体的に知っているのを前提とする 抽象化できていない 「formatに”csv”か”tsv”を指定する」ことを 知っている
どうしてこうなった
どうしてこうなった データとそのデータを利用する手続きに 密接な関係が存在しているのに データと手続きを分けて考えているから
どうしてこうなった データとそのデータを利用する手続きに 密接な関係が存在しているのに データと手続きを分けて考えているから
どうしてこうなった データとそのデータを利用する手続きに 密接な関係が存在しているのに データと手続きを分けて考えているから
どうすればよい
どうすればよい データと手続きを まとめよう
どうすればよい クラス誕生 データと手続きを まとめよう
クラスにしよう
1 処理名をクラスに クラスにしよう
1 処理名をクラスに 2 引数をフィールドに クラスにしよう
1 処理名をクラスに 2 引数をフィールドに 3 処理をメソッドに クラスにしよう
1 処理名をクラスに 2 引数をフィールドに 3 処理をメソッドに 4 処理から呼ばれる関数をメソッドに クラスにしよう
1 処理名をクラスに 2 引数をフィールドに 3 処理をメソッドに 4 処理から呼ばれる関数をメソッドに クラスにしよう
1 処理名をクラスに 2 引数をフィールドに 3 処理をメソッドに 4 処理から呼ばれる関数をメソッドに Runの前にFormatとDataを設定する必要がある =
実装を知ってもらう必要がある = あまり変わってない クラスにしよう
コンストラクタを活用
コンストラクタを活用
コンストラクタを活用
コンストラクタを活用 Runが何のデータを利用するかは気にしなくていい =抽象化できた でもまだエラーは起きる……。
エラーを無くす
エラーを無くす
エラーを無くす 分けてしまえばエラーが起きない
エラーを無くす 分けてしまえばエラーが起きない
比較しよう
比較しよう 抽象化した結果、XxxConverterクラスに「データ」と「処理」が隠蔽された
比較しよう 抽象化した結果、XxxConverterクラスに「データ」と「処理」が隠蔽された 必要な知識は new して Run を Call する だけ
比較しよう 抽象化した結果、XxxConverterクラスに「データ」と「処理」が隠蔽された 必要な知識は new して Run を Call する だけ
隠蔽 = カプセル化
ここまでまとめ 余計な情報は面倒 知らなければいけないことは面倒 面倒なことを隠す カプセル化
次の話題
None
複雑さ = ?
複雑さ 条件分岐 =
= プログラムを 複雑でなくしたい ?
= プログラムを 複雑でなくしたい 条件分岐を 減らしたい
条件分岐を減らしたい
メソッドで抽象化してみる
メソッドで抽象化
だいぶすっきり? でも条件分岐が残ってる メソッドで抽象化
クラスで抽象化してみる
クラスで抽象化
クラスで抽象化
あんまり 変わらない New Old クラスで抽象化
New Old ここが一緒 クラスで抽象化
Convert()という処理がある converterというもので
Converterというもので Convert()という処理がある こんな風に書けたら
こう書ける Converterというもので Convert()という処理がある
Convert()という処理がある ? (in C#) Converterというもので
Convert()という処理がある Interface (in C#) Converterというもので
None
Converterというもので Convert()という処理がある
None
適用してみる
適用してみる
もう一つの解法
もう一つの解法 クラスとか面倒だしメソッドにしようよ
None
None
クラス版 メソッド版 主処理を比較
クラス版 メソッド版 主処理を比較 クラスいらない説
そもそも
そもそも convertType とは?
そもそも convertType とは?
そもそも convertType とは? converter の指定
では convertType を使わずに Converter を渡したら?
では convertType を使わずに Converter を渡したら?
メソッド クラス 比較 やっと行数が互角に
まだいまいちクラス版の 利点がわかりません そこで利点がわかりやすい例として
記号”|”で文字列を連結できるように してください
クラスいらないタイプ
クラスいらないタイプ JoinByPipe()メソッド追加かな
クラスいらないタイプ JoinByPipe()メソッド追加かな “pipe”みたいな識別子を受け取る?
クラスいらないタイプ JoinByPipe()メソッド追加かな 万が一、”pipe”って識別子を送ってきているプログラムがあったら? 全部確認してみないと……。 “pipe”みたいな識別子を受け取る?
クラスにした場合
クラスにした場合 クラスを作って おしまい
何をしたか?
何をしたか? 主処理の条件式を減らした
何をしたか? 主処理の条件式を減らした 具体的にどう減らしたか?
何をしたか? 主処理の条件式を減らした 具体的にどう減らしたか? 同じ処理を持つ 似たようなものとして 抽象化して利用した
何をしたか? 主処理の条件式を減らした 具体的にどう減らしたか? 同じ処理を持つ 似たようなものとして 抽象化して利用した
もう一つのif文も同じことができます
評価処理を抽象化
評価処理を抽象化
評価処理を抽象化 具体的な処理をクラス化
評価処理を抽象化 具体的な処理をクラス化
評価処理を抽象化 具体的な処理をクラス化
評価処理を抽象化 具体的な処理をクラス化
同じ処理を持つ 似たようなものとして 抽象化して利用すること
同じ処理を持つ 似たようなものとして 抽象化して利用すること ポリモーフィズム
オブジェクト指向とは何か
オブジェクト指向とは何か カプセル化とポリモーフィズム を利用した抽象化
まとめ ◆オブジェクト指向とは カプセル化とポリモーフィズムを利用した抽象化の技術 ◆カプセル化とは 詳細を隠して(読み手に)面倒でない記述を行うこと ◆ポリモーフィズムとは 条件分岐を減らすための手段
Auther nrs HomePage https://nrslib.com Twitter @nrslib