ROA は「究極のオブジェクト指向」?(RESTful本読書会)

5/10 の「RESTful Web Services」の第2回読書会に参加します。
実はキャンセル待ちキューでぶすぶすくすぶっていたところ、1週間前になっても5章を読む担当がまだ決まってないと聞き、「やりますやります」と kunit さんに名乗り出て参加を勝ち取るという裏技を使ったとかなんだとか。


というわけで今せっせと5章を読み込んでいるところ。
最初、5章のタイトル「読み取り専用のリソース指向サービス」を見て、「つまり GET 限定の REST かあ……それなんて Web?(終了)」とか思ってしまったのだが(そして根本的には実際その通り)、細部になかなか味のある記述があるおもしろい章だったりする。
読書会で担当してなかったら斜め読みして終わってたろうから、なかなかいい機会を得たなあ。


せっかくなので、機運というか自分の気分を盛り上げるために5章を読み解いた内容を一部先出ししてみよう。
俎上に載せるのは 5.1 節「リソースの設計」。
ちょっとでも囓ったことがある人なら知っての通り、REST には動詞(メソッド)が6種類しかない。GET, POST, PUT, DELETE, HEAD, OPTIONS の6つだ。
実際には HEAD と OPTIONS は使う機会が限られる(ほとんど無いと言ってもいい)ので、実質は4つ、いわゆる CRUD というやつだ。
一般に要件の分析をし、普通にオブジェクトの設計を行えば、たったそれだけでは当然メソッドが足りるはずがない。どうするか。


5.1 節では3つの方法を紹介している。
1つ目は POST を使って RPC 的に各種メソッドを実装するという従来の Web アプリで行ってきたパターンだ。もちろんその手法は REST ではない。現実的には適材適所でハイブリッドもありだろうと個人的には思っているが、RESTful を歌いたいなら厳しい。


2つ目は REST の範囲内でうまくやりくりする、というもの。例えば記事オブジェクトに「公開する」というメソッドを用意する代わりに、記事オブジェクトが公開状態を有するように表現を設計し、それを PUT することで公開を制御するという方法だ。
RESTful って大上段に構えた割にはやり方がせこい、じゃなかった、なんか貧乏くさい、じゃなかった、とても消極的な手法のように感じられてしまう。それに、この方法では解決できないメソッドもありそうだ。


3つ目は、本書で「動詞を名詞化する」として紹介されている手法だ。
例として、定期的な「コラム」を「読者」が「購読する」場合が上げられている( RSS を購読するといった方が通りがよいだろう)。「購読する」メソッドの引数には読者が想定されるので、上の方法では解決しにくいメソッドの一つにもなっている。
ここでその手法に従って、「購読する」という動詞を「購読」という名詞(オブジェクト)にする。
つまり読者とコラムの関係を表す「購読」リソースを用意するわけだ。そのリソースはこんな URI なのかもしれない。

http://sample.com/subscriptions/columns/(コラム名)/users/(ユーザ名)

この URI に対して状態を PUT することで、純粋 REST の範囲内で購読を制御することが出来るようになる。


別の例として、 SNSの友達申し込みも考えてみよう。
「友達リクエストを送る」という動詞(メソッド) は同じく REST の CRUD に含まれないので、ユーザ間の関係を表す「友達関係」リソースを用意しよう。ユーザ foo からユーザID bar の関係を表すリソースとして、実際に目にしそうな URI で例えばこんな感じはどうだろう。

http://nixi.jp/friend.pl?from=foo&to=bar

同じく、この URI の状態を制御することで友達リクエストが送れるようになるわけだ。


手前味噌だが、実は後者の例は第1回 197X's でやったライトニングトークで紹介したものだ。
そのときは REST について語るつもりは全くなかったので、REST の R の字も出さずに、すでにできあがっている web アプリでもこういう考え方は有用なんですよ〜的にしゃべってみたりした。


話を戻して、誰がどう見てもこの3番目の方法が本書の想定している本命であろう事は一目瞭然。本書ではこの考え方を指して『リソース指向の設計手法は「究極のオブジェクト指向」と呼ぶことが出来る』とか言っちゃってる。
も〜〜そんなこと言うから「REST の R は Radical の R」とか言われるんだよ〜*1


個人的には、それこそ隠れキリシタンよろしく、REST を信奉していることなんかおくびにも出さず、「そこは REST 爆発しろ! って言わないと〜」とか踏み絵を迫られても、「そうだね〜。面白い考え方なんだけど、一部ちょっと過激に感じないでもないかも〜」と同調を拒否しつつも決してボロは見せない。
で家に帰ったら「神様、今日は一つだけいいことをしました。REST の考え方をマンガにしたててプレゼンで喋りました。もちろん自分が RESTian だなんて悟られてません」と最近出た新しい聖典に手を合わせるというのがいいんじゃないかなあと思うんだが。


という(前半の)話のような感じで RESTful 読書会でしゃべります。楽しみ?

*1:ごめん、今俺が言っただけ