OOP in Ada

やっぱり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全体で見れば比較的統一的だし、なかなか良い方法なのかもしれない。

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