Ruby on rails 圈复杂度对于方法来说太高了
这是我在项目中使用的代码。 请提出一些优化建议(我已经对这段代码进行了很多重构,但我想不出进一步优化它的任何进展)Ruby on rails 圈复杂度对于方法来说太高了,ruby-on-rails,ruby,optimization,Ruby On Rails,Ruby,Optimization,这是我在项目中使用的代码。 请提出一些优化建议(我已经对这段代码进行了很多重构,但我想不出进一步优化它的任何进展) def将用户ID转换为电子邮件(用户有效负载) 返回,除非(用户_有效负载[:目标]=“票证”或用户_有效负载[:目标]=“更改”) 动作\数据=用户\有效载荷[:动作] 动作|数据。每个动作|数据| 是否添加项目=数据[:名称]=“添加项目” 是任务=数据[:名称]=“添加任务” 下一步除非(是添加项目还是任务) has\u reporter\u uuid=is\u task&&
def将用户ID转换为电子邮件(用户有效负载)
返回,除非(用户_有效负载[:目标]=“票证”或用户_有效负载[:目标]=“更改”)
动作\数据=用户\有效载荷[:动作]
动作|数据。每个动作|数据|
是否添加项目=数据[:名称]=“添加项目”
是任务=数据[:名称]=“添加任务”
下一步除非(是添加项目还是任务)
has\u reporter\u uuid=is\u task&&Va::Action::USER\u TYPES.exclude?(数据[:reporter\u uuid])
user_uuids=数据[:user_uuids]| |[]
用户_uuids注意,Rubocop抱怨您的代码太难理解,而不是它不能正常工作。该方法称为convert_uuid_to_email
,但它不只是这样做:
验证有效负载是两种类型之一
按其他两种类型过滤有效负载中的项目
确定输入中是否存在各种用户角色
将找到的所有用户UUID推送到一个数组中
通过查找UUID将其转换为用户
在数组中再次找到它们,以丰富有效负载中各种类型的用户详细信息
这可以归结为严重违反了SRP(单一责任原则),更不用说它是一种可能会让调用者感到意外的副作用列表的方法
显然,所有这些步骤仍然需要完成,只是不是全部采用相同的方法
考虑将这些步骤分解为单独的方法,您可以将这些方法组合成一个在更高抽象级别上工作的enrich\u payload\u data
方法,使每个部分如何工作的细节在每个方法的本地保持。我可能会创建一个方法,该方法接受UUID并将其转换为用户,每次需要查找UUID以获取用户详细信息时都可以调用该方法,因为这似乎不是特定于角色的
布尔值是任务
,是添加项目
,有报告者
只是将代码弄乱的中间变量,如果将其分解为较小的方法,您可能不需要它们
def convert_uuid_to_emails(user_payload)
return unless (user_payload[:target] == 'ticket' or user_payload[:target] == 'change')
action_data = user_payload[:actions]
action_data.each do |data|
is_add_project = data[:name] == 'add_fr_project'
is_task = data[:name] == 'add_fr_task'
next unless (is_add_project or is_task)
has_reporter_uuid = is_task && Va::Action::USER_TYPES.exclude?(data[:reporter_uuid])
user_uuids = data[:user_uuids] || []
user_uuids << data[:owner_uuid] if Va::Action::USER_TYPES.exclude?(data[:owner_uuid])
user_uuids << data[:reporter_uuid] if has_reporter_uuid
users_data = current_account.authorizations.includes(:user).where(uid: user_uuids).each_with_object({}) { |a, o| o[a.uid] = {uuid: a.uid, user_id: a.user.id, user_name: a.user.name} }
if Va::Action::USER_TYPES.include? data[:owner_uuid]
data['owner_details'] = {}
else
data['owner_details'] = users_data[data[:owner_uuid]]
users_data.delete(data[:owner_uuid])
end
data['reporter_details'] = has_reporter_uuid ? users_data[data[:reporter_uuid]] : {}
data['user_details'] = users_data.values
end
end