【发布时间】:2015-09-21 15:56:39
【问题描述】:
我在下面提供了一些发现的更新...
这是我当前代码中的一种方法:
def query(data_set, conditions)
query_data_set = data_set.dup
search_conditions = parse_conditions(conditions)
search_conditions.each do |condition|
if condition.class == Array
condition.each do |term|
if term.class == Symbol
query_data_set = entity.send term, query_data_set
else
query_data_set = search_data_text(query_data_set, term)
end
end
end
if condition.class == Hash
condition.each do |key, value|
query_data_set = method("query_#{key}").call(data_set, value)
end
end
end
query_data_set
end
Rubocop 讨厌这个有三个原因:
C: Assignment Branch Condition size for query is too high. [17.03/15]
def query(data_set, conditions)
C: Method has too many lines. [19/7]
def query(data_set, conditions)
C: Use next to skip iteration.
search_conditions.each do |condition|
我不想跳过迭代,所以我不知道为什么我会使用next。对于这段代码来说,跳过迭代永远不会有意义。
因此转到其他投诉,您会在此方法的顶部看到我已经展开了一个操作(对parse_conditions 的调用)。还有一个电话到search_data_text。我在这里唯一的一点是我试图在似乎有意义的地方进行模块化。
即使我将那个大的search_conditions.each 块移到一个单独的方法中,Rubocop 也会抱怨我的新方法太长了。我想这意味着添加我的 second 方法将调用的 third 方法?这对我来说似乎很奇怪。或者也许这意味着我不必分支太多,我猜。但是为什么分支不好?即使我切换到其他结构(比如案例......何时),我仍然在分支。而且我确实需要测试这些条件,因为嵌套数组、带有符号的数组或散列的处理是不同的。
我正在努力建立自己的直觉,以便能够看到这样的问题并找出有效且高效的解决方案....但似乎我最终做的事情是非常低效和无效与我的时间。考虑到我看不出我的代码为什么不好,这种权衡让我很担心。
任何人介意尝试一下并帮助我了解如何使上述方法进入一种保持一些可读性但符合 Ruby 主义者喜欢的样式指南的状态?
---------- 更新 ----------
我能想到的最好的方法是:
def query(data_set, conditions)
query_data_set = data_set.dup
parse_conditions(conditions).each do |condition|
query_data_set = check_conditions(condition, query_data_set)
end
query_data_set
end
def check_conditions(condition, data)
if condition.class == Array
condition.each do |term|
data = entity.send term, data if term.class == Symbol
data = search_data_text(data, term) unless term.class == Symbol
end
end
if condition.class == Hash
condition.each do |key, value|
data = method("query_#{key}").call(data, value)
end
end
data
end
check_conditions 方法对于 Rubocop 来说仍然太长,并且分支条件大小仍然过高。
据我所见,我检查过的任何地方都无法向我展示不同的东西,唯一可以做的可能是从数组和哈希的检查中创建方法。换句话说,check_conditions 中的每个if 条件都会有自己的方法。但这对我来说似乎是不必要的愚蠢。我基本上是在分解逻辑,将变量传递给不同的方法,这样我就可以将我的方法计数保持在某个任意值以下。
作为一种设计方式,这对我来说是错误的。但是我看不到一种方法可以改变我的逻辑,使它仍然可以完成它需要做的事情,但每个方法不到七行。
【问题讨论】: