忏悔:我的方法只使用私有和公共可见性!
我有一种感觉,这是一件坏事。但在 Rails 中,这似乎不是一个问题。
有没有人在 Rails 中有一个例子,不使用受保护的可见性是一个大错误?
忏悔:我的方法只使用私有和公共可见性!
我有一种感觉,这是一件坏事。但在 Rails 中,这似乎不是一个问题。
有没有人在 Rails 中有一个例子,不使用受保护的可见性是一个大错误?
更新- 请参阅下面的评论,该评论链接到/在 Ruby中的真实解释protected
private
。这确实是我在 Java 时代留下的根深蒂固的偏见。我的答案剩下的唯一重要部分是,不是动作的控制器方法不应该是public
(或者至少你的路由应该保护它们)。
单表继承是protected
模型层何时有用的完美示例,因为它是那里最常见的继承用途之一。
在控制器层中,定义的辅助方法ApplicationController
应该被标记为protected
——如果它们是private
其他控制器将无法访问它们,但如果它们是public
Rails 将它们视为操作。
就我个人而言,我发现我比我的许多朋友和同事更多地使用类继承,即使在 Rails 应用程序中也是如此。因为我经常使用它(并且从我的 Java 时代出来),所以我赞成protected
所有帮助方法为任何想要扩展类的人(通常是我自己)提供自由——除非我真的对一个类感到尴尬,然后我标记它private
。:)
我有 SingleTableInheritance
class Person < AR::base class Teacher < Person cals Student < 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 和其他插件来实现我在这里使用的功能来向您展示案例,但我有一个更复杂的环境,我在此处进行了简化以达到您的目的。