繁体   English   中英

分配分支条件太高

[英]Assignment Branch Condition is too high

我的代码是:

def send_deliverer_push_notification(order_fulfillment, parse_events)
shopper_id               = order_fulfillment.shopper_id
order                = Order.find_by(id: order_fulfillment_id)
user_id              = order.user_id
role_name            = Shopper.find_by(id: shopper_id).roles.pluck(:name).first
batch_id             = Batch.find_by(shopper_id: shopper_id).id
message              = "Order # #{order_fulfillment.order_id} is now ready for pick-up"

ParseHelpers.publish_batching_status(user_id, *parse_events, message) do
    {
    shopper_id:   shopper_id,
    role:     role_name,
    task:     order_fulfillment.shopper_status,
    batch_id: batch_id,
    fulfillment_number: "#{order.order_number}-#{order_fulfillment.store_id}"
    }
    end
  end

我得到Assignment Branch Condition size for send_deliverer_push_notification is too high. [16.16/15] Assignment Branch Condition size for send_deliverer_push_notification is too high. [16.16/15]

我该如何解决?

从您的示例中可以清楚地看出,您不需要很多中间变量,因此也不需要赋值。 实际需要的所有参数构建代码应移至单独的方法:

def send_deliverer_push_notification(order_fulfillment, parse_events)
  order = Order.find_by(id: order_fulfillment_id)
  message = "Order # #{order_fulfillment.order_id} is now ready for pick-up"

  ParseHelpers.publish_batching_status(order.user_id, *parse_events, message) do
    batching_status_params(order, order_fulfillment)
  end
end

def batching_status_params(order, order_fulfillment)
  {
    shopper_id: order_fulfillment.shopper_id,
    role: Shopper.find_by(id: order_fulfillment.shopper_id).roles.pluck(:name).first,
    task: order_fulfillment.shopper_status,
    batch_id: Batch.find_by(shopper_id: order_fulfillment.shopper_id).id,
    fulfillment_number: "#{order.order_number}-#{order_fulfillment.store_id}"
  }
end

但最好担心代码的简洁性和可读性,而不是分数。 分数可能是发现需要注意的地方的好方法。 它绝不是代码质量的客观衡量标准。

看这个例子,它显然过于冗长,在关注点分离方面不是很好。 这一行:

role: Shopper.find_by(id: order_fulfillment.shopper_id).roles.pluck(:name).first

应该更好地表达为像这样的Shopper方法:

class Shopper < ...
  ...

  def self.role_of(shopper_id)
    find_by(id: shopper_id).roles.pluck(:name).first
  end
end

然后你可以用更具可读性的替换该行

role: Shopper.role_of(order_fulfillment.shopper_id)

可以用这条线做类似的事情:

Batch.find_by(shopper_id: order_fulfillment.shopper_id).id

该逻辑可以放在OrderFullfillment的方法中。

遵循这种方法,您可以达到一个点,即您的代码将由更小的构建块组成,并且可以根据需要轻松组合。 这种方法还有其他好处,例如更好的可测试性和潜在的可读性。 注意不要将 go 设置为相反的程度,并使每一行都成为单独的方法。

你必须搬走

shopper_id               = order_fulfillment.shopper_id
order                = Order.find_by(id: order_fulfillment_id)
user_id              = order.user_id
role_name            = Shopper.find_by(id: shopper_id).roles.pluck(:name).first
batch_id             = Batch.find_by(shopper_id: shopper_id).id
message              = "Order # #{order_fulfillment.order_id} is now ready for pick-up"

分离方法甚至耦合方法并将其设置为属性

ParseHelpers.publish_batching_status相同

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM