0

私は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開発者にとって慣用的なものにしたいと考えています。

4

1 に答える 1

0

提供されたコード サンプルと説明が REST とどのように結びついているかは明確ではありませんが、私が理解していることについて 2 セントを提供します。

3つすべてを組み合わせて使用​​ することは完全に有効だと思います。慣用的なものについては、Rails の関連付けメソッドからヒントを得ます。

api.groups.createRails のhas_many構文に従います。api.create_group構文にgroup.create_project従いhas_oneます。そして、create/の構文糖衣の下で、create_associationコンポジションを使用してすべてのクラスへの参照を結び付けていると想定しているため、Group.new(api, "group-name")/Project.new(group, "project-name")も完全に有効なオプションのように見えます。良い効果を得るために 3 つのアプローチすべてを使用してはならないという規則はありません (Rails は使用します)。

本当に正当な理由がない限り、Ruby の基本クラスのサブクラス化 (配列のサブクラス化について言及しました) は避けることをお勧めします。必要に応じて、構成を使用して委任するだけです。

于 2012-05-09T13:56:15.040 に答える