Entries

スポンサーサイト

カテゴリ:スポンサー広告
更新日:--------
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

RESTって、何か好きじゃない - UpdateとCreateは分けないといけないのか?

カテゴリ:システム考
タグ: REST  CRUD 
更新日:2012-12-24
RESTって、何か好きじゃないんだよねぇ。
とりあえず、疑問点を書いておこうと思う。
誰か、好きにさせてください。

その前に、まずCRUDの話。

> CRUD - Wikipedia
CRUD(クラッド)とは、ほとんど全てのコンピュータソフトウェアが持つ永続性の4つの基本機能のイニシャルを並べた用語。その4つとは、Create(生成)、Read(読み取り)、Update(更新)、Delete(削除)である。ユーザインタフェースが備えるべき機能(情報の参照/検索/更新)を指す用語としても使われる
最後の文で、ユーザーインタフェースのことに言及しているのは、CRUDと言えば、普通はデータベースの機能のことだからだろう。CRUDという用語は、一般にはDB設計で見かける。SQLでは、それぞれINSERT、SELECT、UPDATE、DELETEに一対一対応するから、特に問題はない。

問題は、ユーザーインタフェース。特に、生成と更新において、データベースと連携する部分だ。(Wikipediaでは、この後、データベースアプリケーションとユーザーインタフェースに分けて説明してある。似て非なるもの、という認識はあるんだろうな。)

そうだなぁ。単純にマスタ更新画面なんかを考えてみる。

入力条件で検索して、一覧を表示。一覧から一つを選んで(Read)、
編集画面で内容を変更して保存(Update)。
登録ボタンを押して、新規登録画面で内容を入力して保存(Create)。
一覧からひとつ選んで削除(Delete)。

こんな感じ?
ReadとDeleteは、別にいい。問題は、UpdateとCreate。

ここでは、編集画面と新規登録画面と書いたけど、ほとんどの場合、この画面は共通になる。つまり、一覧から選んで呼び出す画面と、登録ボタンで呼び出す画面は、通常同じ画面になる。その場合、CRUDで考えると、保存の時に困ることになる。その保存は、Updateなのか、Createなのか。

最近は、自動保存なんて機能も標準的になってきてるから、ユーザーから見た場合、保存時に区別は無い。つまり、内部的に区別をつけていることになる。今、backbone.js を試しているところだけど、これは標準の永続化としてRESTを想定しているけれど、Modelにはsaveメソッドがあって、内部的にcreateとupdateを切り替えている。そりゃ、そうなるよね。

となればだ。そもそもユーザーインタフェースのCRUDと、データベースのCRUDが同一視されてしまうことに問題がある。これは全く別物なのに、CRUDという対応付けができるから、つい一対一対応と思ってしまうのだ。ユーザーインタフェースは、CRUDの4つの機能じゃない。保存(Save)を加えた、CRUDSという5つの機能なんじゃないのか?

で、REST

CRUDのそれぞれの対応をPOST、GET、PUT、DELETEに一対一対応させる。この結果、WebAPIは、データベースのCRUDと一対一対応になる。例えばGAE用のappengine-rest-serverというソフトがあるけど、データストアのCRUDをRESTで操作できるようになる。これは単純な場合には、利点もあるだろう。だけど、Webは基本は三層構造だ。Web APIとデータベースの操作が一対一に対応してしまったら、アプリケーションサーバーになんの意味がある?これじゃ、ただのサーバークライアントの二層構造でしかない。

三層構造で考えると、Web APIは、ユーザーインタフェース側のインタフェース(ブラウザ-アプリケーションサーバー間)になる。なら、そのCRUDは、ユーザーインタフェースに近くないといけないはずだ。

ユーザーインタフェースにおいて、確かに登録と編集は違う。でも、それは呼び出し方が違うだけだから、Ajaxの今では、ブラウザ側で対処すればいい話だ。Web APIを呼び出すのは保存時になる。ところが、RESTでは、ここでCreateかUpdateかを選ばないといけなくなる。

それは、必要なことなんだろうか?
あるいは、RESTに対する理解が不足しているのだろうか?

RESTの解説で、PUTとPOST、更新と生成に混乱が見られたのは、このあたりの整理が不十分だったのではないのか?

RESTのステートレスってのも良くわからない。APIをステートレスにしちゃったから、ブラウザ側でCreateかUpdateの区別が、つまりステートが必要になっちゃったようにも見える。

というわけで、腑に落ちなくて、RESTって好きじゃない。
誰か好きにさせてくれると嬉しいな。

> CRUDはRESTにとって良くないのか? - InfoQ
> CRUD型RESTの欠点と、読み取り可能なURI - winplusの日記
> Railsの誤解:CRUDはRESTじゃない! - 杉風呂2.0 - A Lifelog -


スポンサーサイト

Appendix

プロフィール

いむら@fintopo いむら@fintopo

フリーのシステムエンジニア兼プログラマです。趣味はガーデニングとカメラ。2017年4月にα7IIを買いました。フルサイズ一眼初心者です。

このページのQRコード

季節暦

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。