簡體   English   中英

圈復雜度對於方法來說太高了

[英]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 ,但它不僅僅這樣做:

  1. 驗證有效負載是兩種類型之一
  2. 按其他兩種類型過濾負載中的項目
  3. 確定輸入中是否存在各種用戶角色
  4. 將所有找到的用戶 UUID 放入一個數組中
  5. 通過查找將 UUID 轉換為用戶
  6. 在數組中再次查找它們以豐富有效負載中的各種類型的用戶詳細信息

這歸結為嚴重違反了 SRP(單一責任原則),更不用說它是一種可能會以其意想不到的副作用列表讓調用者感到驚訝的方法。

顯然,所有這些步驟仍然需要完成,只是方法不同。

考慮將這些步驟分解為單獨的方法,您可以將這些方法組合成一個在更高抽象級別上工作的enrich_payload_data方法,將每個部分如何工作的細節保留在每個方法的本地。 我可能會創建一個接受 UUID 並將其轉換為用戶的方法,每次您需要查找 UUID 以獲取用戶詳細信息時都可以調用該方法,因為這似乎不是特定於角色的。

布爾值is_taskis_add_projecthas_reporter_uuid只是使代碼混亂的中間變量,如果將其分解為更小的方法,您可能不需要它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM