为什么rubocop或ruby风格指南不喜欢使用get_或set_?

klsxnrf1  于 2022-11-22  发布在  Ruby
关注(0)|答案(3)|浏览(121)

我在我的项目上运行rubocop并解决它引起的投诉。
有一个特别的抱怨困扰着我

Do not prefix reader method names with get_

我不能从这个投诉中了解太多,所以我看了看source code in github
我找到了这个片段

def bad_reader_name?(method_name, args)
      method_name.start_with?('get_') && args.to_a.empty?
    end

    def bad_writer_name?(method_name, args)
      method_name.start_with?('set_') && args.to_a.one?
    end

所以建议或约定如下:
1)实际上,他们建议我们在方法没有参数时不要使用get_。否则,他们允许get_
2)当方法只有一个参数时,它们建议我们不要使用set_。否则,它们允许set_
这一惯例、规则或建议背后的原因是什么?

e4yzc0pl

e4yzc0pl1#

我 认为 这里 的 重点 是 ruby 开发 者 总是 喜欢 把 方法 看作 getter , 因为 它们 返回 一些 东西 , 并 使用 equals " 语法 糖 " ( 就 像 在 def self.dog=(params) 中 , 它 允许 你 做 Class.dog = something ) 。
与 此 相反 , get 和 set 有 多 个 参数 , 它们 类似 于 finder 方法 ( 特别 是 get ;想想 ActiveRecord 的 where ) 。
请 记住 , " 风格 指南 " = 纯粹 的 意见 。 一致 性 是 风格 指南 的 更 高 目标 , 所以 除非 有 什么 可以 论证 的 错误 或 难以 阅读 , 你 的 目标 应该 是 让 所有 东西 都 一样 , 而 不是 特定 的 类型 。 这 就是 为什么 rubocop 让 你 关闭 它 。

wd2eg0qa

wd2eg0qa2#

换个Angular 来看:getter/setter范例在很大程度上是Java/C++等语言中一种特定约定;至少我知道在非常模糊的过去有相当多的Java代码库,Bean中充斥着大量的get_-getter和set_-setter。在那个时候,private属性很可能被称为“name”,其中包含“set_name()”和“get_name()";因为属性本身被称为“name”,所以getter也不能是“name()”。
因此,“get_”和“set_”的存在是由于语言的一个(微不足道的)技术缺陷,即不允许在方法名中使用“=”。
在Ruby中,我们有一系列完全不同的可能性:

  • 首先,我们有了name()name=(),这就立即消除了对get_set_语法的需要。所以,我们 * 确实 * 有getter和setter,只是我们对它们的调用与Java不同。
  • 而且,属性不是name而是@name,因此也解决了这个冲突。
  • 实际上,您根本没有使用普通“obj.name“语法的属性!虽然Rails/ActiveRecord假装“person.name“是一个“属性,”但实际上它只是一对自动生成的getter name()和setter name=()。从概念上讲,调用者不应该关心“name”是什么(属性还是方法),它是类的实现细节。
  • 每次调用可以节省4到3次按键。这可能看起来像个笑话,但编写简洁而易于理解的代码 * 毕竟是 * Ruby的商标。:-)
mec1mxoz

mec1mxoz3#

我的理解是,这是因为foo.get_value是命令式的,而foo.value是声明式的。

相关问题