コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「オブジェクト指向」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
編集の要約なし
関連項目
(同じ利用者による、間の16版が非表示)
1行目: 1行目:
'''オブジェクト指向'''(オブジェクトしこう|英語:''object-oriented'')は、[[ソフトウェア工学]]構想の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方である。1950年代後半に[[マサチューセッツ工科大学]]の[[人工知能|人口知能]]研究グループの間で最初に発案され、プログラム開発環境の構築を通して体系化されていき、1960年代に一つの[[プログラミング・パラダイム]]として確立された。1980年代には[[データベース]]と[[オペレーティングシステム]]の開発にも活かされるようになった。1990年代になるとソフトウェア設計の幅広い面にも応用されるようになり、[[ソフトウェア工学]]その他にオブジェクト指向を土台にした様々な分野が開拓された。
'''オブジェクト指向'''(オブジェクトしこう)とは、[[オブジェクト (プログラミング)|オブジェクト]]同士の相互作用として、システムの振る舞いをとらえる考え方である。英語の {{lang|en|object-oriented}} (直訳は、「対象物志向の」「目的重視の」という意味の形容詞) の日本語訳である。


オブジェクト指向は脳機能を形成する[[人工ニューラルネットワーク|ニューラル・ネットワーク]]をヒントに発案された。[[オブジェクト (プログラミング)|オブジェクト]]は[[人工ニューロン|ニューロン]]の投影物であった。ニューロンはそれぞれが記憶を持ち、網の目のように結ばれて相互に影響し合い高度な思考を表現した。コンピュータ・プログラムも同様に[[オブジェクト (プログラミング)|オブジェクト]]のネットワークとして構築し、無数の[[オブジェクト (プログラミング)|オブジェクト]]が互いに作用し合うようにして任意のプロセスを実現する事がオブジェクト指向の理念であった。ここでのオブジェクトとは対象物を意味する言葉であり、対象物とは大まかにCPU演算処理(コード)が扱うデータ全般を指す。「どの様にデータを扱うか」ではなく「データがどの様に扱われるか」を念頭に置いてプログラムを組み立てる構想から、データにそれを扱う為のコードを付随させたオブジェクトの概念が生み出された。
オブジェクト指向の枠組みが持つ道具立ては、一般的で強力な記述能力を持つ。複雑なシステム記述、巨大な[[ライブラリ]](特に部品間で緊密で複雑な相互関係を持つもの)の記述においては、オブジェクト指向の考え方は必須である。


==パラダイムとしてのオブジェクト指向==
==オブジェクト指向の分野一覧==


#[[オブジェクト指向プログラミング|オブジェクト指向・プログラミング]]       1960年代から
オブジェクト指向分析が提唱される以前には、システム分析のレベルにおいては、[[データ構造]]を中心としたシステムの分析技法である[[構造化技法]]が存在した。
#[[オブジェクトデータベース|オブジェクト指向・データベース]]        1980年代から
#[[オブジェクト指向分析設計|オブジェクト指向・アナリシス&デザイン]]    1990年代から
#[[オブジェクト指向モデリング|オブジェクト指向・モデリング]]         1990年代から


<br/>
また、[[プログラミング (コンピュータ)|プログラミング]]のレベル ([[プログラミングパラダイム]]) では、[[プログラム (コンピュータ)|プログラム]]の実行の流れを決められた[[制御構造]]の組み合わせとして書き下す[[構造化プログラミング]]や、[[カプセル化]]を促す[[モジュールプログラミング]]、多態に対応する[[データ指向プログラミング]]という技法が存在していた。オブジェクト指向手法はそれらを一般化しさらに推し進めたものであるという考え方がある。
オブジェクト指向は、プログラミング・パラダイムとして誕生した知識体系であり、そのデータとコードのセットを基本要素にして物事を解析する考え方が、特に1980年代から大きく注目され始め、ソフトウェア工学のあらゆる局面に''object-oriented''(OO)を接頭辞にした分野が立ち上げられた。他にも、OOオペレーティングシステム、OOプロジェクトマネージメント、[[オブジェクト指向ソフトウェア工学|OOソフトウェアエンジニアリング]]、OOユーザーインターフェース、[[Booch法|ブーチメソッド]]、[[オブジェクトモデル化技法|オブジェクトモデリングテクニック]]など複数の分野が存在するが、上記リストの四種と知識範囲が重なり合っているか、または内包される副次分野となっている事から、明確な一つの分野として扱われる事は少ない。


==オブジェクト指向プログラミングの構成要件==
==オブジェクト指向プログラミング==
{{Main|オブジェクト指向プログラミング}}
{{Main|オブジェクト指向プログラミング}}
オブジェクト指向プログラミングを構成する概念は次のようなものである。


=== 主な仕様 ===
;[[カプセル化]] (情報隠蔽)
[[カプセル化|エンカプセレーション]](内部隠蔽)
:[[オブジェクト (プログラミング)|オブジェクト]]の振る舞いを隠蔽したり、オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの実際の型を隠蔽したりすることをいう。これは古典的な可視性の定義である。


また、オブジェクト指向プログラミングの概念拡大伴い必須と表現するのが不適切にりつつあるが旧来の多くのオブジェクト指向言語が備えている性質には以下のがる。
: [[オブジェクト (プログラミング)|オブジェクト]]内データ参照とメソッド呼出対する外部からのアクセスを限定する仕様。アクセス権限は、どオブジェクトからもアクセス可能パブリック自分と派生オブジェクトからみ可能なプロテクティド、自オブジェクトプライベート、の三種基本となる。


[[インヘリタンス]](継承)
;[[ポリモーフィズム]] (多態性)
:あるオブジェクト操作が呼び出し側はなく、受け手のオブジェクトによって定ま特性。[[クラスベース]]のオブジェクト指向の場合には、派生クラスの複数分岐として多態性実現する。 [[プロタイプベース]]のオブジェクト指向場合で関係がない概念れる。
: 派生元オブジェクトに任意データとメソッドを追加する形派生先オブジェクトを作仕様(部品→全体)と、オブジェクト複数の階層にして他オブジェクトと共有出来る階層派生元にる仕様(全体→部品)の二通りの考え方がある。派生元オブジェクの型式はスパークラ、派生先オブジェクトの型式サブクラス呼ばれる事が多い


[[ポリモーフィズム]]多態性
==オブジェクト指向の方式==
: 同名メソッドの呼び出し時に、オブジェクトによって処理内容が変化する機能。こちらは実行時の状況によって変化する多態性本来のダイナミックな機能である。また、引数とするクラス型に従って、呼び出されるメソッドと生成されるオブジェクトが変化する機能もあり、こちらはコンパイル時に決まるスタティックな機能となる。
*[[クラスベース]]方式 &mdash; [[クラス (コンピュータ)|クラス]]を定義し、それを元に[[インスタンス]]を生成する方式である。'''継承ベース'''ともいう。
*[[プロタイプベース]]方式 &mdash; 既存の[[インスタンス]]を元[[インスタンス]]を生成する方式である。'''インスタンスベース'''ともいう
*[[ミックスイン|Mixin]]方式 &mdash; さまざまなオブジェクトの原型を組み合わせて一つのオブジェクトを構成する方式である。


==オブジェクト指向名称とメッセージング==
===オブジェクト生成種類===

[[Eclipse (統合開発環境)|Eclipse]]を開発したDave Thomasや、オブジェクト指向という言葉の生みの親であるAlan Kay博士は、オブジェクト指向という言葉は失敗だったと語っている。<ref>http://www.infoq.com/jp/news/2010/07/objects-smalltalk-erlang</ref>
[[クラスベース]]
これは、本来オブジェクト指向が重視すべきは'''「オブジェクト」'''ではなく'''「メッセージング」'''であるにもかかわらず'''「メッセージング」'''がおろそかにされているためである。特に言語の進歩において「オブジェクト」や「クラス」の側面ばかり強調される傾向にあり、Alan Kay博士は「Smalltalkが最高に好きという訳ではないが、他の言語に比べればマシである。」と述べている。
: ユーザーが任意の[[クラス (コンピュータ)|クラス]]を定義し、それを元に[[インスタンス]]を生成する方式である。ベンダー側が用意したクラスライブラリ内のクラスを元にして、ユーザーが任意の派生クラスを定義する開発場面も多く、これは継承ベースとも言われる。

[[プロトタイプベース]]
: プログラムを実行させるランタイム環境に用意されている[[インスタンス]]を派生として任意の実装をした[[インスタンス]]を生成する方式である。インスタンスベースとも言われる

[[ミックスイン]]
: 任意のインスタンス生成時に、ランタイム環境に用意された様々な機能コンポーネントを追加する方式である。各コンポーネントは同時にスーパークラスと同等となり、手軽で重複の無い多重継承が保証された。

=== オブジェクト指向とメッセージング ===
オブジェクト指向プログラミングは、歴史的に1962年に公開されたクラス構造を中心とする''Simula''系統と、1970年代から研究開発が進められていたメッセージ機能を主体とする''Smalltalk''系統に大別されており、オブジェクト指向本来の形態を正しく表現してるのは後者の''Smalltalk''の方だと評されていた。しかし、当時のCPU処理能力の問題からより少ない処理量で、ポリモーフィズムその他の仕様を「継承クラス構造」を活かして実現出来る''Simula''系統(''C++''や''Javaなど)の方''が主流となった。こうして''クラス構造がオブジェクト指向の中心的役割を占めるようになった事から、Smalltalk''制作者の一人であり、オブジェクト指向開発環境のパイオニアと見なされているアラン・ケイは「''Smalltalk''をオブジェクト指向言語と定義付けたのは、間違いだったかもしれない。」というコメントを残すに到った<ref>http://www.infoq.com/jp/news/2010/07/objects-smalltalk-erlang</ref>。

''Smalltalk''が主体とする「メッセージング」は、それ自体が高度に柔軟なエンカプセレーションとポリモーフィズムの機能を自然に表現出来る仕組みだった。それに対して、''C++''や''Javaに見られる''「継承クラス構造」をベースにした同様の機能の実現はトリッキーと言えた。しかし、現実的に「継承クラス構造」重視の言わば亜流の方がオブジェクト指向の主流となってしまった以上、もはや「メッセージング」主体の''Smalltalk''はオブジェクト指向としての看板を降ろすべきではないか、という自嘲的な見解がそのコメントの根底にあった。オブジェクト指向言語の進化に伴い、オブジェクトとクラス構造の側面ばかりが強調される現状の中で、アラン・ケイは「''Smalltalk''が最高に好きという訳ではないが、他の言語に比べればマシである。」とも述べて、OOP本来の支柱は「メッセージ・パッシング」である事を暗に示唆している。


==脚注==
==脚注==
34行目: 47行目:


==関連項目==
==関連項目==
*[[オブジェト指向モデリング]]
*[[構造化プログラミング]]
*[[構造化プログラミング]]
*[[データ指向]]
*[[エージェント指向]]
*[[アスペクト指向]]
*[[アスペクト指向]]
*[[エージェト指向]]
*[[ソフトウェア工学]]
*[[ソフトウェア工学]]
*[[デザインパターン (ソフトウェア)]]
*[[デザインパターン (ソフトウェア)]]
*[[統一モデリング言語|UML]]
*[[:Category:オブジェクト指向言語]]
*[[オブジェクト指向プログラミング]]
*[[オブジェクトデータベース]]
*[[オブジェクトデータベース]]
*[[オブジェクト関係データベース]]
*[[オブジェクト関係データベース]]
*[[オブジェクト指向プログラミング]]
*[[オブジェクト指向モデリング]]
*[[オブジェクト指向分析設計]] (オブジェクト指向開発方論)
*[[オブジェクト指向分析設計]]
**[[オブジェクトモデル化技]]
**[[統一モデリング言語|UML(統一モデリング言語)]]
**[[オブジェクトモデル化技法]] (OMT)
**[[Booch法]]
**[[Booch法|ブーチメソッド]]
**[[CRCカード]]
**[[オブジェクト指向ソフトウェア工学]] (OOSE/Objectory)
*[[:Category:オブジェクト指向言語]]
*[[オブジェクト指向ソフトウェア工学]]
*[[NEXTSTEP]] - オブジェクト指向OSとしてその先進性をアピール。後続OSや開発環境に大きな影響を与えた。
*[[NEXTSTEP]] - オブジェクト指向OSとしてその先進性をアピール。後続OSや開発環境に大きな影響を与えた。
*[[Cocoa]] - NEXTSTEPの後身のフレームワーク。
*[[Cocoa]] - NEXTSTEPの後身のフレームワーク。
*[[統合開発環境]]
*[[コンテンツ管理システム]]
*[[CRCカード]]
*[[組合せ爆発]]


==外部リンク==
==外部リンク==

2019年1月27日 (日) 04:52時点における版

オブジェクト指向(オブジェクトしこう|英語:object-oriented)は、ソフトウェア工学構想の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方である。1950年代後半にマサチューセッツ工科大学人口知能研究グループの間で最初に発案され、プログラム開発環境の構築を通して体系化されていき、1960年代に一つのプログラミング・パラダイムとして確立された。1980年代にはデータベースオペレーティングシステムの開発にも活かされるようになった。1990年代になるとソフトウェア設計の幅広い面にも応用されるようになり、ソフトウェア工学その他にオブジェクト指向を土台にした様々な分野が開拓された。

オブジェクト指向は脳機能を形成するニューラル・ネットワークをヒントに発案された。オブジェクトニューロンの投影物であった。ニューロンはそれぞれが記憶を持ち、網の目のように結ばれて相互に影響し合い高度な思考を表現した。コンピュータ・プログラムも同様にオブジェクトのネットワークとして構築し、無数のオブジェクトが互いに作用し合うようにして任意のプロセスを実現する事がオブジェクト指向の理念であった。ここでのオブジェクトとは対象物を意味する言葉であり、対象物とは大まかにCPU演算処理(コード)が扱うデータ全般を指す。「どの様にデータを扱うか」ではなく「データがどの様に扱われるか」を念頭に置いてプログラムを組み立てる構想から、データにそれを扱う為のコードを付随させたオブジェクトの概念が生み出された。

オブジェクト指向の分野一覧

  1. オブジェクト指向・プログラミング       1960年代から
  2. オブジェクト指向・データベース        1980年代から
  3. オブジェクト指向・アナリシス&デザイン    1990年代から
  4. オブジェクト指向・モデリング         1990年代から


オブジェクト指向は、プログラミング・パラダイムとして誕生した知識体系であり、そのデータとコードのセットを基本要素にして物事を解析する考え方が、特に1980年代から大きく注目され始め、ソフトウェア工学のあらゆる局面にobject-oriented(OO)を接頭辞にした分野が立ち上げられた。他にも、OOオペレーティングシステム、OOプロジェクトマネージメント、OOソフトウェアエンジニアリング、OOユーザーインターフェース、ブーチメソッドオブジェクトモデリングテクニックなど複数の分野が存在するが、上記リストの四種と知識範囲が重なり合っているか、または内包される副次分野となっている事から、明確な一つの分野として扱われる事は少ない。

オブジェクト指向プログラミング

主な仕様

エンカプセレーション(内部隠蔽)

オブジェクト内のデータ参照とメソッド呼出に対する、外部からのアクセスを限定する仕様。アクセス権限は、どのオブジェクトからもアクセス可能なパブリック、自分と派生オブジェクトからのみ可能なプロテクティド、自オブジェクト内のみのプライベート、の三種が基本となる。

インヘリタンス(継承)

派生元オブジェクトに任意のデータとメソッドを追加する形で派生先オブジェクトを作る仕様(部品→全体)と、オブジェクトを複数の階層に分解して他オブジェクトと共有出来る階層を派生元にする仕様(全体→部品)の二通りの考え方がある。派生元オブジェクトの型式はスーパークラス、派生先オブジェクトの型式はサブクラスと呼ばれる事が多い。

ポリモーフィズム(多態性)

同名メソッドの呼び出し時に、オブジェクトによって処理内容が変化する機能。こちらは実行時の状況によって変化する多態性本来のダイナミックな機能である。また、引数とするクラス型に従って、呼び出されるメソッドと生成されるオブジェクトが変化する機能もあり、こちらはコンパイル時に決まるスタティックな機能となる。

オブジェクト生成の種類

クラスベース

ユーザーが任意のクラスを定義し、それを元にインスタンスを生成する方式である。ベンダー側が用意したクラスライブラリ内のクラスを元にして、ユーザーが任意の派生クラスを定義する開発場面も多く、これは継承ベースとも言われる。

プロトタイプベース

プログラムを実行させるランタイム環境に用意されているインスタンスを派生元として、任意の実装をしたインスタンスを生成する方式である。インスタンスベースとも言われる。

ミックスイン

任意のインスタンス生成時に、ランタイム環境に用意された様々な機能コンポーネントを追加する方式である。各コンポーネントは同時にスーパークラスと同等となり、手軽で重複の無い多重継承が保証された。

オブジェクト指向とメッセージング

オブジェクト指向プログラミングは、歴史的に1962年に公開されたクラス構造を中心とするSimula系統と、1970年代から研究開発が進められていたメッセージ機能を主体とするSmalltalk系統に大別されており、オブジェクト指向本来の形態を正しく表現してるのは後者のSmalltalkの方だと評されていた。しかし、当時のCPU処理能力の問題からより少ない処理量で、ポリモーフィズムその他の仕様を「継承クラス構造」を活かして実現出来るSimula系統(C++Javaなど)の方が主流となった。こうしてクラス構造がオブジェクト指向の中心的役割を占めるようになった事から、Smalltalk制作者の一人であり、オブジェクト指向開発環境のパイオニアと見なされているアラン・ケイは「Smalltalkをオブジェクト指向言語と定義付けたのは、間違いだったかもしれない。」というコメントを残すに到った[1]

Smalltalkが主体とする「メッセージング」は、それ自体が高度に柔軟なエンカプセレーションとポリモーフィズムの機能を自然に表現出来る仕組みだった。それに対して、C++Javaに見られる「継承クラス構造」をベースにした同様の機能の実現はトリッキーと言えた。しかし、現実的に「継承クラス構造」重視の言わば亜流の方がオブジェクト指向の主流となってしまった以上、もはや「メッセージング」主体のSmalltalkはオブジェクト指向としての看板を降ろすべきではないか、という自嘲的な見解がそのコメントの根底にあった。オブジェクト指向言語の進化に伴い、オブジェクトとクラス構造の側面ばかりが強調される現状の中で、アラン・ケイは「Smalltalkが最高に好きという訳ではないが、他の言語に比べればマシである。」とも述べて、OOP本来の支柱は「メッセージ・パッシング」である事を暗に示唆している。

脚注

  1. ^ http://www.infoq.com/jp/news/2010/07/objects-smalltalk-erlang

関連項目

外部リンク