読者です 読者をやめる 読者になる 読者になる

O/R Mapper

O/R Mapper嫌いっていうひとは (特に) Perl畑の人に多い気がする。Rubyではあまり見かけない。O/R Mapperが好きっていう人の声が大きいだけかもしれないけど。

O/R MapperはDBレイヤとアプリケーション・レイヤでデータの構造を一致させる (インピーダンス・マッチ) 役割とクエリ言語 (SQLとか) の内部DSLを提供する役割があるとおもう。
恐らくO/R Mapperの言葉が指す意味を考えると、前者だけが本来の役割であって、後者は切り離せない (と考えられた) からくっついてきたのではないかな。

前者に対する批判はまあ、わかる。オブジェクトを大量に生成するコストとか。いや、しかし、そもそもPlain Oldなオブジェクトとしてdeflateされたとしても、数億とかっていうデータを一度にdeflateすればいくらなんでもメモリを食うし、ページングや遅延評価 (RubyActiveRecordだとfind_eachとかある) を考えなきゃいけないし、それはO/R Mapperがどうの、っていう以前の話だとおもう。

後者に対する批判ははっきりと目にしたことはないけど、まあ (内部、外部に関わらず) DSL嫌いな人は一定数いるし、それなりに批判の芽もあるだろうとおもう。
しかし、クエリ言語をアプリケーション・コードに埋め込むのは気が狂っているとおもう。
ほとんどの場合で文字列として埋め込まれるので構文チェックは不可能だし、アプリケーションを記述している言語と一致しないから、アプリケーション・コードの言語からクエリ言語へと脳のコンテキストを変えなきゃいけなくてストレスフルだとおもう。

Ruby界隈に限っていえば主要なRDBMSに対するO/R Mapper (ActiveRecord, DataMapper, Sequel) はクエリ・オブジェクトを採用していて、遅延評価が採用されていたり、Eager Loadingのためのインターフェースを採用していたり、わりと賢い。