多條件if...else...選擇語句程式碼優化
阿新 • • 發佈:2018-11-01
偶爾間又看到了自己的部落格,突然發現好久沒有寫部落格了。看到自己的部落格現在瀏覽量還算挺不錯的,所以決定重新開始寫一些部落格,不過我已經轉行前端兩年了,所以不會像以前那樣寫C++和演算法了,現在以寫前端的內容為主。
最近在寫業務程式碼時,發現有一段業務的邏輯非常蛋疼,由於選擇邏輯太多,所以需要靠多個if...else...來實現。大致的程式碼如下:
其實這段程式碼剛開始只有兩到三個分支,後來由於需求變更,一下子增加了多個分支,當我基於原來的程式碼模式寫完這段邏輯的時候自己都看吐了,所以立馬想辦法優化。function getQueryType(item) { if (item.match(/(sampleHash)|(apkMd5)/g)) { return 'sample_hash' } else if (item.match(/(programName)|(appName)/g)) { return 'program_name' } else if (item.match(/imei/g)) { return 'imei' } else if (item.match(/(packageName)|(apkName)|(apppackageName)/g)) { return 'package_name' } else if (item.match(/(sensitiveStringsEmail)|(developerEmail)/g)) { return 'sensitive_strings_email' } else if (item.match(/keyhash/g)) { return 'cert_list_keyhash' } else if (item.match(/sensitiveStringsDomain/g)) { return 'sensitive_strings_domain' } else if (item.match(/sensitiveStringsIp/g)) { return 'sensitive_strings_ip' } else if (item.match(/sensitiveStringsSp/g)) { return 'sensitive_strings_sp' } else if (item.match(/id/g)) { return 'id' } return null }
具體思路歷程如下:碰到if...else...程式碼的優化問題,一般首先會想到用switch..case來代替,但是,這裡由於業務的原因,這段程式碼換成switch...case會變得相當麻煩,而且也治標不治本,程式碼還是不好看。所以,當選擇的分支太多時,可以藉助陣列來做一個對映,只需要遍歷這個陣列即可,這樣不僅讓程式碼更加簡潔美觀,也更方便後續的維護。
優化後的程式碼如下:
對比一下上面兩端程式碼,是不是會發現下面的程式碼明顯漂亮很多,而且還方便維護,如果有新的型別加入,直接新增在MAP數組裡面就行了!//定義對映陣列 const MAP = [ { ret: 'sample_hash', match: ['sampleHash', 'apkMd5'] }, { ret: 'program_name', match: ['programName', 'appName'] }, { ret: 'imei', match: ['imei'] }, { ret: 'package_name', match: ['packageName', 'apkName', 'apppackageName'] }, { ret: 'sensitive_strings_email', match: ['sensitiveStringsEmail', 'developerEmail'] }, { ret: 'cert_list_keyhash', match: ['keyhash'] }, { ret: 'sensitive_strings_domain', match: ['sensitiveStringsDomain'] }, { ret: 'sensitive_strings_ip', match: ['sensitiveStringsIp'] }, { ret: 'sensitive_strings_sp', match: ['sensitiveStringsSp'] }, { ret: 'id', match: ['id'] } ] function getQueryType(item) { const r = MAP.find(m => m.match.some(s => item.indexOf(s) > -1)) if (!r) { return null } return r.ret }
這裡只是為大家提供一個寫程式碼的思路,如果在寫程式碼過程中發現有些地方選擇條件太多,或者很多特殊資料需要處理的時候,不妨藉助陣列來做個對映,這樣就很方便解決問題。