我在我的项目上运行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_
这一惯例、规则或建议背后的原因是什么?
3条答案
按热度按时间e4yzc0pl1#
我 认为 这里 的 重点 是 ruby 开发 者 总是 喜欢 把 方法 看作 getter , 因为 它们 返回 一些 东西 , 并 使用 equals " 语法 糖 " ( 就 像 在
def self.dog=(params)
中 , 它 允许 你 做Class.dog = something
) 。与 此 相反 , get 和 set 有 多 个 参数 , 它们 类似 于 finder 方法 ( 特别 是 get ;想想 ActiveRecord 的
where
) 。请 记住 , " 风格 指南 " = 纯粹 的 意见 。 一致 性 是 风格 指南 的 更 高 目标 , 所以 除非 有 什么 可以 论证 的 错误 或 难以 阅读 , 你 的 目标 应该 是 让 所有 东西 都 一样 , 而 不是 特定 的 类型 。 这 就是 为什么 rubocop 让 你 关闭 它 。
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
,因此也解决了这个冲突。name()
和settername=()
。从概念上讲,调用者不应该关心“name”是什么(属性还是方法),它是类的实现细节。mec1mxoz3#
我的理解是,这是因为
foo.get_value
是命令式的,而foo.value
是声明式的。