我在下面提供了一些发现的更新...
这是我当前代码中的一种方法:
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 也会抱怨我的新方法也太长了。我想这意味着添加我的第二种方法将调用的第三种方法?这对我来说似乎很奇怪。或者也许这意味着我不必分支太多,我猜。但是为什么分支不好?即使我切换到其他结构(比如案例......何时),我仍然在分支。而且我确实需要测试这些条件,因为嵌套数组、带有符号的数组或哈希的处理是不同的。
我正在努力建立自己的直觉,以便能够看到这样的问题并找出有效且高效的解决方案....但似乎我最终做的事情是非常低效和无效率的。考虑到我看不出我的代码为什么不好,这种权衡让我很担心。
有谁介意尝试一下并帮助我了解如何使上述方法进入一种保持某种可读性但符合 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 来说仍然太长,并且仍然具有过高的分支条件大小。
据我所见,我检查过的任何地方都无法向我展示不同的东西,唯一可以做的就是从数组和哈希的检查中创建方法。换句话说,每个if
条件check_conditions
都会有自己的方法。但这对我来说似乎是不必要的愚蠢。我基本上是在分解逻辑,将变量传递给不同的方法,这样我就可以将我的方法计数保持在某个任意值以下。
作为一种设计方式,这对我来说是错误的。但是我看不到改变我的逻辑的方法,这样它仍然可以完成它需要做的事情,但是每个方法都在七行以下。