モジュール変数の簡易サンプルとそれをモジュール変数を使わずに作ったバージョン

PHP でちょっとだけオブジェクト指向勉強したおかげなのか、やっとモジュール変数の使い方が分かってきたような気がします。

#module mdl_memo memoContent
#modinit str _memoContent
    memoContent = _memoContent
    return
#modfunc _getMemoContent
    return memoContent
#defcfunc getMemoContent var mdlvar_memo
    _getMemoContent mdlvar_memo
    return refstr
#modfunc setMemoContent str _memoContent
    memoContent = _memoContent
    return
#deffunc newMemo var mdlvar_memo, str _memoContent
    newmod mdlvar_memo, mdl_memo, _memoContent
    return
#deffunc deleteMemo var mdlvar_memo
    delmod mdlvar_memo
    return
#global

newMemo memoA, "NewMemo"
setMemoContent memoA, "こんにちは!メモAです!!"
newMemo memoB, "NewMemo"
mes "メモAの内容:"+getMemoContent( memoA )
setMemoContent memoB, "こんばんは!メモBです!!"
deleteMemo memoA
mes "メモBの内容:"+getMemoContent( memoB )
deleteMemo memoB

これと同じことをモジュール変数なしではしんどいよね。(ただし、メモの中身はモジュール内で管理して、一度に複数のメモを使える仕様、という条件で)

ためしにモジュール変数を使わない版を作ってみました。以下のような感じになります。

#const global TRUE 1
#const global FALSE 0

#module mdl_memo

#const MAX_MEMO 16 // 一度に使用できるメモの数
#const MAX_MEMO_CONTENT_SIZE 64 // メモ内容の文字列長(バイト単位)
#const NOT_EXIST_SERNO -1 // 存在しないメモ番号

#const USEFLAG_NOT_USING FALSE // 使用していないことを表す ( 変数を初期化したときの値でなければならない )
#const USEFLAG_USING TRUE // 使用中であることを表す

//
// モジュールの初期化
#deffunc init@mdl_memo
    sdim memoContentTbl, MAX_MEMO_CONTENT_SIZE, MAX_MEMO // メモの内容のテーブル
     dim memoUseFlagTbl,                        MAX_MEMO // メモが使用中かどうかのテーブル
    return

//
// 新しいメモの作成
#deffunc newMemo var memoSerno, str memoContent
    // 使用できるメモ番号を線形探索して探す
    memoSerno = NOT_EXIST_SERNO
    repeat MAX_MEMO
        if memoUseFlagTbl( cnt ) == USEFLAG_NOT_USING {
            memoSerno = cnt
            break
        }
    loop
    if memoSerno == NOT_EXIST_SERNO : return // 使用できるメモ番号がなかった
    memoContentTbl( memoSerno ) = memoContent
    memoUseFlagTbl( memoSerno ) = USEFLAG_USING
    return

//
// 無効な使用中メモ番号か
#defcfunc IsEnabledUsingMemo@mdl_memo int memoSerno
    if ( memoSerno < 0 ) || ( memoSerno >= MAX_MEMO ) {
        return TRUE
    } else {
        return ( memoUseFlagTbl( memoSerno ) == USEFLAG_NOT_USING )
    }

//
// メモの内容の取得
#defcfunc getMemoContent int memoSerno
    if IsEnabledUsingMemo( memoSerno ) : return ""
    return memoContentTbl( memoSerno )

//
// メモの内容を設定(関数が失敗したかを返す)
#deffunc setMemoContent int memoSerno, str memoContent
    if IsEnabledUsingMemo( memoSerno ) : return TRUE
    memoContentTbl( memoSerno ) = memoContent
    return FALSE

//
// メモを削除(関数が失敗したかを返す)
#deffunc deleteMemo int memoSerno
    if IsEnabledUsingMemo( memoSerno ) : return TRUE
    memoUseFlagTbl( memoSerno ) = USEFLAG_NOT_USING
    return FALSE

#global
init@mdl_memo

このようにすごく長くなってしまいます。やってられませんね。しかも、使用できる数を決められているので、それ以上使うことが出来ないし、そんなに使わない場合はメモリの無駄使いになっちゃいます。それに、配列のインデックスをハンドル代わりにしているので色々と危険性も出るような気がします。

でも、これと似たようなスクリを以前に何個か作った記憶が...。

てか、ローワーキャメルケースとアンダースコア区切りが混ざっててきたないなぁ。どっちかに統一しないと。

インフォメーション

公開日時
2007年9月15日 午後6時4分0秒
最終更新日時
2007年9月17日 午後2時48分0秒
カテゴリ
HSP