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