为什么在Rails中保持非动作控制器方法是私有的?

时间:2018-02-09 15:37:19

标签: ruby-on-rails

编辑:此问题已被标记为关于私有方法目的的更通用的OO问题的副本。这个问题专门针对控制者;我想知道除了经典的OO之外是否还有其他原因而且不要公开任何不需要公开的方法。"情绪。

有许多资源警告应该保留非操作控制器方法private,以避免这些方法被路由到的可能性。我的问题是这个警告背后的原因。

我的理解是routes.rb文件是可能路由的白名单,那么为什么控制器有公共方法(只要它们不在routes.rb文件中)?将方法设为私有的想法是否只是一个额外的保护层,以防止未来我/开发人员错误地添加包含这些方法的路由?是否有一些其他偷偷摸摸的方式,公共控制器方法可以进入一条路线?

This book section警告控件的公共方法默认情况下可以通过某些URL访问。这是对的吗?

This answer解释说保持控制器方法是私有的,可以阻止任何请求被路由到它,但是routes已经处理过了吗?

The Rails Guide提到降低控制器方法的可见性是最佳做法,而不应该采取行动。

The Thoughtbot Rails style guide甚至不接受公共控制器方法的概念,并表示要使用private而不是protected

这里显然有社区共识。这些建议背后的原因是什么?

1 个答案:

答案 0 :(得分:0)

所有这些规则都有意义。保持类(包括Rails控制器)的公共接口(一组公共方法)尽可能小的想法来自OOP范例以及SOLID规则。而且它的动机是它可以让你的系统更加健壮和灵活地进行成长和重构(你拥有的公共方法更少 - 减少你在代码中的调用 - 轻松重构)。

简而言之,如果您不需要“外部”可见的方法,请将其隐藏为默认值。我的意思是,当你用一种公共方法开始写一个新课时,真的需要在外面调用,并让其他人保密,直到你真的在外面需要它们。

由于可以在外部访问,您需要保密的解释是部分正确的。实际上,如果没有URL指向该方法,则URL无法访问公共或私有方法。换句话说:没有为此方法定义的路由 - 没有它的调用。