分配分支条件太高

时间:2016-07-28 09:19:48

标签: ruby-on-rails ruby ruby-on-rails-4

我的代码是:

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

我得到cordova.plugins.notification.badge.set(1);

我该如何解决?

2 个答案:

答案 0 :(得分:1)

从您的示例中可以清楚地看出,您不需要许多中间变量,因此也不需要分配。构建实际必要代码的所有参数都应该移到一个单独的方法中:

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

但是,正如@Sergio Tulentsev向我们详细解释的那样,你应该担心代码的简洁性和可读性,而不是分数。分数可以是发现需要注意的地方的好方法,但它绝不是客观衡量代码质量的方法。

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

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的方法中。

按照这种方法,您可以达到一个点,您的代码将包含较小的构建块,可以根据需要轻松组合。这种方法还有其他好处,例如更好的可测试性和潜在的可读性。你应该注意不要采取相反的措施,并将每一行都作为一个单独的方法,因为@Sergio Tulentsev已经警告过我们。

答案 1 :(得分:0)

你必须离开

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

相同