「オブジェクト指向プログラミング」の版間の差分
削除された内容 追加された内容
Goldensundown2 (会話 | 投稿記録) |
タグ: Refタグつき記述の除去 |
||
(7人の利用者による、間の106版が非表示) | |||
1行目:
{{独自研究|date=2018年2月}}
{{プログラミング言語|index=おふしえくとしこうふろくらみんく}}
'''オブジェクト指向プログラミング'''(オブジェクトしこうプログラミング、{{Lang-en-short|object-oriented programming, '''OOP'''}})は、[[プログラミング (コンピュータ)|コンピュータ・プログラミング]]の[[プログラミングパラダイム|パラダイム]]<ref>コンピュータ・プログラミングのパラダイムについては『新しいプログラミング・パラダイム』などを参照: http://www.kyoritsu-pub.co.jp/bookdetail/9784320024939</ref>のひとつで、[[オブジェクト指向]]の概念や手法を取り入れたものである。プログラムを、データとその振舞が結び付けられた[[オブジェクト (プログラミング)|オブジェクト]]の集まりとして構成する、などといった特徴がある。このパラダイムを指向している[[プログラミング言語]]が'''オブジェクト指向プログラミング言語'''である。
== 特徴 ==
オブジェクト指向プログラミングで用いられる代表的な概念および技法として、以下のものが挙げられる。
*[[カプセル化]](振る舞いの隠蔽とデータ隠蔽)
*[[インヘリタンス]]([[継承 (プログラミング)|継承]]) -- [[クラスベース]]
*[[ポリモーフィズム]]([[多態性]]、[[多相性]])
*[[ダイナミックバインディング]]([[動的束縛]]) -- [[動的型付け]]
上記を含むオブジェクト指向プログラミングにおいて有用な機能(の一部)を言語仕様として備えたプログラミング言語を、'''オブジェクト指向プログラミング言語''' ({{Lang|en|'''OOPL'''; object-oriented programming language}}) という。
ただし、上述の特徴はオブジェクト指向言語に固有の概念というわけではなく、非オブジェクト指向言語の中にもこの性質を備えるものもある。
オブジェクト指向プログラミングという考え方が生まれた背景には、計算機の性能向上によって従来より大規模な[[ソフトウェア]]が書かれるようになってきたということが挙げられる。大規模なソフトウェアが書かれコードも複雑化してゆくにつれ、ソフトウェア開発コストが上昇し、[[1960年代]]には「[[ソフトウェア危機]] ({{Lang|en|software crisis}})」といったようなことも危惧されるようになってきた。そこでソフトウェアの[[再利用 (プログラミング)|再利用]]、[[部品化 (プログラミング)|部品化]]といったようなことを意識した仕組みの開発や、[[ソフトウェア開発工程]]の体系化('''[[ソフトウェア工学]]''' ({{Lang|en|software engineering}}) の誕生)などが行われるようになった。
このような流れの中で、プログラムを構成するコードとデータのうちコードについては[[プロシージャ|手続き]]や[[関数 (プログラミング)|関数]]といった仕組みを基礎に整理され、その構成単位を[[ブラックボックス]]とすることで再利用性を向上し、部品化を推進する仕組みが提唱され'''[[構造化プログラミング]]''' ({{Lang|en|structured programming}}) として[[1967年]]に[[エドガー・ダイクストラ]] ({{Lang|en|Edsger Wybe Dijkstra}}) らによってまとめあげられた(プログラミング言語の例としては[[Pascal]] [[1971年]])。なお、それに続けて「しかしデータについては相変わらず主記憶上の記憶場所に置かれている限られた種類の[[基本データ型]]の値という比較的低レベルの抽象化から抜け出せなかった。これはコードはそれ自身で意味的なまとまりを持つがデータはそれを処理するコードと組み合わせないと十分に意味が表現できないという性質があるためであった。」といったように、ほぼ間違いなく説明されている。
そこでデータを構造化し、ブラックボックス化するために考え出されたのが、データ形式の定義とそれを処理する手続きや関数をまとめて一個の構成単位とするという考え方で'''[[モジュール]]''' ({{Lang|en|module}}) と呼ばれる概念である([[プログラミング言語]]の例としては[[Modula-2]] 1979年)。しかし定義とプログラム内の実体が一対一に対応する手続きや関数とは異なり、データはその形式の定義に対して値となる実体([[インスタンス]]と呼ばれる)が複数存在し、各々様々な寿命を持つのが通例であるため、そのような複数の実体をうまく管理する枠組みも必要であることがわかってきた。そこで単なるモジュールではなく、それらのインスタンスを整理して管理する仕組み(例えば[[クラス (コンピュータ)|クラス]]とその[[継承 (プログラミング)|継承]]など)まで考慮して生まれたのが[[オブジェクト (プログラミング)|オブジェクト]]という概念である(プログラミング言語の例としては[[Simula]] 1962年)
Simulaのオブジェクトとクラスというアイデアは異なる二つの概念に継承される。一つはシステム全てをオブジェクトの集合と捉え、オブジェクトの相互作用を'''メッセージ'''に喩えた「[[オブジェクト指向]]」である。オブジェクト間の相互作用をメッセージの送受と捉えることで、オブジェクトは受信したメッセージに見合った手続き単位(≒関数)を自身で起動すると考える。結果オブジェクトは自身の持つ手続きのカプセル化を行うことができ、メッセージが同じでもレシーバオブジェクトによって行われる手続きは異なる――[[ポリモーフィズム|多相性]](ポリモーフィズム)を実現した(このメッセージを受け実行される手続き単位は、メッセージで依頼されたことを行うための「手法」の意味で[[メソッド (計算機科学)|メソッド]]と呼ばれる)。この思想に基づき作られたのが[[Smalltalk]]([[1972年]])であり、[[オブジェクト指向]]という言葉はこのとき作られた。
一方、Smalltalkとは別にSimulaの影響を受け作られた[[C++]]([[1979年]])は[[抽象データ型]]のスーパーセットとしてのクラス、オブジェクトに注目し、オブジェクト指向をカプセル化、継承、多相性をサポートするものと再定義した(その際、実行時速度重視及びコンパイラ設計上の制約により、変数メタファである[[動的束縛]]の特徴は除外された)。これらは当初[[抽象データ型]]、[[派生]]、[[メソッド (計算機科学)#仮想関数|仮想関数]]と呼ばれ、オブジェクトのメンバ関数を実体ではなくポインタとすることで、継承関係にあるクラスのメンバ関数の[[オーバーライド]](上書き)を可能にしたことで、多相性を実現した(この流儀では'''メッセージメタファ'''はオブジェクト指向に必須ではないものと定義し、オブジェクトの持つ手続きをメソッドとは呼ばず[[メソッド (計算機科学)|メンバ関数]]と呼ぶ)。この他、Smalltalkにある[[動的束縛]]の類似的な機能としてオーバーロード([[多重定義]])が実装されている。
Smalltalkはこの「全てをオブジェクトとその相互作用で表現する」というデザインに立ち設計されたため、全てをファイルと捉える'''ファイル指向[[オペレーティングシステム]]'''からの脱却と、プログラムをフロー制御された手続きと捉える'''手続き型言語'''からの脱却が行われた。そのためSmalltalkは自身が'''オブジェクト指向オペレーティングシステム'''でもあること、メッセージ・パッシングなどの特徴を持った。これは当時のプログラム言語としては特異的であり、[[ガベージコレクション|ガベージコレクタ]]を必要とし[[インタプリタ]]形式で実行される処理の重さも手伝って先進的ではありながら普及しがたいものであると捉えられた。また、メッセージでの多相性は、変数へのオブジェクトの[[動的束縛]]が前提となるため、静的型チェックが必要な実行時性能重視のコンパイラ言語にとって、実装から除外すべき特徴となった。
C++の創始者[[ビャーネ・ストロヴストルップ]]は、Smalltalkのような論理美の追求よりも、現用としての実用性を重視した。そのため、C++の再定義した「オブジェクト指向」はこれらの問題を全てクリアにし、既存言語の拡張としてオブジェクト指向機能を実装できることでブレイクスルーを迎え急速に普及する。これにより'''メッセージ送信'''という考え方はやや軽視されるようになり、オブジェクト指向とはC++の再定義したものと広く認知されるようになった。
[[1980年]]代後半に次々と生まれたオブジェクト指向分析・設計論は、[[Smalltalk]]を源流とするオブジェクト指向を基に組み立てられた。このときSmalltalkは健在であったが広く普及しているとは言えず[[C++]]で[[実装]]する機会が多かったが、C++はSmalltalkとは思想的にやや異なることと、仕様の複雑さが問題とされた。このニーズを受けC++の提示した現実解と、Smalltalk的理想論を融合するものとして、構文面ではシンプル化しながらも強くC++の影響を受けつつ、一方で用語や思想面でSmalltalk色を濃くした{{Citation needed|date=2018年2月}}[[Java]]([[1991年]])が作られた。バランス感覚に長けたJavaの登場によって[[オブジェクト指向開発]]に必要な要素が全てそろい、[[1990年代]]後半からオブジェクト指向は広く普及するようになった。
== オブジェクト指向プログラミング言語一覧 ==
オブジェクト指向プログラミングをサポートする機能を備える代表的な[[プログラミング言語]]([[オブジェクト指向プログラミング言語]])としては以下のようなものが挙げられる:
; [[Simula]] [[1962年]]
: [[オブジェクト (プログラミング)|オブジェクト]]と[[クラス (コンピュータ)|クラス]]を導入した最初の言語。また、C++が再定義したオブジェクト指向プログラミング言語の要件を満たすことから、最初のオブジェクト指向プログラミング言語とされることもある。[[クラスベース]]。当初はシミュレーション記述用に開発されたものであったが、後に汎用化された。
; [[Smalltalk]] [[1972年]]
: オブジェクト間の相互作用に'''メッセージ'''という機構を導入した最初の言語。オブジェクト指向と言う言葉は、Smalltalkのプログラミングスタイルを説明するために作られた。[[動的な型付け]]により高い柔軟性を持つ。
; [[C++]] [[1979年]]
: [[C言語]]のオブジェクト指向拡張。Simula言語風にクラスを定義でき、C言語の型システムを強化している。当初はC言語に対して上位互換であった。また、[[強い型付け]]によりC言語譲りの実行効率の高いコードが生成できる。
; [[Objective-C]] [[1983年]]
: C言語のオブジェクト指向拡張。C言語のコードとSmalltalk型のオブジェクトシステムを混在させたもの。オブジェクトシステム自体はCで書かれたランタイム。
; [[Eiffel]] [[1986年]]
: [[強い型付け]]を行う[[型システム]]や[[表明]]など堅牢性を強く意識して設計されたオブジェクト指向プログラミング言語。C++に[[テンプレート (プログラミング)|テンプレート]]が導入される前に[[総称型]]を導入していた。
; [[Self]] [[1987年]]
: 最初の[[プロトタイプベース|インスタンスベース]]のオブジェクト指向プログラミング言語。
; [[CLOS]] [[1988年]]
: [[関数型言語]][[Common Lisp]]のオブジェクト指向仕様。
; [[Modula-3]] [[1988年]]
: モジュールを実現していた[[Modula-2]]言語のオブジェクト指向拡張。
; [[Python]] [[1990年]]
: 最初のオブジェクト指向[[スクリプト言語]]。
; [[Sather]] [[1990年]]
: Eiffelを拡張したもの。実行効率面での工夫が見られる。
; [[NewtonScript]] [[1993年]]
: [[携帯情報端末|PDA]]環境用に修正されたSelf言語。PDAの性質を生かすため[[永続オブジェクト]]をサポートしている。
; [[Ruby]] [[1993年]]
: オブジェクト指向スクリプト言語。クラスのMix-inなどのユニークな機能を持つほか、[[正規表現]]に渡るまで全てがクラスとして実装されていることが特徴。
; [[Perl]] [[1994年]]
: Perl 5.0にてオブジェクト指向に対応。既存のPerl言語に後付けで拡張されたため記法は特殊だが、機能面では他のオブジェクト指向言語に引けを取らない。
; [[Ada]]のオブジェクト指向拡張 [[1995年]]
: 恐らく最も仕様が複雑なオブジェクト指向プログラミング言語。
; [[Java]] [[1995年]]
: [[仮想機械|仮想マシン]]([[Java仮想マシン]])上で動作することによる高い[[移植性|可搬性]]、[[リフレクション]]や[[スレッド (コンピュータ)|スレッド]]の標準サポートと充実した[[ライブラリ]]群で知られているオブジェクト指向プログラミング言語。
; [[Object Pascal]] ([[Delphi]]) [[1995年]]
: [[Pascal]]言語のオブジェクト指向拡張。
; [[JavaScript]] [[1996年]]
: [[ウェブページ]]上で実行することを主目的に開発されたスクリプト言語。[[プロトタイプベース]]の言語である。
; [[OCaml]] [[1996年]]
: 関数型言語[[プログラミング言語ML|ML]]のオブジェクト指向拡張。[[クラス (コンピュータ)|クラス]]が[[型推論]]機構に組み込まれているという特徴がある。
; [[PHP (プログラミング言語)|PHP]] [[2000年]]
: 動的にWebページを生成することを主目的としたスクリプト言語。バージョン4からオブジェクト指向に対応し、バージョン5でアクセス権やインターフェースなど、オブジェクト指向の強化が行われている。
; [[C Sharp|C#]] 2000年
: Javaとよく似た作りでJavaと同じく仮想マシン上で動作するが様々な部分で拡張されている。[[.NET Framework]]上で動く。
; [[Microsoft Visual Basic .NET|Visual Basic.NET]] [[2002年]]
: 既存のVisual Basic(6.0以前)を大きく改訂してオブジェクト指向に対応。C#同様[[.NET Framework]]上で動く。
; [[COBOL]] [[2002年]]
: 2002年に制定された国際規格に、オブジェクト指向機能が採用された。1994年には、国際規格案を先取りした商用コンパイラ上で利用可能になった。オブジェクト指向構文を使わないCOBOLプログラムと混在できる。
; [[Ceylon]] [[2011年]]
: Java をもとにつくられ、Java のもつ長所と短所を考慮しつつ、商用言語として再設計された言語。
; [[Swift (プログラミング言語)|Swift]] [[2014年]]
: [[Objective-C]]のオブジェクトを引き継ぎながらも、ベースのC言語を取り除いて新しく再設計された言語。
また、以下のような分類もある。
; ハイブリッド型オブジェクト指向プログラミング言語 ({{Lang|en|hybrid object-oriented language}})
: 「ハイブリッド」という用語をどう定義するかによるが、たとえば「手続き型や関数型などの既存の他のパラダイムを主とした言語に、オブジェクト指向機能を拡張した」という言語を「ハイブリッドだ」、と言う者もいれば、「当初からオブジェクト指向を含む、複数のパラダイムを指向する言語として設計された」という言語を「ハイブリッドだ」と言う者もいる。例としては、以上のどちらの基準か、それとも別の定義によるものかは知らないが、OCaml、C++およびObjective-C、CLOS、Object Pascal、object-oriented COBOLなどを挙げる者がいる。
; 純粋なオブジェクト指向プログラミング言語 ({{Lang|en|pure object-oriented language}})
: 「純粋」という用語をどう定義するかによるが、たとえば[[Smalltalk]]や[[Ruby]]のように「あらゆる対象がオブジェクトである」という言語(たとえば、Rubyではnilも、ヌルポインタのようなものではなく、NilClassのインスタンスというオブジェクトである。この場合対照例としては、通常の数値型などがオブジェクトでない[[Java]]であろう)を「純粋だ」と言う者もいれば、「当初からオブジェクト指向プログラミング言語として設計された」言語を「純粋だ」と言う者もいる(こちらの定義ではJavaも含まれるだろうか)。例としては、以上のどちらの基準か、それとも別の定義によるものかは知らないが、[[Smalltalk]]、[[Eiffel]]、[[Self]]、[[Ruby]]、[[Swift (プログラミング言語)|Swift]]などを挙げる者がいる。
オブジェクト指向プログラミング言語では、オブジェクトへの[[参照 (情報工学)|参照]]や[[ポインタ (プログラミング)|ポインタ]]が多用される。そのため、オブジェクトの[[メモリ]]への割り当てに関して、自動[[ガベージコレクション]]機能を備えているものが多い。ただし、すべての言語が備えているわけではない。例えば、C++はガベージコレクションを備えていない。
== オブジェクト指向の応用 ==
プログラミング(ただし、ごく狭義の。普通は以下のようなものもプログラミングの工程に含まれる)にとどまらず、以下のようなより広い範囲にオブジェクト指向は応用されている。
* [[オブジェクト指向分析設計]]
* [[オブジェクト指向モデリング]]
* [[オブジェクトモデル化技法]]
また、当初はJavaないしC++における[[デザインパターン (ソフトウェア)|デザインパターン]]を表記・記述するための(図形を含む)言語として設計が始まった[[統一モデリング言語]]は、ツールベンダ等の意向により以上のような応用をサポートするためのものとして、仕様は大幅に膨れている。
==
オブジェクト指向プログラミング言語は、相互に'''[[#メッセージ|メッセージ]]'''を送りあう'''[[オブジェクト (プログラミング)|オブジェクト]]'''の集まりとして[[プログラム (コンピュータ)|プログラム]]を構成することができる仕組みを持つ。
そのために、少なくともオブジェクトについての3つの仕組みと、オブジェクトの管理についての3つの仕組みが必要となる。
;オブジェクトの仕組み
:* オブジェクトに蓄えられる情報、データを表現する仕組み。
:* 他のオブジェクトにメッセージを配送する仕組み。
:* 受け入れ可能な各種メッセージに対応して、処理する事柄を記述する仕組み([[メソッド (計算機科学)|メソッド]])。
;オブジェクトを管理する仕組み
:* オブジェクト間の関係を整理分類して系統立てる仕組み。
144 ⟶ 111行目:
これらをどのように言語の要素として提供し、どのような[[機械語]]コードで実現するかによって様々な[[オブジェクト指向プログラミング言語]]のバリエーションが生まれる。以下、オブジェクト指向プログラミング言語が提供する様々な要素が上記の仕組みをどのように実現しているかについて概観する。
=== オブジェクトの概念と実
'''[[オブジェクト (プログラミング)|オブジェクト]]''' ({{Lang|en|object}}) はオブジェクト指向プログラミングの中心となる'''概念'''であり、この概念を'''実際'''にどう実現するかは[[オブジェクト指向プログラミング言語]]により異なる。
153 ⟶ 120行目:
* 概念的には コードとデータが一つになっている。
==== オブジェクトという概念の実
実際のプログラムでは、全てのオブジェクトが互いに全く異なった存在ではなくオブジェクトは種類に分けることが出来る。
160 ⟶ 127行目:
このような場合、各オブジェクトがそれぞれメッセージ処理のコード(前述の「振る舞い」に当たる)を独自に備えていては無駄である。そこでオブジェクト指向プログラミング言語がオブジェクトを実現する際には多くの場合、内部的にはオブジェクトを2つの部分に分けている。
=====
もう一つは同一種類のオブジェクトでもそれぞれ異なる部分、典型的には各オブジェクトが保持するデータ群である。
====
{{seealso|this (プログラミング)}}
そしてあるオブジェクトOにメッセージを配送し適切なメッセージ処理コード(振る舞い)を呼び出す際には、まず対象となるオブジェクトOについて共通部分の格納場所を見つけて適切なコードを選び出し、次にそのコードに対して処理対象となるオブジェクトO固有のデータの所在を示す'''オブジェクトID'''を渡すようになっている。
179 ⟶ 141行目:
また各オブジェクトの固有データから共通部分の格納場所を見つける方法もまた各言語により異なり、その言語の開発目的に応じて実に多種多様である。
====
[[Self]]のような[[プロトタイプベース|インスタンスベース]]のオブジェクト指向プログラミング言語では、プロトタイプとなるオブジェクトがメッセージを処理するコードも保持しており、オブジェクトがクローンされて作成されるときにそのプロトタイプのありかを示す情報もコピーされ、メッセージは受け取ったオブジェクトのIDを添えてプロトタイプに送られて処理される(Selfでは実行効率上の問題から後に内部的にクラスを作って利用するようになっている)。
==== クラスベースの言語の場合 ====
最も普及している[[クラスベース]]の言語では、共通部分はオブジェクトの種類を表現するクラスに保持され、各オブジェクトは固有データと共にそのクラスのIDを保持する。そしてオブジェクトに送られるメッセージはその送り先オブジェクトにあるクラスのIDからクラスを見つけ、その中からメッセージを処理するコードを見つけ出し、処理対象となっているオブジェクトのIDを付してそのコードを呼び出す仕組みになっている。
=== メッセージ ===
207 ⟶ 168行目:
=== クラス ===
{{main|クラス (コンピュータ)}}
'''クラス''' (class) は大多数のオブジェクト指向プログラミング言語で提供されている仕組みであり、上記の機能の殆ど全てに関わりがある。概念的にはクラスはオブジェクトの種類を表す。このためオブジェクトはクラスに'''属する'''という言い方をする。あるクラスに属するオブジェクトのことをそのクラスの'''インスタンス''' (instance) と呼ぶ。[[データ型]]の理論から見た場合クラスは型を定義する手段の一つである。クラスによってオブジェクトを記述する言語を'''[[クラスベース]]''' ({{Lang|en|class-based}}) のオブジェクト指向プログラミング言語と呼ぶ。
ハイブリッド型オブジェクト指向プログラミング言語では在来の[[データ型#レコード型|レコード型]](Cでは[[構造体]])の構文を拡張してクラスの定義を行うようにしたものが多い。
214 ⟶ 174行目:
多くのオブジェクト指向プログラミング言語ではクラスを'''[[#データ・メンバ|データメンバ]]'''と'''[[#メソッド|メソッド]]'''の集まりとして記述する。平たく言えばデータ・メンバの集まりはオブジェクトが保持するデータの形式を定め、各メソッドはそれぞれオブジェクトが処理する特定のメッセージの処理方法を定める。しばしばデータ・メンバとメソッドには個別に[[オブジェクト指向プログラミング#アクセス権|アクセス権]]が設定できるようになっていて、そのクラスに属するオブジェクトが内部的に利用するものと他のクラスに属するオブジェクトに公開するものを分類できるようになっている。多くの場合、公開されたメソッドの集まりは全体として処理可能なメッセージのカタログの機能、即ち[[インタフェース (情報技術)|インタフェース]]を提供する。各言語によって異なるが特定の名前のメソッドを定めて、オブジェクトの生成や初期化時の処理、廃棄時の処理などを記述できるようにすることも多い。
多くの言語でクラスは言語の要素として直接実現されているが、これは実行効率のためであり、そのように実現することが必須というわけではない。実際、各クラスをそれぞれオブジェクトとして提供する言語も存在する(例:[[Smalltalk]])。このような言語ではある種の'''[[
====
{{main|プロトタイプベース}}
クラスは非常に多くのオブジェクト指向プログラミング言語で提供されている機能ではあるが、オブジェクト指向プログラミング言語に必須の機能というわけではない。実際にオブジェクトの管理や、データ・メンバや[[メソッド (計算機科学)|メソッド]]の記述、[[継承 (プログラミング)|継承]]に際してクラスという仕組みに依存せずに、もしくはクラスという仕組み自体を持たずに別の手段でこれらを実現している言語も存在する。このような言語を'''[[プロトタイプベース|インスタンスベース]]''' (''{{Lang|en|instance-based}}'')、'''オブジェクトベース''' (''object-based'') あるいは'''プロトタイプベース''' (''{{Lang|en|prototype-based}}'') のオブジェクト指向プログラミング言語と呼ぶ。インスタンスベースまたはそれに類するのオブジェクト指向プログラミング言語には以下のようなものがある:
* [[Self]]
* [[JavaScript]]
* [[NewtonScript]]
* [[ドリトル (プログラミング言語)|ドリトル]]
* Squeak [[Etoys|eToys]]([[Squeak]]の非開発者向けビジュアルスクリプト言語。SqueakToys とも)
250 ⟶ 210行目:
ただし、Smalltalkのクラス変数はC++やJavaのクラス変数とは異なる。Smalltalkにおいて、C++やJavaのクラス変数と同等となる変数は'''プール辞書''' ({{Lang|en|pool dictionary}}) と呼ばれる。
=== インスタンスオブジェクトとクラスオブジェクト ===
動的型付けを採用するオブジェクト指向言語の多くは、クラスより生成するインスタンスの他に[[メタクラス]]という機能を持ちクラス自体をオブジェクトとして扱うことが出来る。このためオブジェクトには、インスタンスオブジェクトとクラスオブジェクトという2種類のオブジェクトが存在する。Java等クラスオブジェクトを持たない言語の文化圏では、インスタンスオブジェクトとオブジェクトを混同して説明される事があるが、Objective-CやPython、Ruby等、インスタンスオブジェクトとクラスオブジェクトが別であるオブジェクト指向言語では区別して説明される。<ref>Objective-Cプログラミ
ング言語[https://developer.apple.com/jp/devcenter/ios/library/documentation/ObjC.pdf]</ref>
<ref>Classes ― Python v2.7.3 documentation[http://docs.python.org/2/tutorial/classes.html]</ref>
<ref>クラス/メソッドの定義 (Ruby manual) [http://www.ruby-lang.org/ja/old-man/html/_A5AFA5E9A5B9A1BFA5E1A5BDA5C3A5C9A4CEC4EAB5C1.html]</ref>元々はSmalltalkから始まった用語である。
=== メソッド ===
'''[[メソッド (計算機科学)|メソッド]]''' ({{Lang|en|method}}) は特定の種類のメッセージの処理方法を記述したものである。メソッドも[[メソッド (計算機科学)#インスタンスメソッド|インスタンス・メソッド]]と[[メソッド (計算機科学)#静的メソッド|クラス・メソッド]]の2種にできる。インスタンス・メソッドはそのクラスの各インスタンスオブジェクトを操作し、クラス・メソッドはクラスオブジェクトを操作する。メソッドとの集まりはそのクラスのオブジェクトが処理可能なメッセージのカタログの機能を果たす。
==== 他言語と比較したC++のメソッド ====
[[C++]]ではメソッドは'''メンバ関数''' ({{Lang|en|member function}}) や'''関数メンバ''' (function member) と呼ばれる。これはC++が[[グローバル関数]]との区別をつけることと、クラスを[[抽象データ型]]の拡張と位置づけ、非メッセージメタファな言語思想を持っている為である。これら言語ではメソッドをオブジェクト(=クラスやインスタンス)の持ち物として捉えず、クラスに定義された機能要素であると考える。メッセージメタファを否定するため、同時にメッセージを実行するメソッド(手法)ではありえない。
==== クラスメソッドについて ====
[[メソッド (計算機科学)#静的メソッド|クラス・メソッド]]だが、オブジェクト指向の本義に立ち返れば、クラス・メソッドがあるということはクラスがメッセージをレシーブできるという事になる。
267 ⟶ 234行目:
[[Smalltalk]]ではクラスもオブジェクトの一種であるため当然クラスはメソッドをもつ。
クラス・メソッドは、C++では'''静的メンバ関数''' ({{Lang|en|static member function}}) と呼ばれる。これはクラスがオブジェクトでない言語にとってはクラス・メソッドより正確な表現であり適切である。("static" とはCの'''static変数'''に由来し'''auto変数'''の対語である。関数コールによりスタック上に生成される関数インスタンスに依存しない変数と、インスタンス生成有無にかかわらず実行できる関数の類似による。)
Javaではクラス・メソッドは'''静的メソッド''' ({{Lang|en|static method}}) とも呼ばれることもある。
==== 特定の機能の割り当てについて ====
言語によっては特定の名前のインスタンス・メソッドやクラス・メソッドにオブジェクトの生成、初期化、複製、廃棄といった機能を固定的に割り当てている。
===== 初期化と廃棄時に利用されるメソッド =====
初期化に利用されるメソッドを'''[[コンストラクタ]]'''あるいは'''構築子''' ({{Lang|en|constructor}})、廃棄時に利用されるメソッドを'''[[デストラクタ]]'''あるいは
Javaでは
[[データ型]]の理論においては保持されるデータが必ずその型で認められる正しい値の範囲に収まることを保証するため、生成されるオブジェクトのデータ・メンバが必ず適切な
C++
===
オブジェクト指向プログラミングにおいて、[[オブジェクト (プログラミング)|オブジェクト]]は、[[カプセル化]]されておりブラックボックスである。したがって、処理するメッセージのカタログ、つまりインターフェースだけが利用者に公開され、内部の詳細は隠されるのが基本である。しかし、あるクラスのインスタンスの内部だけで利用されるメソッドまで公開してしまうと、利用者にとって煩雑である。また、定数データ・メンバのようなものは一々メソッドでアクセスするようにせず公開してしまっても、カプセル化の利点は失われず効率的でもある。そこで、オブジェクトを定義するプログラマが各データ・メンバやメソッドについて公開・非公開を設定できる機能を用意している言語は多い。
例えば、Javaでは、データ・メンバやメソッドの宣言にpublicと指定すれば、他オブジェクトから自由に利用でき('''公開'''と呼ばれる)、privateと指定すればオブジェクト内だけで利用できるようになる('''非公開'''と呼ばれる)。
298 ⟶ 261行目:
なお、public、private、protectedというキーワードは、多くのプログラミング言語で用いられているが、その示す意味は言語ごとに差異があるため、注意が必要である。
=== コンポジション ===
'''コンポジション'''は、複数のオブジェクトがある一つのオブジェクトの構成要素となっている巨大なオブジェクト群をいう。コンポジションのもとにあるオブジェクトは同一の生存期間を持ち、一つの巨大な仮想オブジェクトの構成部品として機能する。
== 脚注 ==
|