我来自更多的 C# 背景,但我在业余时间学习 Ruby。
给定类,可以将它们的方法设为private
, public
(默认)或protected
. 虽然我了解它们的用法,但 Ruby 代码是否通常使用此类修饰符,尽管它是一种动态语言,用户可以轻松地覆盖访问权限?
虽然使用类似Send
允许用户访问私有方法的东西,但我只是想知道关于 Ruby 和访问修饰符的最佳实践是什么?换句话说,我应该在课堂上使用它们吗?
我来自更多的 C# 背景,但我在业余时间学习 Ruby。
给定类,可以将它们的方法设为private
, public
(默认)或protected
. 虽然我了解它们的用法,但 Ruby 代码是否通常使用此类修饰符,尽管它是一种动态语言,用户可以轻松地覆盖访问权限?
虽然使用类似Send
允许用户访问私有方法的东西,但我只是想知道关于 Ruby 和访问修饰符的最佳实践是什么?换句话说,我应该在课堂上使用它们吗?
给定类,可以将它们的方法设为私有、公共(默认)或受保护。虽然我了解它们的用法,但 Ruby 代码是否通常使用此类修饰符,尽管它是一种动态语言,用户可以轻松地覆盖访问权限?
它仍然比较常见,因为它传达了意图并最小化了您要公开的界面。需要遵守的一些约定:
只需省略public
, 因为除非您另有说明,否则所有方法都是公共的,并且方法通常按访问修改分组。
即使用户可以覆盖访问权限,但这并不意味着他们应该这样做(以同样的方式,您不会看到 C# 开发人员做一些疯狂的事情,例如将 IL 存根注入类以便他们可以访问私有方法)。所以区分还是有用的。
受保护的方法比在 C# 中要少一些,因为 Ruby 并不真正鼓励将继承作为传递行为的一种方式。常见的行为通常可以重构为Module
s ,然后include/extend
根据需要进行 -ed 。
私有方法与 C# 中的一样普遍;Ruby 经常喜欢使用许多微小的方法来做非常具体的事情,然后你将它们组合在一起以获得有用的东西。但是您不会公开这些方法,因为它们不是您的公共接口的一部分,并且您希望保持整洁。
因为私有方法不被视为接口的一部分,所以您应该可以随意更改它们而不受惩罚。通过将它们设为私有,您已经让其他人注意到这些方法及其实现或定义可能随时更改。
我一直认为这是关于暴露一个界面。您不希望您的用户对您的实施感到不知所措,因此您将此类内容设为私有。这对他们更友善。例如,在处理数组时,您真的想要另外 71 种方法(您几乎肯定不关心吗?)
RUBY_VERSION # => "1.8.7"
Array.new.public_methods.size # => 149
Array.new.private_methods.size # => 71
私有方法的另一个重要含义是“可能发生变化” 当您将自己提交给接口时,您必须支持它。每次下载新版本时,您都不能破坏每个人的代码。私有的东西被理解为易变的。它们没有暴露出来,所以这意味着你可以自由地改变它们。如果用户构建的代码依赖于私有方法,那么这不是你的错(假设他们没有这样做 b/c 你给了他们一个废话接口)。因此,您可以将其设为私有,以便为自己留出空间,以便在未来做得更好。
我仍然会在您的代码中使用它们,因为它向代码阅读器传达了明确的意图,并为您提供所需的保护。如果另一个开发人员要覆盖您的方法或通过#send 直接调用它们,他们很可能有或有充分的理由,或者至少理解他们为什么必须这样做。
在您的代码中使用 Private/Protected 可以让未来的开发人员更加明确地覆盖您的方法,并且如果没有人覆盖它们,也可以为您正常工作