私はRESTAPIのRubyバインディングに取り組んでおり、その一部として慣用的なRubyと見なされるものに苦労しています。
簡単な例で説明すると、APIによって表されるリソースはツリー構造を形成します。
root
/\
/ \
/ \
group group
/ /\
/ / \
/ / \
project project project
子の新しいインスタンスを作成するには、その親の知識が必要です。たとえば、新しいグループを作成するには、ルートからグループを作成するためのURIを取得できるように、ルートに関する知識が必要です。
私は読み取りアクセスにかなり満足しています:
api = Api.new(...)
api.groups # An array of all groups
api.groups.select(...).projects # An array of all a group's projects
それは私が確信していない新しいリソースを作成しています。
配列サブクラスにcreateメソッドを設定することを検討しました。
group = api.groups.create("group-name")
project = group.projects.create("project-name")
親をコンストラクター引数として、型を直接インスタンス化します。
group = Group.new(api, "project-name")
project = Project.new(group, "project-name")
親にメソッドを作成します。
group = api.create_group("group-name")
project = group.create_project("project-name")
上記の3つのアプローチのうち、私は最初のアプローチを好みます。それは簡潔であり、作成を連鎖させることができるからです。3番目のオプションも同様ですが、正しくないと感じます。RESTAPIに関しては、グループの作成を許可するのはグループリソースであるため、作成が間違ったレベルで行われています。とはいえ、私は経験豊富なRuby開発者ではありません。何よりもまず、RubyAPIがRESTAPIのモデルと完全に一致しない場合でも、RubyAPIをRuby開発者にとって慣用的なものにしたいと考えています。