オブジェクト指向 導入 / OOP1
by
nrs
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
オブジェクト指向とは何か
Slide 6
Slide 6 text
抽象化の技法
Slide 7
Slide 7 text
抽象化の技法 でも抽象化って・・・?
Slide 8
Slide 8 text
抽象化してみよう
Slide 9
Slide 9 text
抽象化してみよう Q.あなたの一日を教えてください
Slide 10
Slide 10 text
Q.あなたの一日を教えてください
Slide 11
Slide 11 text
Q.あなたの一日を教えてください A.朝8時に起きて、顔を洗った後に朝食を 食べて、着替えて九時前に家を出ます。 九時十分の電車に乗って九時四十分に会社 の近くの駅に着きます。 駅に着いたら近くのコンビニでコーヒーを
Slide 12
Slide 12 text
Q.あなたの一日を教えてください A.朝8時に起きて、顔を洗った後に朝食を 食べて、着替えて九時前に家を出ます。 九時十分の電車に乗って九時四十分に会社 の近くの駅に着きます。 駅に着いたら近くのコンビニでコーヒーを こんな風に 答える人は いません
Slide 13
Slide 13 text
起床 -> 通勤 -> 出社 -> 勤務 昼休 -> 勤務 -> 退社 -> 帰宅 Q.あなたの一日を教えてください
Slide 14
Slide 14 text
起床 -> 通勤 -> 出社 -> 勤務 昼休 -> 勤務 -> 退社 -> 帰宅 Q.あなたの一日を教えてください 十分伝わりますよね
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
No content
Slide 20
Slide 20 text
うわ、なんか ネストいっぱい
Slide 21
Slide 21 text
うわ、なんか ネストいっぱい format == “csv” って、csv編集かな?
Slide 22
Slide 22 text
うわ、なんか ネストいっぱい csv作ってるっぽい format == “csv” って、csv編集かな?
Slide 23
Slide 23 text
うわ、なんか ネストいっぱい csv作ってるっぽい tsvも サポートしてるのか format == “csv” って、csv編集かな?
Slide 24
Slide 24 text
うわ、なんか ネストいっぱい csv作ってるっぽい tsvも サポートしてるのか 空文字がエラー? format == “csv” って、csv編集かな?
Slide 25
Slide 25 text
うわ、なんか ネストいっぱい csv作ってるっぽい tsvも サポートしてるのか 空文字がエラー? 読み込まないとわからない format == “csv” って、csv編集かな?
Slide 26
Slide 26 text
計算処理を関数にして抽象化
Slide 27
Slide 27 text
計算処理を関数にして抽象化
Slide 28
Slide 28 text
CSVとTSVをサポート 空文字はエラーかな? 計算処理を関数にして抽象化
Slide 29
Slide 29 text
CSVとTSVをサポート 空文字はエラーかな? csv作ってるっぽい 計算処理を関数にして抽象化
Slide 30
Slide 30 text
CSVとTSVをサポート 空文字はエラーかな? csv作ってるっぽい tsv作ってるっぽい 計算処理を関数にして抽象化
Slide 31
Slide 31 text
CSVとTSVをサポート 空文字はエラーかな? 必要なければ見なくていい 計算処理を関数にして抽象化
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
悪くはないけれど formatって 何渡せばいいの? あれ? “CSV”って指定し たら空文字が 返ってきた?
Slide 40
Slide 40 text
「formatに”csv”か”tsv”を指定する」ことを 知っている
Slide 41
Slide 41 text
実装を具体的に知っているのを前提とする 「formatに”csv”か”tsv”を指定する」ことを 知っている
Slide 42
Slide 42 text
実装を具体的に知っているのを前提とする 抽象化できていない 「formatに”csv”か”tsv”を指定する」ことを 知っている
Slide 43
Slide 43 text
どうしてこうなった
Slide 44
Slide 44 text
どうしてこうなった データとそのデータを利用する手続きに 密接な関係が存在しているのに データと手続きを分けて考えているから
Slide 45
Slide 45 text
どうしてこうなった データとそのデータを利用する手続きに 密接な関係が存在しているのに データと手続きを分けて考えているから
Slide 46
Slide 46 text
どうしてこうなった データとそのデータを利用する手続きに 密接な関係が存在しているのに データと手続きを分けて考えているから
Slide 47
Slide 47 text
どうすればよい
Slide 48
Slide 48 text
どうすればよい データと手続きを まとめよう
Slide 49
Slide 49 text
どうすればよい クラス誕生 データと手続きを まとめよう
Slide 50
Slide 50 text
クラスにしよう
Slide 51
Slide 51 text
1 処理名をクラスに クラスにしよう
Slide 52
Slide 52 text
1 処理名をクラスに 2 引数をフィールドに クラスにしよう
Slide 53
Slide 53 text
1 処理名をクラスに 2 引数をフィールドに 3 処理をメソッドに クラスにしよう
Slide 54
Slide 54 text
1 処理名をクラスに 2 引数をフィールドに 3 処理をメソッドに 4 処理から呼ばれる関数をメソッドに クラスにしよう
Slide 55
Slide 55 text
1 処理名をクラスに 2 引数をフィールドに 3 処理をメソッドに 4 処理から呼ばれる関数をメソッドに クラスにしよう
Slide 56
Slide 56 text
1 処理名をクラスに 2 引数をフィールドに 3 処理をメソッドに 4 処理から呼ばれる関数をメソッドに Runの前にFormatとDataを設定する必要がある = 実装を知ってもらう必要がある = あまり変わってない クラスにしよう
Slide 57
Slide 57 text
コンストラクタを活用
Slide 58
Slide 58 text
コンストラクタを活用
Slide 59
Slide 59 text
コンストラクタを活用
Slide 60
Slide 60 text
コンストラクタを活用 Runが何のデータを利用するかは気にしなくていい =抽象化できた でもまだエラーは起きる……。
Slide 61
Slide 61 text
エラーを無くす
Slide 62
Slide 62 text
エラーを無くす
Slide 63
Slide 63 text
エラーを無くす 分けてしまえばエラーが起きない
Slide 64
Slide 64 text
エラーを無くす 分けてしまえばエラーが起きない
Slide 65
Slide 65 text
比較しよう
Slide 66
Slide 66 text
比較しよう 抽象化した結果、XxxConverterクラスに「データ」と「処理」が隠蔽された
Slide 67
Slide 67 text
比較しよう 抽象化した結果、XxxConverterクラスに「データ」と「処理」が隠蔽された 必要な知識は new して Run を Call する だけ
Slide 68
Slide 68 text
比較しよう 抽象化した結果、XxxConverterクラスに「データ」と「処理」が隠蔽された 必要な知識は new して Run を Call する だけ 隠蔽 = カプセル化
Slide 69
Slide 69 text
ここまでまとめ 余計な情報は面倒 知らなければいけないことは面倒 面倒なことを隠す カプセル化
Slide 70
Slide 70 text
次の話題
Slide 71
Slide 71 text
No content
Slide 72
Slide 72 text
複雑さ = ?
Slide 73
Slide 73 text
複雑さ 条件分岐 =
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
クラスで抽象化してみる
Slide 81
Slide 81 text
クラスで抽象化
Slide 82
Slide 82 text
クラスで抽象化
Slide 83
Slide 83 text
あんまり 変わらない New Old クラスで抽象化
Slide 84
Slide 84 text
New Old ここが一緒 クラスで抽象化
Slide 85
Slide 85 text
Convert()という処理がある converterというもので
Slide 86
Slide 86 text
Converterというもので Convert()という処理がある こんな風に書けたら
Slide 87
Slide 87 text
こう書ける Converterというもので Convert()という処理がある
Slide 88
Slide 88 text
Convert()という処理がある ? (in C#) Converterというもので
Slide 89
Slide 89 text
Convert()という処理がある Interface (in C#) Converterというもので
Slide 90
Slide 90 text
No content
Slide 91
Slide 91 text
Converterというもので Convert()という処理がある
Slide 92
Slide 92 text
No content
Slide 93
Slide 93 text
適用してみる
Slide 94
Slide 94 text
適用してみる
Slide 95
Slide 95 text
もう一つの解法
Slide 96
Slide 96 text
もう一つの解法 クラスとか面倒だしメソッドにしようよ
Slide 97
Slide 97 text
No content
Slide 98
Slide 98 text
No content
Slide 99
Slide 99 text
クラス版 メソッド版 主処理を比較
Slide 100
Slide 100 text
クラス版 メソッド版 主処理を比較 クラスいらない説
Slide 101
Slide 101 text
そもそも
Slide 102
Slide 102 text
そもそも convertType とは?
Slide 103
Slide 103 text
そもそも convertType とは?
Slide 104
Slide 104 text
そもそも convertType とは? converter の指定
Slide 105
Slide 105 text
では convertType を使わずに Converter を渡したら?
Slide 106
Slide 106 text
では convertType を使わずに Converter を渡したら?
Slide 107
Slide 107 text
メソッド クラス 比較 やっと行数が互角に
Slide 108
Slide 108 text
まだいまいちクラス版の 利点がわかりません そこで利点がわかりやすい例として
Slide 109
Slide 109 text
記号”|”で文字列を連結できるように してください
Slide 110
Slide 110 text
クラスいらないタイプ
Slide 111
Slide 111 text
クラスいらないタイプ JoinByPipe()メソッド追加かな
Slide 112
Slide 112 text
クラスいらないタイプ JoinByPipe()メソッド追加かな “pipe”みたいな識別子を受け取る?
Slide 113
Slide 113 text
クラスいらないタイプ JoinByPipe()メソッド追加かな 万が一、”pipe”って識別子を送ってきているプログラムがあったら? 全部確認してみないと……。 “pipe”みたいな識別子を受け取る?
Slide 114
Slide 114 text
クラスにした場合
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
もう一つのif文も同じことができます
Slide 122
Slide 122 text
評価処理を抽象化
Slide 123
Slide 123 text
評価処理を抽象化
Slide 124
Slide 124 text
評価処理を抽象化 具体的な処理をクラス化
Slide 125
Slide 125 text
評価処理を抽象化 具体的な処理をクラス化
Slide 126
Slide 126 text
評価処理を抽象化 具体的な処理をクラス化
Slide 127
Slide 127 text
評価処理を抽象化 具体的な処理をクラス化
Slide 128
Slide 128 text
同じ処理を持つ 似たようなものとして 抽象化して利用すること
Slide 129
Slide 129 text
同じ処理を持つ 似たようなものとして 抽象化して利用すること ポリモーフィズム
Slide 130
Slide 130 text
オブジェクト指向とは何か
Slide 131
Slide 131 text
オブジェクト指向とは何か カプセル化とポリモーフィズム を利用した抽象化
Slide 132
Slide 132 text
まとめ ◆オブジェクト指向とは カプセル化とポリモーフィズムを利用した抽象化の技術 ◆カプセル化とは 詳細を隠して(読み手に)面倒でない記述を行うこと ◆ポリモーフィズムとは 条件分岐を減らすための手段
Slide 133
Slide 133 text
Auther nrs HomePage https://nrslib.com Twitter @nrslib