如何“继承”Ruby模块以创建另一个模块?

时间:2013-11-25 23:12:33

标签: ruby api inheritance module

我一直在研究一些第三方产品数据库API的Ruby包装器。

API是REST-ish,具有产品,类别,公司,事件等模型,API端点如/api/Product.getInfo

我的方法是使用API​​调用包装器和方便的方法为这些API模型创建相应的Ruby类。 所有这些模型类共享相同的父类Base,它抽象API调用并具有其他共同特征。

theese API模型之间有很多相似之处。例如,可以标记产品,公司和事件模型,因此有一组用于标记的API调用,例如createTagdeleteTaggetTags,以及抽象标记功能,我创建了Taggable模块并将其包含在这三个模型中。

现在问题是,这个“审核”功能有两个主要API调用 - createReviewgetReviews,在产品,事件,公司和其他一些模型之间共享(为简单起见省略) );但是,只有产品和事件模型支持createRiviewgetReviews,其余只支持getReviews

然后我认为有两个模块很好 - ReviewableWithReviews前者(读/写)“继承”后者(只读),但显然,Ruby不支持子模块化。

我现在该怎么办?

  1. 我应该制作只写版本而不是读/写版本(即Reviewable)并在产品和事件模型中包含这两个模块吗?
  2. 是否有任何Ruby方式以某种方式“继承”WithReviews(只读)来创建Reviewable(读/写)?
  3. 或者我完全离开了,有更好的方法来解决这类问题???
  4. 另外,您如何看待我的模块命名?

    像,

    • Taggable =模型上的读写标签
    • 可审核=与上述评论相同
    • WithReviews = READ-ONLY审查功能

    我认为前两个听起来很好,但有没有更好的方法或约定命名只读版本? 如果我必须创建一个模块命名,你有什么建议吗?

    谢谢!

    SAKI = D

2 个答案:

答案 0 :(得分:1)

您可以在模块Reviewable中包含模块WithReviews。

module WithReviews
  def getReviews;end
end
module Reviewable
  include WithReviews
  def createReview;end
end

答案 1 :(得分:0)

理解你的问题并不是很简单。但是,这里有一些普遍性

您可以在模块内创建模块。所以写这个是可能的

module A
   module B
   ...
   end
end

顺便说一句,你可以在其他人中使用includeextend个模块。两者之间的区别在于,第一种是传递实例方法,第二种是方法。您可以查看此doc