Original: https://wiki.c2.com/?AlanKaysDefinitionOfObjectOriented
Translated by: https://www.deepl.com/ja/translator
以前からこのページをアップしようと思っていたのですが・・・。
WardsWikiでは、SmalltalkLanguageの発明者であるAlanKayによって提唱されたOOの定義について多く言及されています。 多くの人は、彼がこの言葉を発明したという理由で、この定義がOOの定義の中で最も権威のあるものだと考えています。 (また、FlameWarは他のページにあるべきものであり、ここにあるべきものではないという意見もあります。)
難しいのは、ケイが何をOOと考え、何をOOではないと考えるかについて、典拠となるものがないように思われることです。 彼はかなりのことを書いたり言ったりしていますが、(私が知る限り)それが書かれている文献は一つもありません。 加えて、この問題に関する彼の考えは、時間の経過とともに多少変化しているようです。 合理的な人は、新しい証拠を提示されたときに自分の考えを修正するものですから。 しかし、特定の文章を指して、それが権威ある定義であると述べるのは少し難しい。
この件に関するケイの考えを明らかにするために、最も早く出版された文献はEarlyHistoryOfSmalltalkという論文です(Wikiページからダウンロードできます)。 そこには次のような定義があります(リンクをたどると78ページに...)。 後述するように、これは主にSmalltalkの説明です。
- EverythingIsAnObject。
- オブジェクトは(オブジェクトという意味で)メッセージを送受信することで通信します。
- オブジェクトは独自のメモリーを持っています(オブジェクトの観点から)。
- すべてのオブジェクトはクラスのインスタンスです(オブジェクトでなければなりません)。
- クラスはそのインスタンスの共有動作を保持します(プログラムリストのオブジェクトの形で)。
- プログラム・リストを評価するために、制御は最初のオブジェクトに渡され、残りはそのメッセージとして扱われます。
この定義はSmalltalkの初期のバージョン(Smalltalk-72?)に由来しており、ルール5と6はSmalltalkがLispの遺産であることを明確に示しています。 Kayは、Smalltalkが発展するにつれて、ルール4〜6が変化していくだろうと述べています。
異議あり: 78ページで、上記がSmalltalkの設計原則であることは明らかにされていますが、それがObjectOrientedの定義にもなるとはどこにも書かれていません。
異議に対するノート: このページの目的はケイのOOの概念を探ることであり、上記は私たちが見つけた検証可能なソースの1つです。 たとえそれがOO全体ではなく1974年頃のSmalltalkを反映していたとしても、この問題に対する彼の考え(少なくとも一時期)を示しています。
AlanKayのOOの定義は、プログラミングパラダイムではなく、計算のモデルであるActorModelに対してCarlHewittが与えたものが大部分です。 AlanKayはこの派生を明確に認めています。
Smalltalk-80以前のSmalltalkのバージョンは、まだ(非同期、単方向の)ActorSModelの計算モデルに基づいていましたが、Smalltalk-80で、SmalltalkLanguageの開発者は、(同期、双方向の)手続きモデルに完全に切り替えました。
特に、OO 思考の他の主要なソースであるケイパビリティアーキテクチャや SIMULA 67 の研究が、ActorsModel の思考にインスパイアされたものではまったくないことを考慮すると、このことは用語論的な問題を際限なく引き起こしています。
では、上記が AlanKaysDefinitionOfObjectOriented であると、どうして正直に主張できるのでしょうか?
- 私たちは、それが何であるかを発見しようとしているのです。多くの人がこれを参照し、標準的な定義として引用しています。この点を明確にするために、紹介文を編集します。
AlanKayの定義を多少修正したものがTimBudds AnIntroductionToObjectOrientedProgrammingにあります。 興味深いことに、この定義の出典(Buddの本の本文に記載)はEarlyHistoryOfSmalltalkです。Budd氏によると
「アラン・ケイはオブジェクト指向プログラミングの父と言われていますが、 OOPの基本的な特徴として次のものを挙げています。"
- EverythingIsAnObject。
- 通信は、オブジェクトが互いに通信し、オブジェクトにアクションの実行を要求することによって行われます。オブジェクトはメッセージを送受信することで通信します。メッセージはアクションの要求であり、タスクを完了するために必要なあらゆるオブジェクトがバンドルされています。
- オブジェクトは、他のオブジェクトで構成される独自のメモリを持っています。
- すべてのオブジェクトはクラスのインスタンスです。クラスとは、整数やリストなど、似たようなオブジェクトをまとめたものです。
- クラスはオブジェクトに関連する振る舞いのリポジトリです。つまり、同じクラスのインスタンスであるすべてのオブジェクトは、同じ動作を行うことができます。
ここまでは、上の1-5と似ています。ルール6が違います。リストへの参照が削除され、代わりに次のようになります:
- クラスは、継承階層と呼ばれる単一根のツリー構造に編成されます。クラスのインスタンスに関連するメモリと動作は、このツリー構造の子孫に関連するどのクラスでも利用できます。
AlanKayはこのことについてAlanKayOnMessagingで詳しく述べています。 彼はそのメッセージ(これはメーリングリストへの投稿であり、学術的な文章ではありません)の中で、より新しい定義を与えてはいませんが、彼はオブジェクトの構造そのものを重視せず、その代わりにオブジェクト間のインターフェイスに焦点を当てているようです。
この点で、上に挙げたルールの多くは、すべてのOO言語が従うべき処方箋というよりは、Smalltalk-80についての考察と見るべきかもしれません。実際、SelfLanguageを含む多くの興味深い現代OO言語は、規則4と6に日常的に違反しています。CommonLispObjectSystemとその子孫(DylanLanguage, CecilLanguage)や他のもの(TutorialDee)はすべてルール5を無視し、振る舞いをクラスの外に移すことを選択しています。
さらに火に油を注ぐような発言として、AlanKayは「私はオブジェクト指向という言葉を発明したが、C++は私が考えていたものではなかったと言える」と述べたと伝えられています。彼がC++の特定の機能や欠落、全体的な品質や哲学に異議を唱えていたのか、それとも単に「競争相手」(当時Javaは存在しませんでしたが、これはOOPSLA '98の記事です)に対する無償の非難に関与していたのかは、定かではありません。
Is Software Engineering an Oxymoron? "という記事の中で、ケイはこう書いています。"本物のソフトウェアエンジニアリングが開発されるまでは、次のベストプラクティスは、あらゆる面で極端なレイトバインディングを持つ動的システムで開発することである "と。これは必ずしも彼の考えるOOの定義を拘束するものではありませんが、哲学の重要な表明です。もちろんC++は、デフォルトでStaticDispatchを実行するところまではともかく、可能な限り早期バインディングを行います(DynamicDispatchを実行したい場合は、"virtual "キーワードで要求する必要があります)。[そして、それさえも、Javaのような他の多くの言語と同様、単一の動的ディスパッチに過ぎません)。もし、"どこでもレイトバインディング "を望むのであれば、もっと強力なディスパッチシステム、例えばCommonLispObjectSystemのジェネリックスが必要です]。
Alan Kayに "オブジェクト指向 "の定義について尋ねたことがあります:
私にとってのOOPとは、メッセージング、ローカル保持、状態プロセスの保護と隠蔽、極端なLateBindingを意味します。
http://www.purl.org/stefan_ram/pub/doc_kay_oop_en。 を参照。
AlanKayOnObjects も参照してください。
CategoryObjectOrientation
Last edit April 18, 2014