[英]cyclomatic complexity is too high rubocop for method
這是我在項目中使用的代碼。 請提出一些優化建議(我已經重構了很多代碼,但我想不出進一步優化它的任何進展)
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
請注意,Rubocop 抱怨您的代碼太難理解,而不是它無法正常工作。 該方法稱為convert_uuid_to_emails
,但它不僅僅這樣做:
這歸結為嚴重違反了 SRP(單一責任原則),更不用說它是一種可能會以其意想不到的副作用列表讓調用者感到驚訝的方法。
顯然,所有這些步驟仍然需要完成,只是方法不同。
考慮將這些步驟分解為單獨的方法,您可以將這些方法組合成一個在更高抽象級別上工作的enrich_payload_data
方法,將每個部分如何工作的細節保留在每個方法的本地。 我可能會創建一個接受 UUID 並將其轉換為用戶的方法,每次您需要查找 UUID 以獲取用戶詳細信息時都可以調用該方法,因為這似乎不是特定於角色的。
布爾值is_task
、 is_add_project
和has_reporter_uuid
只是使代碼混亂的中間變量,如果將其分解為更小的方法,您可能不需要它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.