DS2のパッケージにおけるコンストラクタの概念の話

まずDS2のpackageって何って方は忘備録の記事を読んでください。

・DS2プロシジャ入門8:ユーザー定義パッケージ
http://sas-boubi.blogspot.jp/2015/08/ds28.html

DS2のリファレンス(現時点では英語版しかないので辛い)で、packageのところを読んでいると
やたらConstructor(コンストラクタ)っていう単語がでてくる。純粋にSASしか経験してないと、前に紹介したオーバーロードとかもそうだけどオブジェクト指向の用語をいきなりマニュアルで出して、DS2でコードではこうなるからって説明されても、みんな困ると思う。

で、コンストラクタって何かって言うと
「オブジェクト指向の言語において、クラスからオブジェクトを作成した際に、
自動実行されるメソッドで、メンバ変数の初期化などについて行います。」みたいな説明になる。

それをDS2で考えるなら、pakkageからデータステップ内でinstance(インスタンス)を生成するタイミング、つまりは、declareでパッケージに参照名をつけて使えるようにした時点で先に自動実行されるメソッドだと考えればいいはず。

忘備録のサンプルにコンストラクタを加えてみると以下のような感じになる


*** パッケージの作成 ;
proc ds2 libs=work;
   package MYPACK / overwrite=yes;
   dcl double VAR1 ;
       method MYPACK() ;
          put 'NOTE:コンストラクタが実行されたんだよ';
 VAR1=1;
       end;


       method TEST () returns double;
          return VAR1+10;
       end;
       method TEST (double VAR1) returns double;
          return VAR1+10;
       end;

   endpackage;
   run;
quit;


*** パッケージを使う ;
proc ds2 libs=work;
   data _NULL_;
       dcl package MYPACK mp();
       method init();
           dcl double OUTVAR;
           OUTVAR = mp.TEST();
           put '******' OUTVAR '******';     
           OUTVAR = mp.TEST(100);
           put '******' OUTVAR '******';     
       end;
   enddata;
   run;
quit;


結果は以下。










パッケージの作成の部分で
       method MYPACK() ;
          put 'NOTE:コンストラクタが実行されたんだよ';
 VAR1=1;
       end;
     
というコードを追加している。
大事なのは、このメソッドの親になってるパッケージの名前もMYPACKだということ。
つまりパッケージと同じ名前のメソッドを中に入れれば、それがコンストラクタになるということ(のはず)
で、そのコンストラクタの中で、メッセージをputするのと、V1に1という初期値を代入している。

以下、前回紹介したオーバーロードの話で、引数がある場合とない場合、両方についてメソッドを定義する
【参考】
★SASマクロに比べてDS2のメソッドが優れている点★の一つ、オーバーロード(多重定義)が可能なこと
http://sas-tumesas.blogspot.jp/2016/03/sasds2.html

       method TEST () returns double;
          return VAR1+10;
       end;
       method TEST (double VAR1) returns double;
          return VAR1+10;
       end;
     
メソッドにパラメータがあれば+10するし、なければ、その時点のVAR1に+10した値を返すということです。


で、パッケージを使う部分で最初にdcl package MYPACK mp();(これがインスタンスを作るってこと)でコンストラクタが動いて、V1に1がセットされます。
だから、最初のOUTVAR = mp.TEST(); で返ってくる値が11なんですね。

あんまり、うまい説明ではないですが、何か間違ってるところがあれば教えてください。

使い方を見てると、パッケージの構成として、メインの処理を実行するメソッドと、それに必要なパラメータをセットするメソッドを分けて設定しているものが多く、コンストラクタではそのパラメータの初期値をいれているという使い方が一般的のようです。
(次の記事もパッケージ絡みの予定なので、またそこで例示します)

まだ何とも言えませんが、多分、集団開発においても、全員がDS2をきちんと理解さえしていればパッケージを共有して、うまく管理できればマクロより作業効率あがる気がします。
SASマクロは複雑になってくると、展開形を頭の中で描くのがかなり困難になりますが、DS2の場合はトレースしやすい感じがします。ただ、全員がDS2を理解するっていうのがとても大変そう。


あと、少し文句を言わせていただくと、DS2プロシジャのエラーメッセージがわかりにくすぎです。なんでそのコードが駄目なのか
さっぱりわからない。もうちょっと優しく指南して欲しい




0 件のコメント:

コメントを投稿