AtomPubな何かを作ってみよう その1 〜設計編〜

先日(と言っても、もうだいぶ前になりますが…)、RESTful勉強会第6回〜AtomPub編〜に行ってきました。

そうそうたるメンツの集まりにご一緒させて頂いて、非常に貴重な時間を過ごす事ができました。参加された皆様、ありがとうございました。m(_ _)m

ホントはスタッフとして感想の一つでも書くべきだったんでしょうが、ちょっと書きそびれてしまったので省略。(^^;ゞ

勉強会の後、すっかり"AtomPubウマー(゚Д゚)"状態になって、色々と勉強しつつちょこちょこと作り始めています。

AtomPubで作ると言うと、大抵は「ブログサービスを作ってみよう」から始めるのが多いと思うんですが、自分で設計からした方が勉強になるかなと思い、前から暖めていたサービスをAtomPubで作ってみる事にしました。

本当は、ある程度できあがったところで、「こんなのできましたよ」という見せ方にしたかったんですが、途中、色々と悩むところも多くてなかなか進まないので、「それなら過程も公開しちゃえ!」という事で、設計のところから公開しながら作っていってみようかと思います。

何を作るの?

今回ネタにするのは、「プログラマなら多少なりとも悩む事があるであろう、変数名やらクラス名やらの命名に関して、みんなで共有しよう」というようなサービスです。要は「こういう意味の言葉を表すのに、こういうIDを付けたよ」というのを、みんなでどんどん投稿していって、それを検索できるようにするものです。

リソース設計をしてみよう

という事で、まずはリソースの設計を考えます。色々と悩んだんですが、以下のような5つのリソースを基本にする事にしました。

/meanings
命名される単語のリソース。(以降、文中では"意味語"と表現する。) 例:「作成する」
/meanings/{単語}/namedwords
命名した言葉のリソース。(以降、文中では"名付け語"と表現する。) 例:「create」「make」
/meanings/{単語}/comments
命名される単語に対するコメントのリソース。
/meanings/{単語}/namedwords/{単語}/comments
命名した言葉に対するコメントのリソース。
/meanings/{単語}/namedwords/{単語}/stars
命名した言葉に対するスターのリソース。

それぞれが全てAtomPubのコレクションリソースとなる事を想定しています。

ただ単に単語をポイポイ放り込んでいくだけなのもなんなので、「この訳はおかしくね?」とか「こういう場合はこうだよね」とか議論できるようにする為に、コメントのリソースも作っておくようにしました。

また、スターのリソースを作っておくのは、"GET /meanings/{単語}/namedwords"をした時に、人気のある単語が上位に来るようにする為、何らかの人気の指標を持たせたかったからです。

悩みどころ

よくあるブログをサンプルにしたものだと、今回の設計でいう"/meanings"みたいなリソースが1つあるだけな感じで、各記事にコメントとかスターがぶら下がるような場合のサンプルは全然見つける事ができなくて、どういうリソース設計にすべきなのか悩みました。実際、この設計が妥当なのかどうかまだ測りかねています…。

また、この設計の場合、サービス文書をどうするかというのも悩みどころなんですが、たけまるさんの記事を参考にさせて頂き、エントリにサービス文書を埋め込む方式にしようかなと思っています。

次回は?

次回は、実装編という事で、まずは"/meanings"のリソースをRailsで実装するところをやってみたいと思います。