日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

特定场景下取代if-else和switch的方式

發(fā)布時(shí)間:2023/12/31 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 特定场景下取代if-else和switch的方式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

look-up表代替if-else

比如某平臺(tái)的信用分?jǐn)?shù)評(píng)級(jí):

超過(guò)700-950,信用極好,
650-700信用優(yōu)秀,
600-650信用良好,
550-600信用中等,
350-550信用較差。

常規(guī)寫(xiě)法:

function showGrace(grace) {let _level='';if(grace>=700){_level='信用極好'}else if(grace>=650){_level='信用優(yōu)秀'}else if(grace>=600){_level='信用良好'}else if(grace>=550){_level='信用中等'}else{_level='信用較差'}return _level; }

看看運(yùn)行也沒(méi)問(wèn)題,但是問(wèn)題也是有的比如:

1- 萬(wàn)一以后需求,改了比如650-750是信用優(yōu)秀,750-950是信用極好。這樣就整個(gè)方法要改。

2- 方法存在各種神仙數(shù)字:700,650,600,550。日后的維護(hù)可能存在問(wèn)題。

3- if-else太多,看著有點(diǎn)強(qiáng)迫癥


用look-up表,把配數(shù)據(jù)置和業(yè)務(wù)邏輯分離的方式實(shí)現(xiàn)下

function showGrace(grace) {let graceForLevel=[700,650,600,550];let levelText=['信用極好','信用優(yōu)秀','信用良好','信用中等','信用較差'];for(let i=0;i<graceForLevel.length;i++){if(grace>=graceForLevel[i]){return levelText[i];}}//如果不存在,那么就是分?jǐn)?shù)很低,返回最后一個(gè)return levelText[levelText.length-1]; }

這樣的修改,優(yōu)點(diǎn)就是如果有需求修改,只需要修改graceForLevel,levelText。業(yè)務(wù)邏輯不需要改。

為什么這里推薦配數(shù)據(jù)置和業(yè)務(wù)邏輯分離

1.修改配置數(shù)據(jù)比業(yè)務(wù)邏輯修改成本更小,風(fēng)險(xiǎn)更低
2.配置數(shù)據(jù)來(lái)源和修改都可以很靈活
3.薦配置和業(yè)務(wù)邏輯分離,可以更快的找到需要修改的代碼


如果還想靈活一些,可以封裝一個(gè)稍微通用一點(diǎn)的look-up函數(shù)。

通用一點(diǎn)的look-up函數(shù)

function showGrace(grace,level,levelForGrace) {for(let i=0;i<level.length;i++){if(grace>=level[i]){return levelForGrace[i];}}//如果不存在,那么就是分?jǐn)?shù)很低,返回最后一個(gè)return levelForGrace[levelForGrace.length-1]; } let graceForLevel=[700,650,600,550]; let levelText=['信用極好','信用優(yōu)秀','信用良好','信用中等','信用較差'];

第二個(gè)實(shí)例:

比如輸入一個(gè)景點(diǎn),給出景點(diǎn)所在的城市。

最low的辦法:
function getCityForScenic(scenic) {let _city=''if(scenic==='廣州塔'){_city='廣州'}else if(scenic==='西湖'){_city='杭州'}return _city; }
次low的辦法:
function getCityForScenic(scenic) {let _city='';let scenicOfHangZhou=['西湖','湘湖','砂之船生活廣場(chǎng)','京杭大運(yùn)河','南宋御街'];if(scenic==='廣州塔'||scenic==='花城廣場(chǎng)'||scenic==='白云山'){_city='廣州'}else if(~scenicOfHangZhou.indexOf(scenic)){_city='杭州'}return _city; }
次次low的辦法: (采用 switch case)
function getCityForScenic(scenic) {let _city='';let scenicOfHangZhou=['西湖','湘湖','砂之船生活廣場(chǎng)','京杭大運(yùn)河','南宋御街'];switch(true){case (scenic==='廣州塔'||scenic==='花城廣場(chǎng)'||scenic==='白云山'):_city='廣州';break;case (!!~scenicOfHangZhou.indexOf(scenic)):return '杭州'; }return _city; }

雖然上面的代碼出現(xiàn)的概率很小,但畢竟會(huì)出現(xiàn)。這樣的代碼可能會(huì)造成日后維看得眼花繚亂。如果使用了配置數(shù)據(jù)和業(yè)務(wù)邏輯分離,那就可以避免這個(gè)問(wèn)題。

配置數(shù)據(jù)和業(yè)務(wù)邏輯分離

function getCityForScenic(scenic) {let cityConfig={'廣州塔':'廣州','花城廣場(chǎng)':'廣州','白云山':'廣州','西湖':'杭州','湘湖':'杭州','京杭大運(yùn)河':'杭州','砂之船生活廣場(chǎng)':'杭州','南宋御街':'杭州',}return cityConfig[scenic]; }

不習(xí)慣對(duì)象的 key 名是中文。也可以靈活處理

function getCityForScenic(scenic) {let cityConfig=[{scenic:'廣州塔',city:'廣州'},{scenic:'花城廣場(chǎng)',city:'廣州'},{scenic:'白云山',city:'廣州'},{scenic:'西湖',city:'杭州'},{scenic:'湘湖',city:'杭州'},{scenic:'京杭大運(yùn)河',city:'杭州'},{scenic:'砂之船生活廣場(chǎng)',city:'杭州'}]for(let i=0;i<cityConfig.length;i++){if(cityConfig[i].scenic===scenic){return cityConfig[i].city}} }

這里簡(jiǎn)單總結(jié)下,使用配置數(shù)據(jù)和業(yè)務(wù)邏輯分離的形式,好處

1- 修改配置數(shù)據(jù)比業(yè)務(wù)邏輯修改成本更小,風(fēng)險(xiǎn)更低
2- 配置數(shù)據(jù)來(lái)源和修改都可以很靈活
3- 配置和業(yè)務(wù)邏輯分離,可以更快的找到需要修改的代碼
4- 配置數(shù)據(jù)和業(yè)務(wù)邏輯可以讓代碼風(fēng)格統(tǒng)一

但是并不是所有的if-else都建議這樣改造,有些需求不建議使用look-up改造。比如if-else不是很多,if判斷的邏輯不統(tǒng)一的使用,還是建議使用if-else方式實(shí)現(xiàn)。但是神仙數(shù)字,要清除。


配置對(duì)象代替switch

比如有一個(gè)需求:傳入cash,check,draft,zfb,wx_pay,對(duì)應(yīng)輸出:現(xiàn)金,支票,匯票,支付寶,微信支付。

需求也很簡(jiǎn)單,就一個(gè)switch就搞定了

function getPayChanne(tag){switch(tag){case 'cash':return '現(xiàn)金';case 'check':return '支票';case 'draft':return '匯票';case 'zfb':return '支付寶';case 'wx_pay':return '微信支付';} }

但是這個(gè)的硬傷還是和上面一樣,萬(wàn)一下次又要多加一個(gè)如:bank_trans對(duì)應(yīng)輸出銀行轉(zhuǎn)賬呢,代碼又要改。類(lèi)似的問(wèn)題,同樣的解決方案,配置數(shù)據(jù)和業(yè)務(wù)邏輯分離。代碼如下。

function getPayChanne(tag){let payChanneForChinese = {'cash': '現(xiàn)金','check': '支票','draft': '匯票','zfb': '支付寶','wx_pay': '微信支付',};return payChanneForChinese[tag]; }

同理,如果想封裝一個(gè)通用的,也可以的

let payChanneForChinese = {'cash': '現(xiàn)金','check': '支票','draft': '匯票','zfb': '支付寶','wx_pay': '微信支付', }; function getPayChanne(tag,chineseConfig){return chineseConfig[tag]; } getPayChanne('cash',payChanneForChinese);

總結(jié):

在特定場(chǎng)合下,代替if-else和switch的解決方案就是這么多了。if-else,switch本身沒(méi)錯(cuò),主要是想著怎么優(yōu)化代碼,讓代碼更加具有可讀性,擴(kuò)展性。

總結(jié)

以上是生活随笔為你收集整理的特定场景下取代if-else和switch的方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。