使用mixins直接调用方法

时间:2011-03-18 14:08:15

标签: ruby

我想知道何时是使用mixins与直接调用方法的最佳时间。

例如,考虑HTTParty。在其中一个例子https://github.com/jnunemaker/httparty/blob/master/examples/basic.rb

您可以使用HTTParty.get('http://twitter.com/statuses/public_timeline.json')或者您可以创建一个包含HTTParty的类,然后像调用HTTParty本身一样使用它。

与我创造这样的事情有什么不同:

class Partay
  @base_uri = 'http://localhost:3000'
  def self.post(endpoint, options)
    HTTParty.post(@base_uri + endpoint, options)
  end
end

与给定的例子相比:

class Partay
  include HTTParty
  base_uri 'http://localhost:3000'
end

是的,在这样一个简单的例子中,或许使用include会节省更多的字符,但我想在一个更复杂的类上它并没有真正有所作为。

一些澄清性问题: 这与组合与聚合参数有关吗?有关于此的任何设计或架构最佳实践吗?我应该将mixins视为某种继承并将它们用作这样的继承(如果它是一种关系则继承,如果它是一种关系则是组合,等等)?如果打算这样做,我应该只混合一个模块(因为文档说它需要你的某些方法,比如Enumerable),或者这样做是不错的做法?使用mixin意味着模块和我的班级之间的联系更紧密(一般来说它是相对好还是坏)?

1 个答案:

答案 0 :(得分:3)

在给定的示例中,除了语法对mixin更友好之外没有太大区别,并且可能成为稍后可以使用的DSL。

更一般地说,mixins允许你在不同的类中使用这些相同的函数而不重复自己,并且不扩展另一个类(例如,mixin是一种解决ruby不允许多重继承的事实)。这有利于重复使用,并转向红宝石用户亲爱的DRY哲学。由于ruby是duck-typed,因此mixins允许您在没有继承的情况下充分利用多态性。

mixins的另一大优势是可以在运行时添加它们,这意味着您可以“动态”地向类添加行为。

更新:我个人更喜欢将模块用作mixins,而不是调用它上面的方法,因为这些方法成为了类的一部分,这意味着它们可以访问类的其他成员。然而,我不愿意称之为 is-a 关系,尽管这就是它在实践中的意义。正如“有根据的Rubyist”所说,类模型实体或事物(类名往往是名词),模块封装属性或特征(模块名称往往是形容词)。