クラス (コンピュータ)

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動

プログラミングにおけるクラス: class)とは、既成のプログラムを再利用するボトムアップ型開発において、コンパイル済みファイル[1]の生成に相当する操作を言語内部で行うための構文を言う。操作法の統一のため抽象データ型として表現されることが多いが、概念的にクラス構文から生成される要素は並列実行も可能であり通常のデータ型とは異なる。

ダイクストラの構造化プログラミングの欠点を補う技法としてオーレ=ヨハン・ダールによってSimula67において初めて導入された。クラスの構文は、オブジェクト指向プログラミングの基本である。

概要[編集]

ダイクストラの構造化プログラミングは、プログラムの大規模開発への道を開いたが、あくまで単一スレッド(single thread)計算機を前提としたトップダウン型開発方法であった。すなわち、プログラムのすべての機能は単線の計算プロセス上で実行する必要があり、たとえ甲と乙という汎用的な単機能を提供する検証済みのプログラムがそれぞれ独立に存在していても、両機能を実現するプログラムを作成するためには、ソースコードから該当機能部分を抜き出し、単線上に乗るように連接(concatenation)した上で、一つのプログラムとして正しく動作するように修正し、さらに再度検証しなければならない。

一方で、複数スレッド(multi thread)計算機においては、主プログラムから、甲と乙のプログラムなどの従プログラムをそれぞれ並列に実行させた上で、処理内容を従プログラムに(OSの機能などを仲介して)伝言受け渡し(message passing)して代わりに処理させることで、検証済みプログラムのソースコードに手を加えることなく、低コストで開発することができる(以下、これを第0世代オブジェクト指向プログラミングと呼ぶ)[2]

オーレ=ヨハン・ダールアントニー・ホーアは、この第0世代オブジェクト指向プログラミングのような考え方の有効性を主張し[3]、上記のような一連の操作を一つの言語の中で完結させるための機構を提案した。それがクラスの構文である。

ダールとホーアは、まず主プログラムから従プログラムを並列呼び出しする際、読み込みするにあたって新たに(new)割り当てられたメモリ領域に限定して走る計算プロセスを実例(instance;インスタンス)と名付け、さらにその実例の集まり(class of instances)をそれが記述されたソースコードと同一視した。その上で、呼び出されたときだけではなく、存在し続ける従プログラムの実例のもとになる手続きをクラス(class)、その実例を(「クラスの実例」ではなく)改めてクラスの対象(object)と名付けた[4]。さらに、その考えに基づいてSimula67にクラスの構文を実装した[5]

クラスは、カプセル化継承ポリモーフィズムなどの、オブジェクト指向プログラミングの実施を実現する基礎的な手段である。

クラス設計のための基本概念[編集]

カプセル化 (encapsulation)[編集]

一般にどんなプログラムであれデータを保有するだけではなくその機能の中でその操作ができなければならない。同様にして、クラスにおいても、データだけでなくその操作も保有する必要がある。クラス本体において局所的に宣言される変数や操作などを、クラスの所属物(attribute)[6][7]と呼ぶ[4]

このように関連する変数や操作などをクラスの所属物として一つにまとめてしまうことを、クラスによる情報のカプセル化(encapsulation)と呼ぶ。カプセル化により、データ構造やアルゴリズムの変更などに伴う変更がカプセル化された領域内の変更箇所だけで済み、変更箇所の散逸が関連ソースコード全体に広がることを防ぐことができる。

また所属物に対して公開/非公開情報の区別をつけることで、クラス外部からクラス内に対して破壊的操作を加えることを防いだり、企業秘密的情報を保有する場合外部から見ることができないようにするなど、他人に開放する情報に制限をつけることができる。カプセル化した上に公開/非公開情報の区別を加えることを情報隠蔽(information hiding)と呼ぶ[8][9]

継承 (inheritance、extension、generalization)[編集]

複数のクラスを連接させて一つの新しいクラスを作成することを多重継承と呼ぶ[10]。多重継承により、基となった全てのクラスの所属物は合わせて一つになり、全ての動作が組み合わさった新しい一つのクラスが構成される。ただし、多重継承はいくつかの問題点が指摘されており、一つのクラスに基づいてその拡張を行う単一継承、単に継承(inheritance)または拡張(extension)[11]を用いることが一般的である[12]

継承の目的は、単純なクラスに基づいてもっと複雑なクラスを構成することである。また、複雑なクラスはそれを定義する単純なクラスに従属するという意味で、クラスに階層をつけることができるようになる[13][14]。継承の基になったクラスを親クラス基本クラススーパークラス等といい、継承してできたクラスを子クラス派生クラスサブクラス等という。

また、オブジェクト指向を効率よく使いこなすためには継承だけでなく集約 (aggregation)、委譲 (delegation) を理解する必要がある。

ポリモーフィズム (polymorphism)[編集]

継承は、単純な基本クラスからより複雑なクラスを構成する機構であるが、逆に複雑なクラスの所属物のいくつかを除いて単純なクラスを構成する機構は、バグが容易に入り込むことが見込まれるので、ふつう存在しない。

すなわち、最初から多数の所属物をカプセル化したり、基本クラスから継承するにしても多数の所属物を付け加えて極めて特化されたクラスを最初から作成してしまうと、途中でそれよりやや一般的なクラスが必要になっても代替させることができない。

継承する際に、親クラスの関数を子クラスの関数で置き換えることをオーバーライドという。オーバーライドをうまく使うと、オブジェクトによって、実質的に実行される関数が変わるようにできる。このようにして、見かけが一緒なのに動作が違うようにできることをポリモーフィズム(ポリモルフィズム)多様性多態性などという。

脚注[編集]

  1. ^ ソースコードをアセンブラあるいはコンパイラが処理して生成されるもので、単独あるいは他の"プログラム部品"と結合した上で実行可能となるデータファイルはオブジェクト(object)と呼ばれる。川合(1982) p.43
  2. ^ ただし、随所にOSの機能を利用することになるため異なるOSへの移植性が低い上に、主プログラムと並列呼び出しする従プログラムが異なる言語で記述されている場合、複数の異なるコンパイラが必要となり、場合によっては複数の異なる言語を使用しなければならなくなってしまう。
  3. ^ 構造化プログラミング(1975) pp.201-202
  4. ^ a b 構造化プログラミング(1975) p.202
  5. ^ 言語仕様にクラス構文を導入することで以下のような利益が得られる。
    • 主プログラムと従プログラムに相当するものが異なる言語で記述されることがない。
    • 複数スレッド計算機のOSに依存した以下の一連の操作を言語内部で統一的に処理できるようになる
      • ソースコードのコンパイルによるオブジェクトファイル(object file)の生成、
      • 主プログラムからのメモリ割り当て
      • 並列呼び出し
    • 抽象データ型として表現される場合、OSを仲介した伝言のやりとりのような形式ではなく、体裁上は具体的データ型のデータに対する処理への引数渡し、処理返しとして取り扱い可能になる
  6. ^ UMLでは「属性」ともいう。
  7. ^ プログラミング言語によっては、アクセス修飾子(access modifiers)が付与されることもある。
  8. ^ 落水(1993) p.82
  9. ^ 多くのプログラミング言語ではフィールドやメソッドの定義とアクセス権の指定は同時になされるため、カプセル化と情報隠蔽はしばしば混同される。
  10. ^ Simula67においては、2つのクラスを単純に連接させることで新しいクラスを作成することはそのまま連接(concatenation)と呼ばれた。構造化プログラミング(1975) p.226
  11. ^ UMLでは汎化 (generalization) と呼んでいる。
  12. ^ 多重継承は、二つのクラスの同名メソッドのオーバーライドによるコンフリクトを始めとするいくつかの問題点が指摘されており、JavaC#D言語等では実装多重継承はサポートされておらず、インタフェース多重継承のみサポートされている。
  13. ^ 構造化プログラミング(1975) p.226
  14. ^ これが、ダールとホーアの論文の題名である『階層的プログラム構造』である。ダール(1972)

関連項目[編集]

参考文献[編集]

  • オーレ=ヨハン・ダール, C.A.R. ホーア (1972), 階層的プログラム構造 
    • E.W.ダイクストラ、C.A.R.ホーア、O.-J.ダール 『構造化プログラミング』 野下浩平,川合慧,武市正人訳、サイエンス社、1975年 (収録)
  • 川合 慧 『システム プログラム』 近代科学社〈コンピュータサイエンス大学講座〉、1982年
  • 落水 浩一郎 『ソフトウェア工学実践の基礎』 日科技連〈実践ソフトウェア開発工学シリーズ〉、1993年
  • Ole-Johan Dahl (2001), The Birth of Object Orientation: the Simula Languages