注意: この記事は個人の感想を煮詰めたものです
「オブジェクト指向」という言葉を使うことの危険さを説明するならば、「お好み焼き」を語る危険さを数倍にしたものと言える。その言葉の認識が個々人で極めて多種多様で、それら全てを綺麗に突き通せる完全な説明は無いに等しい。
— Takumi Sueda (@puhitaku) 2020年12月12日
あなたは最近、「オブジェクト指向」という単語を思い出しながらコードを書いたことがあるだろうか。私はない。少なくとも5年以上は。
もちろん「オブジェクト」(object) という用語自体は様々な言語に登場する。例として、Python という言語での object
について解説を書いてみよう。
- 「データを抽象的に表したもの」
- 同一性 (identity) という尺度と内部の属性 (attributes) を持つ構造
- 属性もまた
object
である - メソッドは呼び出し可能な属性であり、やはり
object
である
このように、直接あるいは間接に自己参照を含んだ Python 内の基本単位 object
の説明を書き記してみた。ところで、この Python の object
の話をしている時に、オブジェクト指向という単語や歴史の解説は登場しただろうか。少なくとも Python の例においては、object
というタームの説明にはオブジェクト指向という言葉を必要としない。
Python の class
の説明になってようやく「オブジェクト指向」(Object-oriented) という単語は登場する。
Python のクラスは、C++ と Modula-3 のクラスメカニズムを混ぜたものです。Python のクラス機構はオブジェクト指向プログラミングの標準的な機能を全て提供しています。
…(中略)…
(クラスに関して普遍的な用語定義がないので、 Smalltalk と C++ の用語を場合に応じて使っていくことにします。 C++ よりも Modula-3 の方がオブジェクト指向の意味論が Python に近いので、 Modula-3 の用語を使いたいのですが、ほとんどの読者は Modula-3 についてしらないでしょうから。)
この「オブジェクト指向プログラミングの標準的な機能を全て提供しています」という文章は、言い換えると「これまでオブジェクト指向プログラミングと呼ばれていた概念は、Python の object
などが持つ構造や機能をそういう風に使えば実現することができます」と言っているに過ぎない。パラダイムの源に C++ や Modula-3 があることは明記の通りであるが、C++ や Modula-3 の実装に的確に則ったオブジェクト指向の概念を実現しているわけではない。まして、Smalltalk に代表されるような、メッセージパッシングの手法により実現される崇高な世界を実現しようなどとも思っていない。
現在の世の中のあちこちで勃発する「オブジェクト指向論争」は、確実に意見が食い違い、確実に炎上し、確実に不愉快な結果を生む。それは、Python だけでなく、C++ や Modula-3 や Java や Smalltalk やその他あらゆる言語が持つ、それぞれの独自な「オブジェクトに対する考え方や実装」を、個々人の持つ歴史認識と一緒にミキサーにかけて議論しようとしているからに他ならない。
なぜ誰もが各々の「オブジェクト指向」を語りたがるのか
人々は往々にして、各々のオブジェクト指向を雄大に語りがちだ。なぜだろうか。私の勝手な推測では、この言葉がプログラミング教育において登場することに端を発していると見ている。
プログラミングという概念の右も左もわからず、自分の知る世界は C/C++ や Java だけという時期に、プログラミングという概念すべての理のように「オブジェクト指向」を教わる。そうすることで、たとえ言語がどのように変わろうと、「オブジェクト指向」という単語が出れば自分の知っているオブジェクト指向というものさしで測ろうとしてしまう…という推測だ。
私は C/C++ や Java は最初の言語ではなかった*1。だから、それらが広げる風呂敷が「それらの言語独自のものである」と初心者ながらに察することができた(C++ や Java をネガキャンしたり、まして学んだ人を蔑むような意図はまったくないということだけ念押ししたい)。
人によっては、Alan Kay の作り上げた「オブジェクト指向」という世界について、体系的で高品質な学びを得た人もいることだろう。その世界では高度に成り立っていた「オブジェクト指向」も、同じそのものさしを他の言語に持っていくことは叶わない。まるで違う視点で議論することになるから、仲違いして終わるだけだ。
「オブジェクト指向」という言葉を使わずに話そう
手続きの置き場所を吟味するならば、「この実装はクラス A が持っていたほうが合理的だ」とか「クラス B がこの実装を外から隠した方が嬉しさが大きい」というふうに議論するだろう。その時に「オブジェクト指向に則って〜」という前置きがなくても話は通じる。
クラスの分け方の話をするならば、「クラス A と B は互いに干渉しすぎているから同一のクラスにまとめよう」とか「後の拡張性を考えて、可変な手続きがインターフェース越しに分離されるようにしよう」というふうに議論するだろう。やはりその時にも「オブジェクト指向に則って〜」という前置きがなくても話は通じる。*2
どのような言語であれ、「オブジェクト指向」という言葉を使わずとも、私達はコードを書くことができる。