我应该如何在ruby中重构这个条件代码?

如何重构这个功能

def split_description(first_n)
    description_lines = description.split "\n"
    line_num = description_lines.length
    if line_num > first_n
      @description_first = to_html(description_lines[0..first_n].join("\n"))
      @description_remain = to_html(description_lines[first_n + 1..line_num].join("\n"))
    elsif line_num > 1
      @description_first = to_html(description_lines[0..first_n].join("\n"))
      @description_remain = ''
    else
      @description_first = ''
      @description_remain = ''
    end
  end

我是Ruby的首发,遇到这个rubocup警告:Method有太多行. [13/10]

以下是整个代码网址:
https://github.com/RubyStarts3/YPBT-app/blob/master/views_objects/video_info_view.rb

解决方法

def split_description(description,first_n)
  @description_first,@description_remain =
  case description.count("\n")
  when 0..first_n
    [description,'']
  else
    partition_description(description,first_n)
  end.map(&:to_html)
end

def partition_description(description,first_n)
  return ['',description] if first_n.zero?
  offset = 0
  description.each_line.with_index(1) do |s,i|
    offset += s.size
    return [description[0,offset],description[offset..-1]] if i == first_n
  end
end

我假设to_html(”)#=> ”,但如果不是这样,修改就很简单了.

因此我们可以看到to_html的效果,让我们这样定义它.

def to_html(description)
  description.upcase
end

description =<<_
It was the best of times
it was the worst of times
it was the age of wisdom
it was the age of fools
_
split_description(description,0)
@description_first
  #=> "" 
@description_remain
  #=> "IT WAS THE BEST OF TIMES\n..WORST OF TIMES\n..AGE OF WISDOM\n..AGE OF FOOLS\n" 

split_description(description,1)
@description_first
  #=> "IT WAS THE BEST OF TIMES\n" 
@description_remain
  #=> "IT WAS THE WORST OF TIMES\n..AGE OF WISDOM\n..AGE OF FOOLS\n" 

split_description(description,2)
@description_first
  #=> "IT WAS THE BEST OF TIMES\nIT WAS THE WORST OF TIMES\n" 
@description_remain
  #=> "IT WAS THE AGE OF WISDOM\nIT WAS THE AGE OF FOOLS\n" 

split_description(description,3)
@description_first
  #=> "IT WAS THE BEST OF TIMES\n..WORST OF TIMES\n..AGE OF WISDOM\n" 
@description_remain
  #=> "IT WAS THE AGE OF FOOLS\n" 

split_description(description,4)
@description_first
  #=> "IT WAS THE BEST OF TIMES\n..WORST OF TIMES\n..AGE OF WISDOM\n..AGE OF FOOLS\n" 
@description_remain
  #=> ""

说明

首先,看起来描述是一个包含字符串的局部变量.如果是这样,它必须是方法的参数(以及first_n).

def split_description(description,first_n)

我们想为两个实例变量赋值,所以让我们从写作开始

@description_first,@description_remain =

实际上有两个步骤:获取所需的字符串,然后使用to_html映射它们.所以让我们首先集中精力迈出第一步.

我们现在将调整字符串中的行数

case description.count("\n")

首先,让我们来处理字符串不包含换行符的情况

when 0
    [description,'']

如果字符串为空,则为[”,”];否则它将包含没有换行符的单个字符串.

接下来,假设字符串中的换行符数在1和first_n之间.在这种情况下,@ description_first将是整个字符串,而@description_remain将为空.

when 1..first_n
      [description,'']

当0和1..first_n都返回相同的双元素数组时,我们可以将它们组合起来:

when 0..first_n
    [description,'']

为了达到这个目的,first_n小于换行数.我已经使用另一种方法来处理换行数大于first_n的情况.

else
    partition_description(description,first_n)

partition_description只是确定第一个换行符描述的偏移量,然后相应地对字符串进行分区.

最后,我们需要结束case语句,映射用to_html返回的两个字符串的数组并结束方法

end.map(&:to_html)
end

正如我之前提到的,我假设to_html(”)#=> ”.在我看来,这是处理空字符串的最佳位置.

请注意,我直接处理了字符串,而不是将字符串拆分为行,操纵行然后重新加入它们.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...