ruby-on-rails - Rails AntiPatterns 书 - 对组合的质疑

标签 ruby-on-rails composition anti-patterns

我正在阅读 Rails AntiPatterns书,我很喜欢。在某一时刻,作者谈到了组合的优点,并给出了一个示例,其中 Order 类将转换(到其他格式)的责任交给另一个类,称为 OrderConverter>。这些类定义为:

class Order < ActiveRecord::Base
    def converter
        OrderConverter.new(self)
    end
end

class OrderConverter
    attr_reader :order
    def initialize(order)
        @order = order
    end
    def to_xml
        # ...
    end
    def to_json
        # ...
    end
    ...
end

然后作者说:“通过这种方式,您可以在一个单独且易于测试的类中为转换方法提供自己的家。导出订单的 PDF 版本现在只需调用即可以下内容:

@order.converter.to_pdf

对此,我的问题是:

  • 为什么你认为订单对象前面有一个@?它不应该被创建为:

    order = Order.new

然后通过执行以下操作进行转换:

order.converter.to_pdf 
  • 为什么 OrderConverter 中需要 attr_reader :order 行?这样我们就可以从 OrderConverter 对象访问订单?是否需要能够做到 order.converter.to_pdf ?如果没有 attr_reader,我们也可以做到这一点,对吗?

最佳答案

Order 的实例被传递给 initialize 方法并存储为实例变量(使用 @ 语法:@order)。这样,就可以从转换器中的其他方法访问该变量(该变量具有实例范围):

class OrderConverter
  def to_pdf
    @order.items.each do |item|
       # Write the order items to the PDF
    end
  end
end

attr_reader 不是严格必需的,但它是从其他方法访问 Order 对象的便捷方法:

class OrderConverter
  def to_pdf
    order.items.each do |item|
       # Write the order items to the PDF
    end
  end
end

它还允许您从任何转换器实例中获取对订单的引用:

converter.order

关于ruby-on-rails - Rails AntiPatterns 书 - 对组合的质疑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9000617/

相关文章:

javascript - 函数式 Ramda 传递函数参数超出范围

c++ - 彼此组成的类

java - bloated class 和 tagged class 有什么区别?

ruby-on-rails - "undefined method ` 地址= ' for"在 rails 中使用地理编码器 gem 时出错

ruby-on-rails - Rails 参数数量错误(1 代表 0),SubscribeController#update 中的 ArgumentError

ruby-on-rails - 无法弄清楚是什么导致我的 Rails 应用程序出现性能瓶颈

ios - 如何在 iOS 上使用 AVMutableComposition 和 CALayers

java - 如何查看 "anti if"运动及其目标?

.net - 创建自定义事件 - 对象发送者还是类型化发送者?

ruby-on-rails - 我可以在使用 Active Record 时将 ID 更改为字符串吗?