Slide 1

Slide 1 text

「オブジェクト指向」を再考する 〜オブジェクト、指向、プロトタイプ、Self〜 1 @Philomagi 2020/06/26@オブジェクト指向LT会 vol.2 #ooltjp

Slide 2

Slide 2 text

発表者 @Philomagi ● WEB系プログラマ ● 自称フロントエンド寄り ○ 最近のマイブームは SelfとSmalltalk ○ vanila jsも久しぶりにちょっと触りたい ● 設計の話とかが好きです ○ DDDとかクリーンアーキテクチャとか 2

Slide 3

Slide 3 text

今回のテーマ 3

Slide 4

Slide 4 text

「オブジェクト指向」 4

Slide 5

Slide 5 text

Object-Oriented 5

Slide 6

Slide 6 text

「指向」「Orient(ed)」の辞書的意味 6 ● 指向 ○ ある方向・目的に向かうこと。また、方向や目的を指示してその方に向かわせること。 ■ goo国語辞書 ● Orient ○ orient somebody/something (to/towards somebody/something) to direct somebody/something towards something; to make or adapt somebody/something for a particular purpose ■ Oxford Learner's Dictionaries

Slide 7

Slide 7 text

「オブジェクト」+「指向」=? 7 (辞書的意味からは)オブジェクトに向かうこと。 また、方向や目的を指示してオブジェクトに向かわせること。

Slide 8

Slide 8 text

「オブジェクト」+「指向」=? 8 (辞書的意味からは)オブジェクトに向かうこと。 また、方向や目的を指示してオブジェクトに向かわせること。 ↓ ここでは 「オブジェクトに注目する」 「オブジェクトに意識を向ける」 ぐらいの意味とする

Slide 9

Slide 9 text

代表的な「オブジェクト指向(?)」言語 ● C++, Java, etc... ○ オブジェクトというよりも、「クラス」「型」への注目が強い(ことが多い) ○ そのため、「クラス指向」という表現がされることもある ■ cf. オブジェクト指向とはなんですか? - Quora ○ C++を開発したBjarne Stroustrupも、オブジェクトより「クラス」「(抽象デー タ)型」への関心が強そう ■ cf. 『What is ‘‘Object-Oriented Programming’’? (1991 revised version)』 9

Slide 10

Slide 10 text

代表的な「オブジェクト指向(?)」言語 ● Smalltalk ○ 「オブジェクト指向」の元祖 ■ 「オブジェクト」という言葉自体はSimulaが初出(Simulaがオブジェクト 指向である、ということではない) ○ 開発者のアラン・ケイが注目していたのは、オブジェクトというよりも「メッ セージ」のメタファ? ■ 「メッセージ指向」という表現 ■ cf. 『prototypes vs classes was』 ■ cf. 『オブジェクト指向の概念の発明者は誰ですか?(改訂版)』 10

Slide 11

Slide 11 text

代表的な「オブジェクト指向(?)」言語 「オブジェクト指向」の代表格として語られる C++系にせよSmalltalk系にせよ、 むしろ「オブジェクト」以外に注目している? 11

Slide 12

Slide 12 text

代表的な「オブジェクト指向(?)」言語 「オブジェクト指向」の代表格として語られる C++系にせよSmalltalk系にせよ、 むしろ「オブジェクト」以外に注目している? ↓ 「オブジェクト指向」とは・・・? 12

Slide 13

Slide 13 text

Self Language 13

Slide 14

Slide 14 text

Self Language 14 ● 「プロトタイプベース」と呼ばれる言語の元祖 ○ javascriptもこの系譜 ■ 今はECMAScriptでclass構文も導入されてしまっているが …… ■ (´-`).。oO(昔のjavascriptが「辛い」と言われるの、プログラマが無理やりクラス 指向で書こうとしたせいという面も有るのでは ……) ● すべてをslotsの組み合わせで考える ○ slotsに値を入れればプロパティ(っぽく振る舞う) ○ slotsに関数(Self的にはOrdinary Method)を入れればメソッド(っ ぽく振る舞う)

Slide 15

Slide 15 text

Self Language 15 x y printString +

Slide 16

Slide 16 text

Self Language 16 x = 4 y = 2 printString + slots

Slide 17

Slide 17 text

Self Language 17 x = 4 y = 2 printString + slots |:point| (clone x: x + point x) y: y + point y デフォルトの組み込み実装

Slide 18

Slide 18 text

Self Language 18 x = 4 y = 2 printString + slots |:point| (clone x: x + point x) y: y + point y デフォルトの組み込み実装

Slide 19

Slide 19 text

Self Language 19 x = 4 y = 2 printString + slots |:point| (clone x: x + point x) y: y + point y デフォルトの組み込み実装 「普段はこれが良いけど、 GUIに表示す るときだけ ‘(x, y)’ な出力にしたい」

Slide 20

Slide 20 text

Self Language 20 x = 4 y = 2 printString + slots |:point| (clone x: x + point x) y: y + point y ‘(‘ + x + ‘, ‘ + y + ‘)’ // (注: 擬似コード) => ‘(4, 2)’ デフォルトの組み込み実装 「普段はこれが良いけど、 GUIに表示す るときだけ ‘(x, y)’ な出力にしたい」

Slide 21

Slide 21 text

Self Language 21 x = 4 y = 2 printString + slots |:point| (clone x: x + point x) y: y + point y ‘(‘ + x + ‘, ‘ + y + ‘)’ // (注: 擬似コード) => ‘(4, 2)’ 必要な場面で、slotsを任意のコードに挿 げ替え可能

Slide 22

Slide 22 text

Self Language 22 x = 4 y = 2 printString + x = 4 y = 2 printString + clone

Slide 23

Slide 23 text

Self Language 23 x = 4 y = 2 printString + x = 4 y = 2 printString + clone - *

Slide 24

Slide 24 text

Self Language 24 x = 4 y = 2 printString + x = 4 y = 2 printString + clone - * 特定の場面だけで必要な定義 を、後から特定のオブジェクトに 追加できる

Slide 25

Slide 25 text

Self Language 25 ● 「クラス」という概念が言語の中に存在しない ● 「新しく別のオブジェクトを用意したい」 ○ 「もうあるオブジェクトをクローンして、それを都合良いように加工す れば良いよ」 ● 個々のコード片すらもオブジェクト ○ オブジェクト同士を任意に組み合わせる(slotsの中身を交換する) ことで任意に実装をすげ替え可能 ○ 非常に高い自由度

Slide 26

Slide 26 text

まとめ 26 ● 自分がイメージしている「オブジェクト指向」ってなんだろう? ● 「オブジェクト指向」として語られる言語は、意外と「オブジェクト」を「指 向」していない=「オブジェクト」以外に注目している ● 実は、プロトタイプベースが一番「オブジェクト」に注目している=「オブ ジェクト」を「指向」しているのかも? ● 「オブジェクト指向」という言葉には前提が必要 ○ 「メッセージ指向」「クラス指向」「プロトタイプベース」「other...」どれ について会話しようとしているのか?

Slide 27

Slide 27 text

参考資料 27 ● 『指向(しこう)の意味』 - goo国語辞書 ○ https://dictionary.goo.ne.jp/word/%E6%8C%87%E5%90%91/ ● 『orient (verb) - Oxford Learner's Dictionaries』 ○ https://www.oxfordlearnersdictionaries.com/definition/english/orient_1?q=oriented ● sumim 『オブジェクト指向とは何ですか?』 ○ https://jp.quora.com/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87% E5%90%91%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B/answers/123165842#rrt Pv ● Bjarne Stroustrup『What is ‘‘Object-Oriented Programming’’? (1991 revised version)』 ○ https://www.stroustrup.com/whatis.pdf ● sumim『プロトタイプベース・オブジェクト指向』 ○ http://squab.no-ip.com/wiki/493 ● 『Self Handbook』 ○ https://handbook.selflanguage.org/2017.1/

Slide 28

Slide 28 text

● sumim『オブジェクト指向の概念の発明者は誰ですか? (改訂版)』 ○ https://sumim.hatenablog.com/entry/20040525/p1 ● 『prototypes vs classes was: Re: Sun's HotSpot』 ○ http://lists.squeakfoundation.org/pipermail/squeak-dev/1998-October/017019.html 参考資料 28