「オブジェクト指向」を再考する / reconsider "object-oriented"

「オブジェクト指向」を再考する / reconsider "object-oriented"

https://rakus.connpass.com/event/178556/ の飛び込み発表資料です

B8403d102456248570005ee7fb2ba0f7?s=128

philomagi

June 26, 2020
Tweet

Transcript

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

  2. 発表者 @Philomagi • WEB系プログラマ • 自称フロントエンド寄り ◦ 最近のマイブームは SelfとSmalltalk ◦

    vanila jsも久しぶりにちょっと触りたい • 設計の話とかが好きです ◦ DDDとかクリーンアーキテクチャとか 2
  3. 今回のテーマ 3

  4. 「オブジェクト指向」 4

  5. Object-Oriented 5

  6. 「指向」「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
  7. 「オブジェクト」+「指向」=? 7 オブジェクトに向かうこと。 また、方向や目的を指示してオブジェクトに向かわせること。

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

  9. 代表的な「オブジェクト指向(?)」言語 • C++, Java, etc... ◦ オブジェクトというよりも、「クラス」「型」への注目が強い(ことが多い) ◦ そのため、「クラス指向」という表現がされることもある ▪

    cf. オブジェクト指向とはなんですか? - Quora ◦ C++を開発したBjarne Stroustrupも、オブジェクトより「クラス」「(抽象デー タ)型」への関心が強そう ▪ cf. What is ‘‘Object-Oriented Programming’’? (1991 revised version) 9
  10. 代表的な「オブジェクト指向(?)」言語 • Smalltalk ◦ 「オブジェクト指向」の元祖 ▪ 「オブジェクト」という言葉自体はSimulaが初出(Simulaがオブジェクト 指向である、ということではない) ◦ 開発者のアラン・ケイが注目していたのは、オブジェクトというよりも「メッ

    セージ」のメタファ? ▪ 「メッセージ指向」という表現 ▪ cf. prototypes vs classes was: Re: Sun's HotSpot ▪ cf. オブジェクト指向の概念の発明者は誰ですか?(改訂版) 10
  11. 代表的な「オブジェクト指向(?)」言語 「オブジェクト指向」の代表格として語られる C++系にせよSmalltalk系にせよ、 むしろ「オブジェクト」以外に注目している? 11

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

  13. Self Language 13

  14. Self Language 14 • 「プロトタイプベース」と呼ばれる言語の元祖 ◦ javascriptもこの潮流 ▪ 今はECMAScriptでclass構文も導入されてしまってますが ……

    ▪ (´-`).。oO(昔のjavascriptが「辛い」と言われるの、プログラマが無理やりクラス 指向で書こうとしたせいという面も有るのでは ……) • すべてをslotsの組み合わせで考える ◦ slotsに値を入れればプロパティ(っぽく振る舞う) ◦ slotsに関数(Self的にはOrdinary Method)を入れればメソッド(っ ぽく振る舞う)
  15. Self Language 15 x y printString +

  16. Self Language 16 x = 4 y = 2 printString

    + slots
  17. Self Language 17 x = 4 y = 2 printString

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

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

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

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

    + x = 4 y = 2 printString + clone
  23. Self Language 23 x = 4 y = 2 printString

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

    + x = 4 y = 2 printString + clone - * 特定の場面だけで必要な定義 を、後から特定のオブジェクトに 追加できる
  25. Self Language 25 • 「クラス」という概念が言語の中に存在しない • 「新しく別のオブジェクトを用意したい」 ◦ 「もうあるオブジェクトをクローンして、それを都合良いように加工す れば良いよ」

    • 個々のコード片すらもオブジェクト ◦ オブジェクト同士を任意に組み合わせる(slotsの中身を交換する) ことで任意に実装をすげ替え可能 ◦ 非常に高い自由度
  26. まとめ 26 • 自分がイメージしている「オブジェクト指向」ってなんだろう? • 「オブジェクト指向」として語られる言語は、意外と「オブジェクト」を「指 向」していない=「オブジェクト」以外に注目している • 実は、プロトタイプベースが一番「オブジェクト」に注目している=「オブ ジェクト」を「指向」しているのかも?

    • 「オブジェクト指向」という言葉には前提が必要 ◦ 「メッセージ指向」「クラス指向」「プロトタイプ指向」「other...」どれに ついて会話しようとしているのか?
  27. 参考資料 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 • オブジェクト指向とは何ですか? - Quora ◦ 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 • What is ‘‘Object-Oriented Programming’’? (1991 revised version) ◦ https://www.stroustrup.com/whatis.pdf • プロトタイプベース・オブジェクト指向 ◦ http://squab.no-ip.com/wiki/493 • Self Handbook ◦ https://handbook.selflanguage.org/2017.1/
  28. • オブジェクト指向の概念の発明者は誰ですか? (改訂版) ◦ 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
  29. ご清聴ありがとうございました 29