Вы когда-нибудь использовали защищенную видимость в Rails? - PullRequest
14 голосов
/ 22 мая 2009

Исповедь: я использую только private и public видимость для моих методов!

У меня такое чувство, что это плохо. Но в Rails это просто не кажется проблемой.

У кого-нибудь есть пример в Rails, где было бы большой ошибкой не использовать protected visibility?

Ответы [ 2 ]

9 голосов
/ 23 мая 2009

Обновление - см. Комментарий ниже, который ссылается на истинное объяснение protected / private в Ruby . Это было глубоко укоренившееся предубеждение, оставшееся с моих дней Java. Единственная важная часть, оставленная моим ответом, состоит в том, что методы контроллера, которые не являются действиями, не должны быть public (или, по крайней мере, ваши маршруты должны их защищать).

Наследование в одной таблице - прекрасный пример того, когда protected полезен на уровне модели, так как это одно из наиболее распространенных видов наследования.

На уровне контроллера вспомогательные методы, определенные в ApplicationController, должны быть помечены как protected - если бы они были private, то другие контроллеры не смогли бы получить к ним доступ, но если они public, Rails будет относитесь к ним как к действиям.

Лично я нахожу, что я использую наследование классов больше, чем многие из моих друзей и коллег, даже в приложениях Rails. Поскольку я использую его часто (и выходя из моих дней Java), я предпочитаю protected для всех вспомогательных методов, чтобы дать свободу любому (обычно самому), кто хочет расширить класс - если я действительно не смущаюсь по поводу одного , тогда я отмечаю это private. :)

0 голосов
/ 22 мая 2009

У меня есть SingleTableInheritance

класс Person

И я использую защищенные методы для реализации частного метода, который является общим для ученика и учителя:

class Person < AR::base
  def self.find(*args)
    reject_leaves(super(*args))
  end
protected
  def self.reject_leaves(target) #like a private in Teacher and Student
    case target
      when Array target.select{|t| reject_leaves(t)}
      when Person (target.leave_date < Date.today ? target : nil)
      else target
    end
  end
end

Отказ от ответственности: Существуют плагины, такие как act-as-Paranoid и другие, для реализации функции, которую я использую здесь, чтобы показать вам случай, но у меня есть более сложный ландшафт, который я упростил здесь, чтобы добраться до вашей точки.

...