Biz/Browser Tips003 class設計について (gooブログBackup)

Tips002で、Formで現在のカーソル位置のオブジェクトを保存しておく方法を書いたが、CV.netではclassとして定義しているものを大きく次の2つのcarファイルにまとめている。
1.classsatoo.car
どのアプリケーションにも共通に使える部品を集めたもの。汎用class。
2.classsatoo.cvnet.car
業務アプリケショーンで共通に使える部品を集めたもの。たとえば区分一覧や照会ボタンなど。色・フォントの統一や、操作の統一のために使用。

たとえば前回のFormのたぐいはclasssatoo.car内では次のように定義されている。(長くなるので部分的に抜粋)

class SatooSelForm extends Form{
Array cur_pos; /* カーソル位置のオブジェクトcur_pos[0] .*/
Array err_pos; /* エラーしたオブジェクトerr_pos[0] .*/
Function append2(additem) {
cur_pos[0]=additem;
if (ClassSatoo.SysTest == 1){
DebugMessage("-- "+str(sysdate(),"HH24:MI:SS")+"(Append2)Obj:"+additem.name+"(Class:"+additem.classname+")");
if (!(additem instanceof Flexview)){
DebugMessage(":"+str(additem.Value));
}
DebugMessage("n");
}
}
...........................
Function OnGetFocus(e){
if (FindChild("append2")!= null){
append2(e.from);
}
}
Function OnKeyDown( e ) { /* キー処理とe.key2の追加 .*/
...........................
if (classsatoo.SysTest == 1){
DebugMessage("e.from=",e.from.name,",value=",e.from.value,"n");
}
/* ボタン系はReturnキーでも実行可 */
if(e.key =="RETURN"){
try{
if(cur_pos[0] instanceof Button){
if (cur_pos[0].FindChild("OnTouch")!= null){
cur_pos[0].OnTouch(e);
}
}
...........................
else if(cur_pos[0] instanceof SatooFlexView){
if (cur_pos[0].FindChild("OnZoom")!= null){
cur_pos[0].OnZoom(e);
}
}
...........................
}
}


このSatooSelFormの中では、Form中に含まれるGUI部品の名前は一切使っていない。Enterキーで複数のボタンのOnTouch処理を走らせたい場合、初心者は最初それぞれのButtonにEnterキーを割り付けようとする。が、それではうまく動かないのである!AltKeyプロパティでは無理
故にFormのKeyDownイベントでReturnキーを捕捉し、カーソルが止まっているのがButtonであればOnTouchを実行する。
こうすることで、Buttonのオブジェクト定義に何もしなくとも、EnterでボタンのOnTouchが走るようになる
しかも、ReturnではなくたとえばF12キーにしたければ、if(e.key=="F12")と変更するだけで、全部変わるようになっている。
DebugMessageを入れているのはここに記述すると全てのところで有効なのでデバッグが楽になるため。
何気なく cur_pos[0].FindChild("OnTouch")などとコードを書いているが、FindChildでは実はオブジェクトだけではなく関数も検索できるのでこれで正しい。
これは一例だが、こんな感じで共通の汎用Classを定義していく。
classsatoo.cvnet.carでは、業務アプリケーションで共通の部品を定義するので、たとえば、

class CvnetButton extends Button { /* ボタン(サイズ正規化) */
Width = 90;
Height = 24;
}
class CvnetBtList extends CvnetButton { /* マスタ一覧用ボタン */
Width = 30;
Height = 20;
Title ="<<";
ToolTip = "一覧取得";
SkipTabFocus = $TRUE;
Array ret_pos;
Function OnTouch(e,v_obj, v_mstname, v_para2){
...........................
}
...........................
}

と、サイズやアプリケーション依存の処理を定義する。
これらのclass化されたGUI,非GUI部品を使うことで個々のCRSプログラムの生産性ははるかに向上する。
システム自体もDB-アプリサーバ-Bizと三階層なのだが、Biz側、アプリサーバ側内部のつくり方も三階層にすべきであるというのが、CV.netの3Tier in 3Tier の思想
ところで、このBlogに書いてある技術的な内容は、Biz/Browserの開発者にとって公開していったほうがいいだろうというようなものを書いていくので、どんどんマネしていって構いません!さすがにソース全部は出せませんが、できるだけオープンにしていきます。逆にもっとよいやり方があれば教えてください。
そしていままでやってたやり方よりいいやり方があれば、ソース全部書き直すべきです。
CV.netはBiz V4になって2004年1月ぐらいにclass化し、2004年7月に一度全面変更しています。V4からXEに変更されたときもFlexView関係の部分など変更しました。
変化をおそれずどんどん進化しないとよいシステムはできませんし、またエンジニアも成長しません。