惯用Ruby用于创建表示树中知道其父节点的节点的对象

时间:2012-05-09 11:06:46

标签: ruby api-design idiomatic

我正在为REST API开发一个Ruby绑定,并且正在努力解决那些被认为是惯用Ruby的问题。

为了举例说明,API表示的资源形成了树结构:

           root
            /\
           /  \
          /    \
      group   group    
        /       /\
       /       /  \
      /       /    \
project  project  project

要创建子项的新实例,需要了解其父项。例如,要创建一个新组,它必须具有root权限,以便它可以从根目录中检索用于创建组的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")

在上述三种方法中,我更喜欢第一种方法,因为它简洁,并允许创建链接。第三个选项是类似的,但它感觉不对 - 就REST API而言,创建发生在错误的级别,因为它是允许创建组的组资源。也就是说,我不是一个经验丰富的Ruby开发人员,首先,我希望Ruby API对Ruby开发人员来说是惯用的,即使这意味着它与REST API的模型不完全匹配。

1 个答案:

答案 0 :(得分:0)

我不清楚代码示例和描述是如何与REST相关联的,但我会根据我的理解提供两分钱:

我认为使用这三者的组合是完全有效的。至于什么是惯用的,我会从Rails association methods获取你的线索。

api.groups.create遵循Rails的has_many语法。 api.create_groupgroup.create_project遵循has_one语法。而且我假设,在create / create_association的句法糖之下,你正在使用合成将所有类的引用绑定在一起,所以Group.new(api, "group-name") / {{1}似乎也是完全有效的选项。没有规则说你不能使用这三种方法来达到良好的效果(和Rails一样)。

我建议避免继承Ruby的基类(你提到子类化Array),除非你有充分的理由这样做。只需使用组合物在必要时委托给他们。