ruby 如何重构任务以满足Rubocop?

pn9klfpd  于 2023-10-17  发布在  Ruby
关注(0)|答案(2)|浏览(110)

我给一个新创建的(Icalendar-)对象赋值:

def map_to_cal_event
    e             = Icalendar::Event.new
    e.dtstart     = to_icaldate start.to_datetime
    e.dtend       = to_icaldate self.end.to_datetime if self.end.present?
    e.summary     = title
    e.description = description
    e.url         = timetable_url
    e.categories  = categories
    e.location    = location

    e
  end

使用Rubocop它是抱怨
Metrics/AbcSize: Assignment Branch Condition size for map_to_cal_event is too high. [<8, 21, 1> 22.49/17]
对我来说这似乎是一个很普通的任务。
那么,如何重构此方法以满足Rubocop?或者我应该把它放在目录里吗?

qlvxas9a

qlvxas9a1#

这应该满足Rubocop,在一个单独的方法中使用tap方法定义一个新的事件,然后将另一个块传递给它,并进行所有赋值。

def map_to_cal_event
  build_new_cal_event do |e|
    e.dtstart     = dtstart
    e.dtend       = dtend
    e.summary     = title
    e.description = description
    e.url         = timetable_url
    e.categories  = categories
    e.location    = location
  end
end

def build_new_cal_event(&block)
  Icalendar::Event.new.tap(&block)
end

def dtstart
  to_icaldate(start.to_datetime)
end

def dtend
  to_icaldate(self.end.to_datetime) if self.end.present?
end
5n0oy7gb

5n0oy7gb2#

我还没有完成ABC指标的优化,但是我想通过查看代码来尝试的一件事是将dtstart和dtend的函数替换为一个辅助函数,即。

def map_to_cal_event
  e             = Icalendar::Event.new
  e.dtstart     = dtstart_time
  e.dtend       = dtend_time
  e.summary     = title
  e.description = description
  e.url         = timetable_url
  e.categories  = categories
  e.location    = location

  e
end

def dtstart_time
  to_icaldate start.to_datetime
end

def dtend_time
  to_icaldate self.end.to_datetime if self.end.present?
end

(作为答案发布,而不是作为评论,以便能够格式化代码)

相关问题