この記事について
前回
データ構造化理論の型選択演算子によるダイクストラ選択 - 構造化プログラミングの覚え書きその3 - dhrname’s diary
今回は構造化プログラミングで触れられているオブジェクトクラス同士のダイクストラ連接について考察を加える。なお、この記事は私個人による独自解釈である。
「オブジェクト(対象, object)」、「クラス(class)」、「インスタンス(実例, instance)」、「サブクラス(部分クラス, subclass)」「new構文」の定義は1975年に日本で出版された「構造化プログラミング(ダイクストラ、ホーア、ダール共著、野下、川合、武市共訳、サイエンス社)」に従う。
ダイクストラ構造化原理によれば、「3パターンの制御構造による抽象化 = 型付け」である。その3つのパターンのうち、今回はダイクストラ連接について考える。第三部のクラスプログラミングの考え方を見ていこう。
オブジェクトクラスの連接
クラス構文
今、次のようなクラス構文を使って、クラスAをつくる。このコードはSIMULA67言語の構文に似たものである。
class A()
begin
int x := 0;
procedure f()
begin
end
end
インスタンス
このクラスAをインスタンスaとして生成するためには、以下のようなnew構文を使った生成子(generator)を用いる。
Ref(A) a :- new A();
コード中の変数 a はインスタンス変数である。なお、Ref(A)はデータ型の宣言であり、型Aへの参照(reference)を意味する。
インスタンスは以下のような再帰関数と同じく、無限に繰り返されるときに、永続する変数に似ている。
procedure A()
begin
int x := 0;
A();
end
この再帰関数によって無限に宣言される変数xは、永遠に寿命を迎えることがなく、メモリ上に生き続ける。従って、メモリの節約のためには、ガベージコレクションを使い、積み上げられたスタックをどこかのタイミングで解放してやるのが良い。
ダイクストラ選択によるアクセス
内部の手続き、つまり、procedure fにアクセスするためには、インスタンスとホーア・データ構造化を用いて、ダイクストラ選択(選出)をするとよい。
Ref(A) a:- new A();
a.x;
a.f();
この入れ子になっている内部の変数xや手続きfをダイクストラ選択する方法をSIMULA言語では遠隔識別(remote identifire)と呼ぶ。ホーアとウィルトはその遠隔識別を選択子(selecttive)と呼んだ。*1
続けて、同様にクラスBをつくって、クラスAと連接させる。このとき、クラスAは前接クラス(prefix class)と呼ばれる。
A, class B()
begin
procedure g()
begin
g := x;
end
end
Ref(B) b :- new B();
b.g();
このとき、選択子b.g()は、前接クラスAの内部変数xの値0を返す。前接クラスAに対して、クラスBは部分クラスを形成する。
内部変数xは局所変数であるので、クラスを使わないコード、例えば、
begin
int x := 0;
end
x := 10;
というように書けば、ブロック外部からのアクセスエラーとなる。すなわち、情報隠蔽は常に成立している。
情報隠蔽された局所変数xへ外部からアクセスする方法は、「クラス同士のダイクストラ連接」、「インスタンスへのダイクストラ選択」によるものである。また、そのときに限って、隠蔽されていた情報が外部へ公開される。
つまり、言い換えれば、構造化プログラミングは情報隠蔽されていた変数、手続きを外部へと公開する手段なのである。
次回
データ構造化における抽象化の定義 - 構造化プログラミングにおける覚え書きその5 - dhrnameのブログ
*1:詳しくは冒頭で示した構造化プログラミングの第二部「データ構造化序論( Notes on Data Structuring)」を参照せよ