Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 代码重分解-我应该将代码移动到单独的方法吗?_Ruby On Rails_Ruby_Refactoring - Fatal编程技术网

Ruby on rails 代码重分解-我应该将代码移动到单独的方法吗?

Ruby on rails 代码重分解-我应该将代码移动到单独的方法吗?,ruby-on-rails,ruby,refactoring,Ruby On Rails,Ruby,Refactoring,我有一个控制器将解析的文档与关键字数据库进行比较。典型的代码片段是封装的循环,循环遍历已解析的文档、关键字数据库、计算匹配数并构建匹配词数组。以下是一个例子: @key_words = KeyWords.all @count = 0 @array_of_matching_words = [] @parsed_document.each do |a| @key_words.each do |word| if a =~ /#{key_word.word}/ @count = @count

我有一个控制器将解析的文档与关键字数据库进行比较。典型的代码片段是封装的循环,循环遍历已解析的文档、关键字数据库、计算匹配数并构建匹配词数组。以下是一个例子:

@key_words = KeyWords.all
@count = 0
@array_of_matching_words = []
@parsed_document.each do |a|
@key_words.each do |word|
  if a =~ /#{key_word.word}/
    @count = @count+1
    @array_of_matching_words = @array_of_matching_words.push "#{key_word.word}"
  end
end
匹配单词的实例化变量@count和@array\u都传递给视图。我已经为其他Word数据库积累了许多这样的代码片段,我正试图通过将这些代码中的一些移到单独的方法中来重新考虑代码

我考虑过的一个选项是将代码移动到控制器中的私有方法

def get_the_number_and_the_list_of_matching_words
  @key_words = KeyWords.all
  @count = 0
  @array_of_matching_words = []
  @parsed_document.each do |a|
  @key_words.each do |word|
    if a =~ /#{key_word.word}/
      @count = @count+1
      @array_of_matching_words = @array_of_matching_words.push "#{key_word.word}"
    end
  end
end
然后我就离开

get_the_number_and_the_list_of_matching_words
在我的动作控制器和视图中,将获得匹配单词的@count和@array


我觉得这种编码“风格”很糟糕。方法“get_The_number_and_The_list_of_matching_words”突然出现,它没有实例化任何东西,没有传递任何参数,两个实例化变量(@count,@array_of_matching_words)都不可见(它们隐藏在private methods部分的.rb文件的底部)。这真的是重新考虑代码的好方法吗?还是有其他选择?当方法既不是实例方法,也不是需要传递参数和返回新变量的方法时,将代码移动到方法中是否有意义?

这可能是个人偏好问题,但这里是

我建议拆分方法尽可能小。好处有两方面:

  • 考虑一个新来者阅读该方法。若它只有几行长(不管其他几种方法如何),它将更容易遵循
  • 如果将逻辑委托给其他方法,测试就会变得容易得多。您现在只需要测试一个方法是否在您的方法中被调用,而不是测试所有的逻辑

我同意在一个方法中使用不同的方法会使事情变得混乱,特别是当涉及到实例变量时,但人们只需要查看该方法并遵循它调用的其他方法,就可以了解发生了什么。

获取\u编号和\u匹配单词的\u列表这样的方法名称非常长,如果它需要那么长的时间来传达它在做什么,那么你的方法在设计上过于雄心勃勃。把它分成小块

您的示例方法设置了三个不同的实例变量,取决于一个没有作为参数传入的实例变量,它只是被假定为神奇地存在,并且除了定义匹配单词的数组之外,没有明确的目标

通常,在变量名中包含诸如某物类型之类的内容是无关的信息<代码>@匹配的单词
在这里更可取

你应该做的是打破逻辑,在
@keywords
@parsed\u document
之间进行比较,两者都作为参数传入。Rails鼓励将这些方法放在“关注点”中,或者,如果它们适用于特定模型,如果适合的话,放在那里

任何
关键字
都可以扩展以生成所需的输出,例如,使您的代码看起来更像这样:

def prepare_key_words_matching
  @key_words = KeyWords.all

  @matching_words = KeyWords.matching(@parsed_document)
end

然后可以使用
@匹配单词.长度
而不是单独的
@count
变量。

这类问题更适合该网站。