gpt4 book ai didi

ruby-on-rails - Rails 源代码 - 为什么将类包装在类中?

转载 作者:太空宇宙 更新时间:2023-11-03 16:42:56 25 4
gpt4 key购买 nike

我正在阅读 Rails 源代码,我可以在一些代码中看到,它不是直接使用类,而是创建一个子类。示例代码:

# activesupport/lib/active_support/execution_wrapper.rb
class RunHook < Struct.new(:hook) # :nodoc:
def before(target)
hook_state = target.send(:hook_state)
hook_state[hook] = hook.run
end
end


# railties/lib/rails/application.rb
def initialize
# some code..
@executor = Class.new(ActiveSupport::Executor)
@reloader = Class.new(ActiveSupport::Reloader)
# some more code
end

我的问题是.. 为什么需要使用子类?为什么不直接使用类/结构?

谢谢。

更新:我已经找到第二个例子的原因了,因为 ActiveSupport::Executor 定义了 inherited 方法:

class << self # :nodoc:
attr_accessor :active
end

def self.inherited(other) # :nodoc:
super
other.active = Concurrent::Hash.new
end

因此无论谁扩展类,都将具有使用新的 Concurrent::Hash 定义的 active 属性。

不过,我还是不太明白为什么Struct需要扩展。

最佳答案

因为它对性能及其逻辑上的不同类型有影响。 RunHook 具有扩展功能。在使用基本 Struct 的所有情况下,都无需调用 def before(target)。因此,这里编写了一个具有特定方法的新类,将在需要此方法的特定情况下使用。基本的 Struct 可用于所有其他不需要具有附加功能的特定类型的一般情况。

这也是一个关于安排代码的架构和设计问题。如果代码在类之间正确拆分,则程序更容易维护。面向对象编程和设计有五个基本原则:SOLID .根据ISP原则:“许多特定于客户端的接口(interface)优于一个通用接口(interface)”。

关于ruby-on-rails - Rails 源代码 - 为什么将类包装在类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41086151/

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