Fortran でオブジェクト指向

1998.10

オブジェクト指向について、まず説明しましょう。

テレビの内部は複雑ですが、そのインターフェースは単純です。 スイッチの On/Off とチャンネルを切替える方法さえ分かっていれば 誰でも使えます。このように、内部は複雑でもインターフェースを シンプルにして扱いやすくすることが、オブジェクト指向プログ ラミングの目的の一つです。

オブジェクト指向プログラミング用のプログラミング言語としては、 C++ 、Java、Delphi ( object pascal ) などがありまして、 Fortran はオブジェクト指向用のプログラミング言語ではありません。

しかし、オブジェクト指向の考え方を取り入れてプログラムを 組むことは出来ます。オブジェクト指向ではクラスを定義し、 そのインスタンスを生成します。オブジェクト指向の良いところは、 1 つのクラスのインスタンスを複数作成できることで、 これは C や Fortran では出来ません。 しかし、1 つのクラスのインスタンスを 1 つだけしか作成しない場合は Fortran でもオブジェクト指向のプログラムを作ることが出来ます。

ここでは、その例として Fortran で作ったスタックのプログラムを 掲げます。

ここで考えるスタックは次の機能を持っています。

  1. push(data) でスタックにデータを積む
  2. pop(data) でデータをスタックから下ろす
  3. clear() でスタックに積まれていたデータをクリアする

これを Fortran でオブジェクト指向の考え方で組むと以下のよ うになります。

subroutine stack parameter( max = 100 ) !<--- 積めるデータの最大数 dimension a(max) !<--- データを入れる配列 data i/0/ ! <---- スタックには何も積まれていない save * ~~~~ <----- これが一番肝心 * このサブルーチン内の変数は全て静的変数である * ( C での static 変数 ) * 静的変数はプログラム実行中は常にメモリ上に保持される entry push(data_) * ~~~~ <------ データをスタックに積むメソッド i = i + 1 a(i) = data_ return entry pop(data_) * ~~~~ <------ データをスタックから降ろすメソッド data_ = a(i) i = i - 1 return entry clear() * ~~~~~~~ <----- スタックをクリアするメソッド i = 0 return end

上の例ではスタックのオーバーフローやアンダーフローを考慮して いないので、完全なプログラムではありませんが、オブジェクト指向の 考え方を簡潔に表しています。利用者はスタックの中身は知らなくても

call push(data) でスタックにデータをプッシュ call pop(data) でスタックからデータをポップ call clear() でスタックをクリア

というだけを知っていればよろしい。

なお、上の例ではメソッドへの引数は変数名の右側にアンダー バーをつけています。

以上のような考え方を使えば、common 変数を使わないで済みます。 common 変数を保持するモジュールを作り、変数を設定するメソッド、 変数の内容を取り出すメソッドを用意します。

こうすると、メソッドを通してしか変数にアクセス出来ません。 ゆえに、プログラムの安全性が高まり、組みやすくなります。

余談ですが、スタックを 2 つ使いたいときはどうすれば 良いのでしょうか? 残念ながら、Fortran ではこれが 出来ません。C++ などのオブジェクト指向言語が必要です。 C++ なら

class stack { ........ 変数とメソッドの宣言 } stack::push(doublt data) { メソッドの内容 }

でスタックというクラスを記述し、 stack a,b;

のように宣言すると、a,b ともにスタックを表すインスタンス となります。