「オブジェクト指向プログラミング」の版間の差分
削除された内容 追加された内容
編集の要約なし |
Goldensundown2 (会話 | 投稿記録) |
||
(同じ利用者による、間の4版が非表示) | |||
9行目:
'''オブジェクト指向プログラミング'''(オブジェクトしこうプログラミング、{{Lang-en-short|object-oriented programming}}; OOP)は、[[オブジェクト指向]]の[[プログラミングパラダイム|考え方]]<ref>コンピュータ・プログラミングのパラダイムについては『新しいプログラミング・パラダイム』などを参照: http://www.kyoritsu-pub.co.jp/bookdetail/9784320024939</ref>を取り入れた[[プログラミング (コンピュータ)|コンピュータ・プログラミング]]技法である。プログラムを「[[オブジェクト (プログラミング)|オブジェクト]]」の集合体として構築し、オブジェクトはデータ(状態)を主とし、コード(動作)を従として構成され、無数のオブジェクトが相互に作用し合うようにして任意の処理が実行される。オブジェクトとは対象物を意味し、CPU演算処理(コード)が参照ないし変動の対象とするデータ全般と考える事が出来る。「どの様にデータを扱うか」ではなく「データがどの様に扱われるか」を念頭に置いてプログラムを組み立てる手法がOOPという事になる。
オブジェクト指向プログラミングは、ソフトウェアの大規模化に伴い、より効率的な開発手法が模索される中で1960年代から70年代にかけて確立された。OOP言語は歴史的にクラス
==
OOPの基本原則(''fundamental principle'')仕様は以下の通りである。1~3は[[Simula]]系統であるクラス主体(''classes-principled'')OOPの三大原則となっている。4は[[Smalltalk]]系統であるメッセージ主体(''messaging-principled'')OOPの主要原則とされる。
; カプセル化
従来の手続き型プログラミング環境では、「動作」を定義する'''コード'''が、「状態」を表現する'''データ'''を扱う形でプログラムを記述するのが一般的だったが、開発規模の拡大に伴い、解決の難しいソフトウェア・バグ原因の大半は「データの予期せぬ変動」と「各データ間の
; 継承
また、プログラム内の膨大な数のデータは通常グループ化(構造体)されて扱われていたが、各構造体間にまたがる共通のデータ集合が多数出現し、その冗長性と整合の頻雑さの問題が浮き彫りとなっていた。これを解決する為にOOPは、構造体=オブジェクトを複数の'''階層要素'''に分け、共通のデータ集合を親階層とし、派生する子階層に親階層の参照アドレスを持たせて連結する構造とした。A階層から成る親オブジェクトから派生した子オブジェクトはA+B階層として構成され、これが'''継承'''と呼ばれた。コードから参照されたデータがB階層に無い時は、次のA階層に有るか探す仕組みとなり、この連鎖によって傍からは一つのオブジェクトとして存在した。なお、派生クラスで任意のデータとメソッドを追加出来る継承の機能は、
; 多態性
38行目:
; メッセージパッシング
上述の三つの機能と異なり、メッセージパッシングはオブジェクト指向そのものと肩を並べるパラダイムであり、オブジェクト指向が示す機能の大半を結果的に実現出来る「[[メタデータ|メタ]]」的な土台となった。これは従来のサブルーチンコールの形態を変えたもので、基本はバイトデータ('''メッセージ''')の送受信でメソッド名とパラメータ値およびリターン値をやり取りする仕組みだった。オブジェクトのレシーバー関数が引数として渡されたメッセージを読み込み、オブジェクト内部でそれに準じた処理を行い、結果をリターンした。レシーバーの仕組みは結果的に「
== 歴史 ==
58行目:
== OOP言語一覧 ==
オブジェクト指向を総体的または部分的にサポートする機能を備えたプログラミング言語
オブジェクト指向プログラミング言語の形態には、オブジェクト指向と他の[[プログラミングパラダイム|パラダイム]]が同居している'''ハイブリッドOOP'''と、オブジェクト指向に基づくコードプロセスだけが許容される'''ピュアOOP'''の双方が存在する。前者には「C++」「Objective-C」「Java」「C#」「Swift」などが、後者には「Smalltalk」「Eiffel」「Self」などがあ
言語仕様の中でオブジェクト指向の存在感が比較的高い代表的なプログラミング言語を以下に列挙する。
[[Simula|'''Simula 67''']] 1967年
: 1962年に公開された[[Simula]]の後継版であり、[[クラス (コンピュータ)|クラス
'''[[Smalltalk]]''' 1980年
: オブジェクト間の相互作用を担う[[メッセージパッシング|メッセージ
'''[[C++]]''' 1983年
: [[C言語]]にクラス主体OOPに基づく言語仕様を追加したもの。Simulaの影響を強く受けている。クラス
'''[[Objective-C]]''' 1984年
:[[C言語]]にメッセージ主体OOPに基づく言語仕様を追加したもの。Smalltalkの影響を強く受けてい
[[Object Pascal|'''Object Pascal''']] 1986年
82 ⟶ 80行目:
'''[[Eiffel]]''' 1986年
:[[Pascal]]をベースにしてクラス主体OOPに基づく言語仕様と[[ジェネリックプログラミング|ジェネリクス]]のパラダイムを追加した。型付けは静的に限られ
'''[[Self]]''' 1987年
:
'''[[CLOS]]''' 1988年
:[[Common Lisp]]に
'''[[Python]]''' 1990年
: クラス主体OOPに分類される。[[インタプリタ]]式で動作する。言語仕様を簡素化し自動メモリ管理機能を実装して扱いやすく理解しやすいOOPを目指している。後のOOPスクリプト言語の手本となった。
'''[[Java]]''' 1995年
:堅牢性と安全性を重視したクラス主体OOPである。仮想マシン上の実行、ガーベジコレクタ、例外処理などを採用し、多重継承とジェネリックを破棄したがその埋め合わせの仕様も備えられている。メッセージ主体OOP的設計を表現出来るシリアライゼーションやリフレクションの仕様も導入された。非常に整えられたハイブリッドOOP言語である。
'''[[Delphi]]''' 1995年
:
'''[[Ruby]]''' 1995年
: クラス主体OOPに分類されるスクリプト言語である。[[インタプリタ]]式で動作
'''[[JavaScript]]''' 1996年
:[[ウェブアプリケーション]]開発を主な目的とするOOPスクリプト言語。主に[[プロトタイプベース]]
[[C Sharp|'''C#''']] 2000年
:
[[Microsoft Visual Basic .NET|'''Visual Basic.NET''']] 2002年
: 従来の[[Microsoft Visual Basic|Visual Basic]]の構文をベースにしつつ、クラス主体OOPに基づいて言語仕様が改変されている。[[.NET Framework]]などの[[共通言語基盤]]上で実行される。
'''[[Ceylon]]''' 2011年
129 ⟶ 113行目:
:[[Javaバイトコード]]を出力し、[[Java仮想マシン]]上で動作するJVM互換のOOP言語。関数型プログラミング言語由来の機能を持つ。
[[Swift (プログラミング言語)|'''Swift''']] 2014年
:[[Objective-C]]の後継言語。クラス主体OOPとメッセージ主体OOPの中間に
== OOP言語の仕組み ==
170 ⟶ 154行目:
もう一つは同一種類のオブジェクトでもそれぞれ異なる部分、典型的には各オブジェクトが保持するデータ群である。
====
動的型付けを採用するオブジェクト指向言語の多くは、クラスより生成するインスタンスの他に[[メタクラス]]という機能を持ちクラス自体をオブジェクトとして扱うことが出来る。このためオブジェクトには、インスタンスオブジェクトとクラスオブジェクトという2種類のオブジェクトが存在する。Java等クラスオブジェクトを持たない言語の文化圏では、インスタンスオブジェクトとオブジェクトを混同して説明される事があるが、Objective-CやPython、Ruby等、インスタンスオブジェクトとクラスオブジェクトが別であるオブジェクト指向言語では区別して説明される。<ref>Objective-Cプログラミ
ング言語[https://developer.apple.com/jp/devcenter/ios/library/documentation/ObjC.pdf]</ref>
|