我在我的项目中运行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)并且当方法只有一个参数.otherwise时,他们建议我们不要使用set_。
这个约定、规则或建议背后的原因是什么?
发布于 2016-01-15 04:36:47
另一种看法:据我所知,getter/setter范例在很大程度上是Java/C++等语言中的一种特定约定;至少我知道相当多的Java代码库,在过去,Beans中充斥着大量的get_getter和set_setter。在那时,私有属性很可能与"set_name()“和”get_name()“一起称为"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=()。从概念上讲,调用者不应该关心“名称”是什么(属性或方法),它是类的实现细节。https://stackoverflow.com/questions/26097084
复制相似问题