Как предотвратить доступ / перезапись метода извне? - PullRequest
0 голосов
/ 11 мая 2019

Учитывая следующую модель и проблемы

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 Ответ

1 голос
/ 11 мая 2019

Там нет жесткой защиты.Если кто-то хочет что-то изменить, он, скорее всего, сможет.Но вы можете разработать некоторые меры защиты от случайного столкновения имен.

Например, извлеките метод в его собственное пространство имен:

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::Impl и ConcernB::Impl являются двумя несвязанными классами и не влияют друг на друга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...