gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

メモ

おらいりぃ先生のプレファクタリングって本見て…ふとひらめいたので、めも。
ADT、SSSPHPの基本仕様になんとか突っ込もう。
ADTとは、abstract data type。抽象データ型って訳されてます。
非常にOOP的にグッドな発想なので…これは仕様に取り入れてみたい。
そうだなぁ。型宣言としては…


// 抽象データ型宣言
// ものを「カウント」する単位
ADT count {
// 正の値のみのint値
unsigned int;
}

// 金額
ADT currency {
// 正負を持つlonglong int値
signed longlong;
}

// e-mailアドレス:チェック付き
ADT email {
// 256文字以内の文字列。
string(256);
// チェック用関数の指定
check { return is::email(this) }
// または
check {
$obj = new is;
$ret = $obj->email(this);
return $ret;
}
// 基本的にreturnされた値が入る。対象変数に代入されたときに常に走るcheck関数
// エラーで突っ返す(nullとか空文字とか)か例外投げるかは自由とする
}

// で、使い方
for(count i = 0; i < xx; i ++) {
}
email user_address;
try {
user_address = cgi_request->find('email');
} catch (...) {
}

こんな感じ?
基本的にはdefineでやってることと大差ないんだろうけど。チェック用の関数組み込めるあたりが新しいかと。
それとも、もうちょっとこってりさせて「ADTは、adtベースクラスからの派生クラス」にして…かなぁ?
そうすると、例えば「金額なら、出力時に原則として"三桁ごとに,を入れる"とかが容易に実装できるし。生データ欲しいなら「get_row_data()」とかで片付くしなぁ。
そうなると、operator演算子のオーバライド実装したくなるなぁ(苦笑
…とはいえ。多分最低限必須なのは

  • 値が入ってきたときの挙動:check
  • 値を使う時の挙動:raw_out
  • 値を「出力」用に使うときの挙動:print_out

くらいなのかなぁ?
これくらいだと…

  • user_address = cgi_request->find('email');
    • 変数が左辺にあるのでcheck走らせて代入
  • string swk = user_address;
    • 変数が右辺、左辺も変数なので、raw_out
  • printf("%s \n", email);
    • 出力関数なので print_outを使う
  • printf("%s \n", email.raw_out);
    • 明示的な指定があるのでraw_outのまま出力:非推奨、かなぁ?

とかって感じで自動化もあり。…とはいえ、自動化って弊害多いしなぁ。いらないかなぁ???


あとは、この辺のADTの基本セットを言語のoptionとして添付してもいいかなぁ。
相変わらずなんだけど、

  • 基本シンプル
  • 任意に付け外しできるoptionはリッチにこってりと

が基本方針になりそう。


………で。いつのまにSSSPHPの実装が「夢という素晴らしい上空」から「現実という泥臭い足元」に落ちてきたんだろう?