ホームページ  >  記事  >  Java  >  オブジェクト指向プログラミングはあなたが考えているものではありません、あるいは少なくともそうあるべきではありませんでした

オブジェクト指向プログラミングはあなたが考えているものではありません、あるいは少なくともそうあるべきではありませんでした

王林
王林オリジナル
2024-08-22 06:38:07602ブラウズ

Object-Oriented Programming is Not What You Think It Is, or at Least It Wasn’t Meant to Be

「言っておきますが、私が『オブジェクト指向』という用語を作ったとき、私は C++ のことを考えていませんでした。重要なアイデアは『メッセージング』です...優れた拡張可能なシステムを作成するための鍵は、はるかに重要です。モジュールの内部プロパティと動作がどうあるべきかではなく、モジュールが相互に通信する方法を設計します。"
「このテーマに関してずっと前に『オブジェクト』という用語を作ったことを後悔しています。それは人々をより小さなアイデアに集中させてしまうからです。大きなアイデアは『メッセージング』です。」
— Alan Kay、Smalltalk 言語の作成者。

私たちがオブジェクト指向プログラミングを学ぶとき、最初に示されるのは、車にはドアや車輪などの属性があり、テレビにはオンとオフの動作があり、家にはさまざまな機能を備えた窓があるという考えです。開いたり閉じたりします。しかし、実際のシステムはそのようなものとは程遠いものです。
HTTPRequest というオブジェクトが表示されますが、tv というオブジェクトは表示されません。 logMessage は表示されますが、house1Joao は表示されません。あるいは、resourceManagement、fileSystem など。では、これらの「オブジェクト」はどのような動作をする必要があるのでしょうか?

現実世界のオブジェクトの表現としてのオブジェクトという考え方は、アラン ケイが Simula 言語を使用する以前から登場していました。この言語の作成者である Ole-Johan Dahl と Kristen Nygaard は、キュー、ネットワーク トラフィック、製造プロセスなどの現実のシミュレーションに使用する言語を設計していました。手続き型プログラミングは、この種の問題の解決には適していませんでした。

ここから、本当に重要なことに集中し、内部の実装はそのままにできるようなプログラミング形式の必要性が始まります。問題そのものよりもコードの詳細を考慮して、堅牢で大規模なシステムを構築する必要があることを想像してみてください。言うまでもなく、コードに含めることができる関数の数は、混乱を招き、わかりにくいもつれになるのに十分な数でした。

彼らは、プログラミングにおける不必要な概念を抽象化する最初の一歩を踏み出しました。

「しかし、それはまさに現代の OOP です!」あなたは叫んでいるかもしれません。まあ、はい、いいえです。このパラダイムの Simula 言語の実装は異なりました。再利用可能で柔軟なシステムではなく、イベントとプロセスのモデリングに重点が置かれていました。
継承は簡単でした。柔軟性や階層ではなく、手順の洗練と特殊化に重点が置かれました。
カプセル化は基本的なものでした。 private、public、protected などのアクセス修飾子の概念はありませんでした。
基本的に、このアイデアは、カオスなコードをより明確な定義を持つパッケージに整理することでした。

しばらくして、ゼロックスで、アラン・ケイはメッセージのアイデアを思いつきました。コンピューター グラフィックスと Smalltalk を作成したのと同じゼロックスです。
彼のアイデアは基本的に、物体を生き物として考えることでしたが、動物や人間としてではなく、細胞として考えることでした。 (アラン・ケイは訓練を受けた生物学者でした。)
生体組織は細胞間のコミュニケーションのおかげで完全に機能します。彼らはその機能が非常に明確に定義されており、他の細胞から受け取る「メッセージ」に応答する方法を知っています。
そのアイデアは、独自の方法でメッセージに応答する方法を知ることを機能とするオブジェクトを作成することでした。オブジェクトの応答がどのように実装されるかを知る必要はありませんし、知っておくべきではありません。知っておく必要があるのは、オブジェクトがどのような種類のメッセージを理解するかだけです。 (実際、オブジェクトに「送信」できるメッセージのセットはインターフェースと呼ばれます。)
たとえば、メッセージ「2 + 2」を送信したときに、sum オブジェクトが何を返すことを期待しますか?
ああ、はい。 Smalltalk では、メッセージも含めてすべてがオブジェクトです。
はい、わかっています、それはクレイジーです。他のオブジェクトを含むオブジェクトを介して通信するオブジェクト。しかし、それがアイデアです。
「それで、これは再利用可能で拡張可能なシステムの作成にどのように役立ちますか?」
ソフトウェア システムは、ファイルというよりも配線に似ています。それがアラン・ケイの特徴です。
彼にとって、ファイルがどのように構成されているかではなく、ワイヤが正しい極に接続されているかどうかを心配する必要があります。

結論

アラン・ケイによって考案されたオブジェクト指向プログラミングは、現実世界を模倣した構造にコードを編成するだけではなく、メッセージを通じて効率的に通信するシステムを作成することでもありました。最新の OOP は Simula の初期のアイデアから進化し、C++ や Java などの言語で人気を博しましたが、このアプローチの真の焦点であるオブジェクト間の通信は薄められることがよくありました。

ケイの当初のビジョンを理解することで、今日のソフトウェアの設計と構築の方法を再考することができます。オブジェクトの内部構造とクラス階層だけに焦点を当てるのではなく、モジュール間の適切に設計された通信がもたらすシンプルさと柔軟性も重視する必要があります。

OOP のルーツに戻ると、より回復力があり、モジュール式で拡張しやすいシステムを開発するのに役立ちます。結局のところ、ケイが私たちに思い出させてくれたように、「大きなアイデア」は物体そのものに関するものではなく、それらの通信方法に関するものでした。


出典:

  1. Alan Kay、「The Early History of Smalltalk」、プログラミング言語の歴史、第 2 版、Thomas J. Bergin および Richard G. Gibson 編集、Addison-Wesley、1996 年、pp. 511-578.
  2. Kristen Nygaard および Ole-Johan Dahl、「The Development of the SIMULA Languages」、プログラミング言語の歴史、第 1 版、Richard L. Wexelblat 編集、Academic Press、1981、pp. 439-493.
  3. Bjarne Stroustrup、C++ プログラミング言語、Addison-Wesley、2013 年、序文と第 1 章
  4. ケイ、アラン。 「『オブジェクト指向プログラミング』の意味」 Stefan Ram にメール、2003 年。

追記: この記事は Moisés Cristiano によって書かれ、ChatGPT によって編集されました。

以上がオブジェクト指向プログラミングはあなたが考えているものではありません、あるいは少なくともそうあるべきではありませんでしたの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。