Techioz Blog

Rubocop を満足させるために割り当てをリファクタリングするにはどうすればよいでしょうか?

概要

新しく作成した (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:map_to_cal_even の割り当て分岐条件のサイズが大きすぎます。 [<8, 21, 1> 22.49/17]

それは私にとって非常に一般的な任務のように思えます。 では、rubocop を満たすためにこのメソッドをリファクタリングするにはどうすればよいでしょうか?それとも無視リストに入れるべきでしょうか?

解決策

これは Rubocop を満足させる必要があり、ブロックのタップ メソッドを使用して別のメソッドで新しいイベントを定義し、すべての割り当てを含む別のブロックをそれに渡します。


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