2009-05-22 6 views
14

Исповедь: я использую только частный и общественный видимость для моих методов!Вы когда-нибудь использовали защищенную видимость в Rails?

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

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

ответ

9

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

Однозначное наследование является прекрасным примером того, когда protected полезен в уровне модели, поскольку это одно из наиболее распространенных способов использования наследования.

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

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

+0

Это имеет большой смысл. (Не знаю, что такое ИППП). –

+3

«Вспомогательные методы, определенные на ApplicationController, должны быть отмечены как защищенные - если они были частными, другие контроллеры не смогут получить к ним доступ» - fyi, это неверно. См. Пример здесь: http://pastie.org/842898. Защищенный/закрытый в Ruby - это «я» и приемники, а не наследование. «Обратите внимание, что в отличие от языков, таких как Java, наследование абсолютно не играет роли в определении видимости метода в Ruby». - http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby –

+0

Спасибо, Иордания. Ты прав. Я добавил небольшую заметку. –

0

У меня есть SingleTableInheritance

класс Person < AR :: базовых класса Учитель < Человек Calss Студент < 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 и другие, для реализации функции Я использую здесь, чтобы показать вам случай, но у меня есть более сложный ландшафт, который я упростил здесь, чтобы понять вашу точку зрения.

+0

fyi, ваш пример выше не работает правильно - вы можете вызвать 'Person.reject_leaves (...)' без проблем. «public/protected/private» в ruby ​​не являются ключевыми словами - это вызовы метода на 'self', которые изменяют состояние' self'. Поскольку вы меняете то, что «я», когда вы делаете «def self». reject_leaves' у вас больше не установлено состояние 'protected'. чтобы получить то, что вы хотите, вам понадобится что-то вроде второго примера ('Prot2') здесь: http://pastie.org/842952 –

 Смежные вопросы

  • Нет связанных вопросов^_^