2016-04-22 26 views
1

處理複雜的循環複雜度Scala語法錯誤,我對最後一個錯誤沒有任何意見。循環複雜度Scala語法錯誤,匹配情況

這是一個數據文件解析情況。以下是代碼段:

val lineString = line.mkString(",") 
line match { 
    case Seq("Data1Name", data1ID, "desc1", "..") if data1ID.matches("\\d+") => { 
    processData1(...) 
    } 
    case Seq("Data2Name", data2ID, "desc2", "..") if data2ID.matches("\\d+") => { 
    processData2(...) 
    } 
    case Seq("Data3Name", data3ID, "desc3", "...") if data3ID.matches("\\d+") => { 
    processData3(...) 
    } 
    case Seq("Data4Name", data4ID, "desc4", "...") if data4ID.matches("\\d+") => { 
    processData4(...) 
    } 
    case Seq("Data5Name", data5ID, "desc5", "...", data5xID, '...', ...) if data5ID.matches("\\d+") && data5xID.matches("\\d+") => { // <-- It would be fine if this block is commented out 
    processData5(...) 
    } 
    case _ => Some(Error(s"...")) 
} 

圈複雜度爲13.如果我註釋掉上面指出的塊,語法檢查將很高興。我看不出如何進一步簡化代碼。

順便說一句,如果我用block 5上的方法替換if語句中的兩個傳導,則複雜度會降低1。對我來說,這種方法增加了複雜性。

有什麼建議嗎?

此外,語法錯誤,

Cyclomatic complexity of 13 exceeds max of 10 

由斯卡拉風格生成的校驗安裝在我們的構建過程。

+1

也許如果我們可以看一下'seq'內容和'if'條件,我們可以建議一些簡化(如果有的話)。 – maasg

+0

謝謝。我會照辦的。 – TeeKai

+0

什麼是錯誤?它是由誰製作的?我猜想,我的靜態代碼分析是 – Aivean

回答

2

我不認爲你的代碼是壞的,但它可以簡化一下:

val decimal = "(\\d+)".r 

line match { 
    case Seq("Data1Name", decimal(_), "desc1", "..") => 
    processData1(...) 
    case Seq("Data2Name", decimal(_), "desc2", "..") => 
    processData2(...) 
    case Seq("Data3Name", decimal(_), "desc3", "...") => 
    processData3(...) 
    case Seq("Data4Name", decimal(_), "desc4", "...") => 
    processData4(...) 
    case Seq("Data5Name", decimal(_), "desc5", "...", decimal(_), '...', ...) => 
    processData5(...) 
    case _ => Some(Error(s"...")) 
} 

理由爲CyclomaticComplexityChecker說:

如果代碼過於複雜,那麼這會使代碼難以閱讀。

你的代碼並不複雜,不難讀,所以我認爲silence checker對於這種特殊情況是可以的。

但是!如果你的代碼片段只是更長方法的一部分,那麼檢查器是正確的,你需要簡化你的方法。通過將這部分提取到單獨的方法來完成。

+0

感謝您的評論。代碼段是完整的方法體。任何東西都被遺漏了。 – TeeKai

+0

以時尚的方式使用正則表達式可以降低複雜度。再次感謝。 – TeeKai

+0

美麗的簡化。 – milcak