2016-07-28 70 views
-1

我的代碼是:指派分支條件太高

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]

我該如何解決?

+0

你用什麼來獲得該報告? –

+0

@SergioTulentsev獵犬 – dijfidofj

回答

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

+0

這條建議值得商榷。盲目移動代碼以滿足自動化度量很少會導致更好的代碼。相反,我們必須有意識地移動代碼並且有充分的理由(「改進flog分數」不計算在內):) –

+0

flog分數是代碼複雜性的一個_approximation_。應該減少複雜性,而不是flog分數。 –

+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已經警告過我們。