指向性メモ::2006-01-01::OOP in Ada

ページ情報
制作日
2006-01-01T23:22:42+09:00
最終更新日
2006-02-21T12:44:19+09:00
ページ内目次

やっぱりAdaでもOOPな感じに書きたい、ということで、ちょっと調べてみた。……これは単に「型互換性のある構造体」という認識で良いのだろうか。

with Ada.Strings.Unbounded;

package Actions is
   package SU renames Ada.Strings.Unbounded;

   type Action is tagged
      record
         Name    : SU.Unbounded_String;
      end record;

   procedure New_Action (This : in out Action);
   procedure Get_Name   (This : in     Action; Name :    out String);
   procedure Do_Action  (This : in     Action);
end Actions;

Java上がりのプログラマがまず面食らうのは、AdaのOOPにはドット記法が存在しないことだろう。上記のコードを見ると分かるが、Adaでは操作対象のインスタンスをプロシージャに引数として渡す――ただのプロシージャ呼び出しと全く分からない方法でコードを書いていくことになる

// in Java
Action act = new Action();
act.do_action();

-- in Ada
Act : Action;

New_Action (Act);
Do_Action (Act);

考え方としては、多態が可能なCの構造体(Adaでいうrecord)なのだろう。Ada全体で見れば比較的統一的だし、なかなか良い方法なのかもしれない。

ちなみに、命名規則はクラス名が単数形、パッケージ名が複数形、がよく使われるらしい。

Comments

Name
YT
Datetime
2006-01-05T00:43:56+09:00
Message

度々失礼します。

コンパイラはGNAT GPL 2005ですよね?であれば2005年規格の機能が一部使えますので、-gnat05付けてコンパイルすれば、Act.Do_Action;って書けるはずです。(コンパイラの内部エラーが起きるかもしれませんが…)

コンストラクタに相当するNew_Actionは、function New_Action return Action;のほうがよく見る気がします。関数の形なら宣言と同時に初期化できますし、discriminantsも関数の中で決定できますし。

http://d.hatena.ne.jp/ytqwerty/20051203#p4に書きました分も参照いただければ幸いです。

Name
YT
Datetime
2006-01-05T00:51:21+09:00
Message

ああっ、書き忘れました。

「15週間で作るweblog」、楽しみにしております。

(個人的にWebの世界は未知の塊で、AdaでCGIなんてわけわからんレベルで喜んでる素人なだけに…)

Name
石川
Datetime
2006-01-05T06:49:04+09:00
Message

毎度ありがとうございます。日本ではAda界隈の生きてる情報を提供してくださるのはYTさんぐらいですので、ホントに助かっています。

実は、コンパイラはGNAT@gcc(でいいんだよね)を使ってます。GNAT 3.4.4(gccのバージョン?)らしいです。GPL 2005のほうもGNATだったりして、名前が分かりにくいのが困りますね。

せめてgcc4をつかえよ、という話なんですが、CentOSのgccは3.4.4が標準だったりして、微妙に踏み出せない状況です。yumでgcc4を探したら、gcc c++などは見つかったのですが、Ada関連はまだ用意されていないようです。自力で入れてもいいのですが、管理が面倒なのでとりあえずは95で基礎を学ぼうかな、と考えてます。etchがstableになったらDebianにしようかな。

OOPについてなのですが、Action'Classの使い方でかなり悩んでます。詳細は次の記事に書きたいと思いますが、もしよろしければお知恵を貸していただけたらと思います。

ドット記法が使えれば解決しそうな気もするのですが。

「15週間で作るweblog」はネタですので、ちょっと無理かもしれません。Ruby on Railsだと15分で作れてしまうらしいので、対抗してみたのですが(笑)

でも、そのうちweb関係のプログラムも書くことになると思うので、何か有用そうな情報があったらガンガン乗せていくつもりです。

Name
旋光の名無し
Datetime
2006-02-21T12:44:19+09:00
Message

同じ所悩んでる方を見つけたw

私は、S'Classが「Sから派生されたクラス一般」を表していると解釈しているので、手続き・関数の引数にしか使ってないです。

他にも使えそうなんですが、、、

それと、関係ない、しかも今更ですが、

>>Access values are called "pointers" or "references" in some other languages.

RMの3.10あたりを読むと、accessについて書いてあります。

accessの違いについては、YTさんが以前blogに書かれていたと記憶しています。

「web関係のプログラム」に期待しています。

頑張ってください。

Trackbacks

Trackback Ping URI

http://yudai.arielworks.com/memo/2006/01/01/232242.trackback

末尾に「2 + 6」の計算結果を繋げて下さい。例えば計算結果が「17」の場合、「232242.trackback17」です。これは機械的なトラックバックスパムを防止するための措置です。

Post a comment

Name (optional)
Email address or URI (optional)
Do the math below (required to filter comment spams)
2 + 6 + 4 =
Message (required)
Submit
連絡先、リンク、転載や複製などについては『サイト案内』をご覧ください。Powered by HIMMEL

I ♥ Validator