Ruby 方法重构多行赋值以通过 RuboCop
Ruby method refactor multi line assignment to pass RuboCop
我一直在尝试调整这个设置复杂赋值的方法,我正在寻找其他选项来让这个函数通过警察。
有谁能给我指出正确的方向吗?
现在,我正在修补两个内部 .map 调用。
失败的警察
Assignment Branch Condition size for parse_items is too high. [24.08/15]
def parse_items
Avoid multi-line chains of blocks.
end.compact.map do |opt|
问题代码
def parse_items
options = parse_relationships
options = options.select { |opt| opt['type'] == 'product_options' }
options.map do |opt|
parse_included.detect { |x| x['id'] == opt['id'] }
end.compact.map do |opt|
{
group_id: @payload['id'],
originator_id: opt['id'],
price: opt['attributes']['price'],
description: opt['attributes']['name'],
exp_quantity: opt['attributes']['quantity'].to_i,
title: parse_attributes['name'],
image_originator_url: 'image_for_product',
updated_at: timestamp
}
end
end
辅助方法
private
def parse_data
@payload['data']
rescue
[]
end
def parse_included
@payload['included']
rescue
[]
end
def parse_attributes
@payload['data']['attributes']
rescue
[]
end
def parse_relationships
@payload['data']['relationships']['options']['data']
rescue
[]
end
def timestamp
Time.parse(parse_attributes['updated_at'])
end
更新错误
在规范中:Failure/Error: SELECT = ->(opt) { opt['type'] == 'product_options' }
的参数数量错误(给定 2,预期 1)
parse_items 的分配分支条件大小太高。 [17/15]
更新代码
SELECT = ->(opt) { opt['type'] == 'product_options' }
MAP = ->(opt) { parse_included.detect { |x| x['id'] == opt['id'] } }
def parse_items
parse_relationships.select(&SELECT).map(&MAP).compact.map do |opt|
{
group_id: @payload['id'],
originator_id: opt['id'],
price: opt['attributes']['price'],
description: opt['attributes']['name'],
exp_quantity: opt['attributes']['quantity'].to_i,
title: parse_attributes['name'],
image_originator_url: 'image_for_product',
updated_at: timestamp
}
end
end
我能够重构它,使它更干净,并通过所有的警察!万岁!
def parse_items
assign_item_attributes(select_included_option(select_item_options(parse_relationships['options']['data'])))
end
def select_included_option(options)
options.map do |opt|
parse_included.detect { |x| x['id'] == opt['id'] }
end
end
def assign_item_attributes(options)
options.compact.map do |opt|
{
group_id: @payload['id'],
originator_id: opt['id'],
price: opt['attributes']['price'],
description: opt['attributes']['name'],
exp_quantity: opt['attributes']['quantity'].to_i,
title: parse_attributes['name'],
image_originator_url: parse_image,
updated_at: parse_timestamp
}
end
end
def select_item_options(options)
options.select { |opt| opt['type'] == 'product_options' }
end
我一直在尝试调整这个设置复杂赋值的方法,我正在寻找其他选项来让这个函数通过警察。
有谁能给我指出正确的方向吗?
现在,我正在修补两个内部 .map 调用。
失败的警察
Assignment Branch Condition size for parse_items is too high. [24.08/15]
def parse_items
Avoid multi-line chains of blocks.
end.compact.map do |opt|
问题代码
def parse_items
options = parse_relationships
options = options.select { |opt| opt['type'] == 'product_options' }
options.map do |opt|
parse_included.detect { |x| x['id'] == opt['id'] }
end.compact.map do |opt|
{
group_id: @payload['id'],
originator_id: opt['id'],
price: opt['attributes']['price'],
description: opt['attributes']['name'],
exp_quantity: opt['attributes']['quantity'].to_i,
title: parse_attributes['name'],
image_originator_url: 'image_for_product',
updated_at: timestamp
}
end
end
辅助方法
private
def parse_data
@payload['data']
rescue
[]
end
def parse_included
@payload['included']
rescue
[]
end
def parse_attributes
@payload['data']['attributes']
rescue
[]
end
def parse_relationships
@payload['data']['relationships']['options']['data']
rescue
[]
end
def timestamp
Time.parse(parse_attributes['updated_at'])
end
更新错误
在规范中:Failure/Error: SELECT = ->(opt) { opt['type'] == 'product_options' }
parse_items 的分配分支条件大小太高。 [17/15]
更新代码
SELECT = ->(opt) { opt['type'] == 'product_options' }
MAP = ->(opt) { parse_included.detect { |x| x['id'] == opt['id'] } }
def parse_items
parse_relationships.select(&SELECT).map(&MAP).compact.map do |opt|
{
group_id: @payload['id'],
originator_id: opt['id'],
price: opt['attributes']['price'],
description: opt['attributes']['name'],
exp_quantity: opt['attributes']['quantity'].to_i,
title: parse_attributes['name'],
image_originator_url: 'image_for_product',
updated_at: timestamp
}
end
end
我能够重构它,使它更干净,并通过所有的警察!万岁!
def parse_items
assign_item_attributes(select_included_option(select_item_options(parse_relationships['options']['data'])))
end
def select_included_option(options)
options.map do |opt|
parse_included.detect { |x| x['id'] == opt['id'] }
end
end
def assign_item_attributes(options)
options.compact.map do |opt|
{
group_id: @payload['id'],
originator_id: opt['id'],
price: opt['attributes']['price'],
description: opt['attributes']['name'],
exp_quantity: opt['attributes']['quantity'].to_i,
title: parse_attributes['name'],
image_originator_url: parse_image,
updated_at: parse_timestamp
}
end
end
def select_item_options(options)
options.select { |opt| opt['type'] == 'product_options' }
end