gpt4 book ai didi

ruby - 使用混合与直接调用方法

转载 作者:数据小太阳 更新时间:2023-10-29 08:01:51 25 4
gpt4 key购买 nike

我想知道什么时候是使用 mixin 与直接调用方法的最佳时机。

例如,考虑 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 可能会节省更多的字符,但我想在一个更复杂的类中它并没有真正的区别。

几个需要说明的问题:这与组合与聚合的争论有关吗?是否有任何关于此的设计或架构最佳实践?我是否应该将 mixin 视为某种继承并按此使用它们(如果它是一种关系,则继承,如果它是一种关系,则组合等)?如果打算这样做,我应该只混合一个模块吗(因为文档说它需要您提供某些方法,例如 Enumerable),或者这样做只是一种好习惯吗?使用 mixin 是否意味着模块和我的类之间的耦合更紧密(一般来说是好是坏)?

最佳答案

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

更一般地说,mixins 允许您在不同的类中使用这些相同的函数,而无需重复自己,也无需扩展另一个类(例如,mixins 是解决 ruby​​ 不允许多重继承这一事实的一种方法)。这有利于重用,并符合 ruby​​ 用户所珍视的 DRY 理念。由于 ruby​​ 是鸭子类型的,mixins 允许您充分利用多态性而无需继承。

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

更新:我个人更喜欢将模块用作混入,而不是在其上调用方法,因为这些方法随后会成为您的类的一部分,这意味着它们可以访问该类的其他成员。然而,我不愿意将其称为是一种关系,尽管实际上就是这样。正如“Well-Grounded Rubyist”所说,类为实体或事物建模(类名往往是名词),模块封装属性或特征(模块名往往是形容词)。

关于ruby - 使用混合与直接调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5353150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com