Download - リソースモデリングパターンの提案 #sendagayarb
![Page 1: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/1.jpg)
リソースモデリングパターンの提案
@tkawa
2012.7.23 RailsにおけるRESTfulなURL設計勉強会Sendagaya.rb #12
![Page 2: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/2.jpg)
@tkawa川村 徹
RESTとかRailsとか書いてるブログ
http://d.hatena.ne.jp/tkawa/
うつの予防と回復Web認知行動療法
U2plus http://u2plus.jp/
![Page 3: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/3.jpg)
• 例えば、URLの階層構造について、どれを選択する?
• /users , /user/{id}
• /users/user/{id}
• /users/{id}
• /users/user-{id}
• さらに、HTTPメソッドとの対応はどうする?
URL設計(リソース設計)いろんな選択肢がある
くわしくは http://d.hatena.ne.jp/tkawa/20120103/p1
![Page 4: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/4.jpg)
• URLの構造も、HTTPメソッドとの対応もこれだけで決まる
• リソース設計の「パターン」を提供している• ベストプラクティス
RailsだとHoge::Application.routes.draw do resources :usersend
![Page 5: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/5.jpg)
「リソースモデリングパターン」
• どのパターンかを判断するだけで、既存のGood Practiceが適用できる
• もっとあるはず!
• 名前をつけて呼べるようにしたい
• (できれば)Railsで簡単に書けるようにしたい
![Page 6: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/6.jpg)
まず、リソースを分類してみた
![Page 7: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/7.jpg)
リソース大分類• コレクションリソース• メンバーリソース• 単数(Singular, Singleton)リソース• 補助リソース• アルゴリズムリソース• 静的リソース• ルートリソース• その他…
![Page 8: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/8.jpg)
コレクションリソースメンバーリソース
• 同じ種類のデータのまとまり→コレクションリソースその中の個別のデータ→メンバーリソース
• コレクション名に“/”でIDをつなげることで階層構造とする
/{name} /{name}/{id}
![Page 9: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/9.jpg)
• Railsの “resources”
• 2種類のリソースをまとめて、使用するメソッドを限定
• コレクションリソースがFactoryとなる
GET POST PUT DELETE
/{name} index create - -
/{name}/{id} show - update destroy
Collection & Member Resource パターン
![Page 10: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/10.jpg)
単数(Singular, Singleton)
リソース
• ただ1つしかないリソース
• あるリソースに対して1つしかない
• セッションに対して1つしかない
• /users/123/profile
/{name}
![Page 11: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/11.jpg)
Singular(Singleton) Resource パターン
• Railsの “resource”
GET POST PUT DELETE
/{name} show create update destroy
![Page 12: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/12.jpg)
補助リソース
• 主にHTMLのUIのために必要となる、データの中身には関係のないリソース
• GETのみ
(命名規則を考え直すべきでは? _new とか)
/{name}/new
/{name}/{id}/preview
![Page 13: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/13.jpg)
アルゴリズムリソース
• クエリパラメータによって、何らかのアルゴリズムを実行した結果のリソース
• 基本的にGETのみ
/search?q={query}
/conversion?from=USD&to=JPY&amount=100
![Page 14: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/14.jpg)
静的リソース
• 画像とかJavaScriptとかCSSとか
• Railsや、Webアプリケーションフレームワーク特有の分類かもしれない
• GETのみ
![Page 15: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/15.jpg)
ルートリソース
• 他のリソースへのナビゲーション的役割(GETのみ)
• もしくは、サービスの主となるリソース(コレクションリソースが多い)の別名
/
![Page 16: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/16.jpg)
もう少し具体的なパターンを探してみた
![Page 17: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/17.jpg)
Filtered Collectionパターン
• コレクションリソース+アルゴリズムリソース
• コレクションリソースから、クエリパラメータの値を条件として絞り込む
• meta_search (gem)などが実装
/users?role=admin
![Page 18: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/18.jpg)
Filtered Collectionパターン
• ページネーション
• kaminari (gem)などが実装
/users?page=2
/users?since_id=123
![Page 19: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/19.jpg)
Filtered Subresourceパターン
• 汎用的なら、子リソースとしても表現できる• コレクションリソースの一種• IDと衝突注意
(実はこれをすんなり resources で書く手段がないが、GETのみなのでいいのかも)
/users/admin
![Page 20: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/20.jpg)
Multi-member Resource パターン
• メンバーリソースの派生形
• 複数のメンバーリソースを一度に取得、更新、削除するために提供
/users/123,124
/users/123-133
![Page 21: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/21.jpg)
Partial Resourceパターン
• リソースの部分取得、部分更新のために一部の属性(フィールド)だけを提供する
/users/123/name,email
/users/123?fields=name,emailor
![Page 22: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/22.jpg)
Transaction Resource パターン
• 主にCollection & Member Resource パターンを用いたトランザクションの実装
• ウィザードなどにも適用可能
POST /transactionsPUT /transactions/123PUT /transactions/123/committed
![Page 23: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/23.jpg)
Session Resourceパターン
• 認証のセッション自体をリソースととらえる(モデルではないリソースの典型例)
• Railsの認証gemではすでに一般的(Deviseや Sorcery, OmniAuthのドキュメント)
POST /sessionDELETE /session
ログインログアウト
![Page 24: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/24.jpg)
Private Resource (Namespace) パターン
• Singular Resource パターンの特別な場合
• 「自分自身」を指す特別なリソース
• 人によって違うリソースを指すことを明示するため、名前空間を分ける
/my/{resource}
![Page 25: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/25.jpg)
意見ください• ほんとうに役立つか
• これはパターンと言えるのか
• だいぶ粒度がバラバラ
• 名前の付け方(パターンは名前重要)
• まとめてどこかに書きたい! 本?
![Page 26: リソースモデリングパターンの提案 #sendagayarb](https://reader034.vdocuments.net/reader034/viewer/2022052303/556a5cf1d8b42a7a138b511c/html5/thumbnails/26.jpg)
• Collection & Member Resource パターン
• Singular(Singleton) Resource パターン
• Filtered Collection パターン
• Filtered Subresource パターン
• Multi-member Resource パターン
• Partial Resource パターン
• Transaction Resource パターン
• Session Resource パターン
• Private Resource (Namespace) パターン