Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 圈复杂度对于方法来说太高了_Ruby On Rails_Ruby_Optimization - Fatal编程技术网

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