如何防止外界关注或访问某个方法?

时间:2019-05-11 15:05:17

标签: ruby-on-rails

给出以下模型和关注点

def MyModel
   include ConcernA
   include ConcernB
end

module ConcernA
  extend ActiveSupport::Concern
  def print_a
    formatted_text
  end
protected
  def formatted_text
    "ConcernA"
  end
end

module ConcernB
  extend ActiveSupport::Concern
  def print_b
    formatted_text
  end
protected
  def formatted_text
    "ConcernB"
  end
end

formatted_text方法被覆盖

=> MyModel.print_a
= "ConcernB"

=> MyModel.print_b
= "ConcernB"

是否有一种方法可以真正保护formatted_text方法,使其仅在关注范围内可访问而不会被覆盖?

1 个答案:

答案 0 :(得分:1)

没有硬性保护。如果某人想要更改某些东西,他们很可能能够做到。但是您可以设计一些保护措施来防止意外的名称冲突。

例如,将方法提取到其自己的名称空间中:

module ConcernA
  extend ActiveSupport::Concern
  def print_a
    Impl.new.formatted_text
  end

  class Impl
    def formatted_text
      "ConcernA"
    end
  end
end

module ConcernB
  extend ActiveSupport::Concern
  def print_b
    Impl.new.formatted_text
  end

  class Impl
    def formatted_text
      "ConcernB"
    end
  end
end

class MyModel
   include ConcernA
   include ConcernB
end


MyModel.new.print_a # => "ConcernA"
MyModel.new.print_b # => "ConcernB"

通过这种方式,ConcernA::ImplConcernB::Impl是两个不相关的类,互不影响。