2011年1月23日日曜日

オブジェクト指向とSQLの親和性の悪さについて…は既に語りつくされていた

先日、会社の人何人かにオブジェクト指向だとSQLって使いにくいよね?って話をしたんですが、みんな反応薄orz

私の説明の仕方が悪かったんだと思って、言いたいことをまとめていたら、全部↓に書いてあったw

はい、もう言うことありませんw 周知の事実だったんですね。無知でした。

でももうちょっと書きたい。

例えばSQL使ったプログラムって↓みたいな感じになると思うんですよ。

[PHPでPDO使った場合の例]
// SQLを書く
$query = "SELECT name, age FROM PersonTable WHERE sex=male;";

// DBのインスタンスにSQLを渡して結果を受け取る
$statement = $database->query($query);

↑みたいにさ、SQLってさ、検索のロジックと戻り値を書くじゃん。それってさ、関数だよね。だから、SQLを渡して検索させるのってさ、データ保持してるオブジェクトに関数ポインタを渡して検索させるのと同じだよね。

でもってそのロジックも戻り値も不定なわけじゃん(選択する列は任意だし、そもそもINSERTUPDATEのように戻り値がないSQLもある)。だからSQL受け取るオブジェクト(のクラス)は、渡された関数ポインタの戻り値がどんなものであって許容しなければならないってことになる(↑の例で言えばquery関数の戻り値は不定(PDOだとPDOStatement型が戻りますが))。オブジェクト指向的に(かどうか知りませんが)、そんなよくわかんない関数、外部に公開したくないですよ。

さらにやっかいなのが、SQLが単なる文字列であること。操作(SELECTINSERT)、選択列、WHERE句等を1文に記述する。しかも操作によって構文が違う。「INSERT INTO ~」とか、INTOいらねーだろって思いますw 英語的に気持ち悪いのかもしれませんが、だったら METHOD=INSERT TARGET=PersonTable; みたいな書き方にして欲しいと、オブジェクト指向的に(かどうか知りませんが)思うわけですよ。

最後に、色々ぐぐってみると、オブジェクト指向派とSQL(というかデータ中心指向?)派では、しばしば宗教論争があるらしく、喧嘩の種になるそうです。

色々書きましたが、私はSQLを否定しているわけではありませんよ。オブジェクト指向との親和性の低さを嘆いているだけです。データベースを、文字列を指定するだけで自由に検索できるなんてスバラシイじゃないですか。

しかし、結局、永続化データをオブジェクト指向で扱いたい場合は、、どうすればいいんだ??(意地でも何でもありのquery関数を公開することはしたくない。。。そして特定のテーブルに特化した処理も書きたくない。。。逃げちゃダメだ逃げちゃダメだ逃げちゃry)

0 件のコメント: