1. 程式人生 > >多條件if...else...選擇語句程式碼優化

多條件if...else...選擇語句程式碼優化

偶爾間又看到了自己的部落格,突然發現好久沒有寫部落格了。看到自己的部落格現在瀏覽量還算挺不錯的,所以決定重新開始寫一些部落格,不過我已經轉行前端兩年了,所以不會像以前那樣寫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會變得相當麻煩,而且也治標不治本,程式碼還是不好看。所以,當選擇的分支太多時,可以藉助陣列來做一個對映,只需要遍歷這個陣列即可,這樣不僅讓程式碼更加簡潔美觀,也更方便後續的維護。

優化後的程式碼如下:

//定義對映陣列
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
}
對比一下上面兩端程式碼,是不是會發現下面的程式碼明顯漂亮很多,而且還方便維護,如果有新的型別加入,直接新增在MAP數組裡面就行了!

這裡只是為大家提供一個寫程式碼的思路,如果在寫程式碼過程中發現有些地方選擇條件太多,或者很多特殊資料需要處理的時候,不妨藉助陣列來做個對映,這樣就很方便解決問題。