ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

フレームワーク「MagicWeapon」コミュの[思考実験]clump系の考察

  • mixiチェック
  • このエントリーをはてなブックマークに追加
clumpの根本にある哲学
「ある意味のあるデータ」を1塊で扱いたい。

インタフェースとしてcgi formとDBが想定できるが、XMLとか普通のtextとかcsvとか(1行目で一応カラム名指定できるからねぇ)いろいろありえる。
確定しているのは、データとしてmap(name=valueでかつnameが一意であること)。
multimapの想定は現状していない(便利かもしれないが概念が面倒になりそうなのでとりあえず考慮しない。シンプルな概念が出てきたら考慮に入れる)。

ここからまず
basis_clump
が出来上がる。basisは「基礎」とか「よりどころ」とか。
中身はぶっちゃけ「構造体+アクセッサ」。ただ、中の要素は外(method or 設定ファイル)で動的に変えられる感じ。

次。
basis_clumpに
・cgi用のインタフェース(cgi_requestインスタンス使用)
・DB用のインタフェース(sql_utilとMWのdbハンドルを用いたDBアクセス周りを使用)
をくっつけて、ここが
data_clump
になる。

本音をいえば。
cgiだけのとDBだけのとを作って多重継承させるのが一番「正しい」とおもってるのだが。
一つはMWが基本「Web用フレームワーク」って事と。
その場合、inとoutはペアだろうとおもうので、ここはくっつける。

つぎ。
入力値のvalidateは当然ほしいので。各値に対して
・validateをする
・あえてvalidateを回避する
・実行キーに対して自動でトークンを発行する
機能をくっつけたものを作る。これが
validate_clump
になる。
トークン発行をここに入れるかは微妙なのだが、とりあえず。

ちょっと寄り道。
基本、この辺は「テーブル設計」に密接につながるので。
・DB仕様書作る:tsvかcsv。これならExcelに書いたうえでコピペできる
・tool通すと設定ファイル&SQL create文が生成できる
と楽。
で、設計のほうにvalidate項目書いてりゃいろいろと便利でしょ?

閑話休題
次に出てくるのは「validate_clumpを配列で持ちたい」っていう要求。
とりあえず…map(hash配列)かmultimapにでも持ってて。vector(配列)でもいいし。
名前として data_chunk とか考えてたんだけどね。
iterator実装したいしとか考えた瞬間、普通にvalidate_clump+vectorで間に合うでしょ? とかおもった。

そんでもってこの辺から少し応用編。
まず。「あるテーブルから一定の条件に従ったデータを取ってきたい」要求。まぁよくある。
基本は
table_clump
クラス作って、
table_clump->push_where(検索条件);
table_clump->push_where(検索条件);
vector<validate_clump> = table_clump->find();
とかってイメージなんだろうけど。
このやり方だと「メモリが怖い」可能性がある。
ので、もう一つの方法として
table_clump->push_where(検索条件);
table_clump->push_where(検索条件);
table_clump->do();
while(table_clump->fetch()) {
 validate_clump = table_clump->get();
}
ってのもあり。
最大の頭痛は「検索条件ってどうやって指定すんべ」?
とりあえず使うものだけサクっとつくりますか。
考えてるのは



<=
>=
LIKE
日付系の一致&範囲
あと、検索条件というには微妙だけど
LIMIT
ORDER BY
は入れる。
GROUP BYとHAVINGは、実は現状考慮外。でもまぁこれは入れてもいいのかな?
JOINは基本嫌いなので未考慮。
そうそう。別ラインで多分
int = table_clump->count(カラム名);
ってのは欲しいんだろうなぁ。

もう一つ。ある意味最大級に危険な物体w
いち。
Web画面遷移の1line(概念説明は省略。興味あったら突っ込んでください)において。
通常
・DBとcgi formの要素は紐づいてる
ことがほとんどです。特に「入力/編集/削除」系の、いわゆる入力lineについて。
なので。まずline設計書に
・こんな要素があってcgiぢゃこ〜ゆ〜名前でそれはDBのここに紐づいてるよ
ってのを書くですが。
そのまま設定ファイルを取り込むと、多分、怖いことができます。
イメージ的テストコード。

ーー
// 新規の確認画面用
// 今回のメインになるクラスのインスタンスげと
$obj = $this->get_XXX('line名');

// 新規作成ならこっち:PKとかトークナイザ自動発行
$obj->insert();

// 新規登録とか編集とかのvalidate チェック
if (false === $obj->is_validate()) {
$teml_name='エラー用のテンプレートファイル名'
} else {
// あとはテンポラリ(セッション)にぶち込むなりDBにぶち込むなり
// session ID + line名で格納かな?
$obj->set_to_tmp();
}

// 出力処理〜
$conv = $obj->get_conv();
$conv->conv(ファイル名);

---------------------------------------------
// 今回のメインになるクラスのインスタンスげと
$obj = $this->get_XXX('line名');

// sessionから情報げと
$obj->get_from_tmp();

// 設定
$obj->set_to_db();

// 出力処理〜
$conv = $obj->get_conv();
$conv->conv(ファイル名);


---------------------------------------------
編集系の場合

// まず入力画面
// 今回のメインになるクラスのインスタンスげと
$obj = $this->get_XXX('line名');

// key 設定して
// XXX key情報はresあたりに入ってるってことでひとつ
$obj->set_key();

// 情報げとる
$ret = $obj->get();
if (false === $ret) {
// エラー処理
}

// 出力処理〜
$conv = $obj->get_conv();
$conv->conv(ファイル名);


---------------------------------------------
// editの確認画面用
// 今回のメインになるクラスのインスタンスげと
$obj = $this->get_XXX('line名');

//
$obj->update();

// 新規登録とか編集とかのvalidate チェック
if (false === $obj->is_validate()) {
$teml_name='エラー用のテンプレートファイル名'
} else {
// あとはテンポラリ(セッション)にぶち込むなりDBにぶち込むなり
// session ID + line名で格納かな?
$obj->set_to_tmp();
}

// 出力処理〜
$conv = $obj->get_conv();
$conv->conv(ファイル名);

---------------------------------------------
これでかたづいてしまう。
多分最大級に危険なクラス(笑

同様に検索系についても
・検索情報入力 -> 詳細表示
について、設定ファイルだけでいけるとおもってる。
その辺はまた後ほど。

コメント(1)

ついでに。コンフィグイメージ。

DB項目とvalidate関連と各テーブルのリレーショナルを設定する

[database]
tablename
- column1: char(1-255), is_alph, auto_pk
- column2: int(0-65535), default 20
- column3: datetime, must
- column4: char(-500), is_kana
- column5: equal(database.talbe3.column1)

table2
- column1: char(1-255)is_alph, auto_pk, 紐づけるkey(database.tablename.column1)
- column2: cahr(0-6000)

table3 // コードテーブル
- column1: char(1-255), is_alph, auto_pk
- column2: cahr(0-6000)

----------------------
各lineの「入力(特に編集)時の初期値」及び「データの出力先」を、DBと連携させる
想定:Cookieやセッションには値がないモノとする(セッションはあくまで「line途中の一時格納」)

line1
- id: database.tablename.column1
- age: database.tablename.column2
- barthday: database.tablename.column3
- name: database.tablename.column4
- memo: database.table2.column2
- job: loop(print=database.table3.column2 value=database.table3.column1), database.tablename.column5

その2
default_database(database)
line1: default(tablename)
- id: column1
- age: column2
- barthday: column3
- name: column4
- memo: table2.column2
- job: column5, loop(print=table3.column2 value=table3.column1)

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

フレームワーク「MagicWeapon」 更新情報

フレームワーク「MagicWeapon」のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。