风格指南在这种情况下不清楚(除了给出意见,它是奇怪的,它是).我有一串哈希/数组函数可以在复杂的响应对象上执行.我需要做几种选择和地图.目前我只有一长串方法调用,但是用于排序和选择的一些块是多行而有些则不是.
我应该混合块定义类型吗?只使用大括号或只使用.end块?我应该把它分成多个步骤吗?
另外,如果我重构我的块并将它们变成方法,那么将它们放在哪里是合适的?它们在包含类的实例或类方法的上下文中并没有真正意义.
我环顾四周,对于什么是正确的样式没有找到共识,但我正在寻找一种能够通过Ruby样式指南的方法(所以最有可能将我的块重构为方法,但我在哪里放置它们?)
这是一个人为的例子:
def example1 (arr)
arr.sort do |a, b|
a_pieces = a.value.split ' '
b_pieces = b.value.split ' '
(a_pieces[1] + a_pieces[5]) <=> (b_pieces[1] + b_pieces[5])
end
.last[:some_value]
.select do |a|
a == 'something'
end
end
def example2 (arr)
arr.sort { |a, b|
a_pieces = a.value.split ' '
b_pieces = b.value.split ' '
(a_pieces[1] + a_pieces[5]) <=> (b_pieces[1] + b_pieces[5])
}
.last[:some_value]
.select { |a| a == 'something' }
end
Run Code Online (Sandbox Code Playgroud)
我会用do ... end了块多行和花括号{ ... }为单行代码.我从来没有使用do ... end用于链接的方法,对于一个前面的时除外多行块.我还在同一行中链接方法,只要代码可读,并且行不超过80个字符.
所以我的例子我会按如下方式编写代码:
def example1 (arr)
arr.sort do |a, b|
a_pieces = a.value.split ' '
b_pieces = b.value.split ' '
(a_pieces[1] + a_pieces[5]) <=> (b_pieces[1] + b_pieces[5])
end.last[:some_value].select { |a| a == 'something' }
end
Run Code Online (Sandbox Code Playgroud)
虽然我可能会将它分成两种方法(实际上是三种,其中example1为1):
def sort_array(arr)
arr.sort do |a, b|
a_pieces = a.value.split ' '
b_pieces = b.value.split ' '
(a_pieces[1] + a_pieces[5]) <=> (b_pieces[1] + b_pieces[5])
end
end
def select_item(arr)
arr.last[:some_value].select { |a| a == 'something' }
end
def example1(arr)
select_item(sort_array(arr))
end
Run Code Online (Sandbox Code Playgroud)
我会这样做:
def example1(arr)
arr.sort_by { |a|
a_pieces = a.value.split
(a_pieces[1] + a_pieces[5])
}.last[:some_value]
.select { |a| a == 'something'}
end
Run Code Online (Sandbox Code Playgroud)
sort将比简单对象的简单比较要慢得多。sort_by<=>
在风格上,如果您要返回一个值,尤其是在方法链中,请使用{...}而不是do...。end“样式指南”建议使用do...end当您在一个块中处理多end.some_method行时,但很模糊且令人困惑。使用{...}提醒我们我们只传递值并清除模糊性。
请记住,它们是风格指南,而不是法律,并且是真正的通用编码实践指南,可帮助我们编写每个人都可读的代码。一致性很重要,可读性也很重要。
此外,baresplit与split ' 'or做同样的事情split(' ')。