0 2 4 0 ★ 平行宇宙下的玄武和小不二 |【还不来学 JS】
本帖最后由 不二如是 于 2019-8-30 15:12 编辑上一篇:0 2 3 9 ★ JS 函数编写的#4条心法
static/image/hrline/2.gif
JavaScript 很腻害这件事,咱们今天就不提了,有兴趣的鱼油出门左转:臊瑞会JS真的了不起?!
https://xxx.ilovefishc.com/forum/201901/20/144900t2990fm0efc292ao.gif
在隔壁平行宇宙中(设计模式系列:传送门),新入职的“小不二”和“玄武大神”的职场爱恨情仇还在上演着。
小不二
玄武大佬
开始前,先剧透一下用到的知识点:
[*]if/else
[*]switch
[*]一元判断时:存到Object里
[*]一元判断时:存到Map里
[*]多元判断时:将condition拼接成字符串存到Object里
[*]多元判断时:将condition拼接成字符串存到Map里
日常开发中,我们编写 js 代码时经常遇到复杂逻辑判断的情况,通常大家可以用 if/else 或者 switch 来实现多个条件判断。
但这样会有个问题,随着逻辑复杂度的增加,代码中的 if/else/switch 会变得越来越臃肿,越来越看不懂。
越是简单的事情,越能看出一个程序猿技术的高下,废话不多了,有请我们的主角登场。
平行宇宙
这不今天,无良的甲方粑粑,又有新任务了:
鱼C-IT培训学院(土掉渣系列)新学期即将开始,课程报名流程需要优化,现分为:1、开课进行中 2、开课失败 3、教材售空 4、开课成功 5、取消选课;望鱼兮科技公司,完成迭代优化。
看到这份“详细”的业务说明,玄武把小不二叫过来:“小不二,最近看你进步很多,有件事情交给你做,优先级最高,邮件抄送给你了。”
“好的”,小不二只得暂时放下手头的事情,开始处理大佬交待的事项。
看完项目需求,小不二心想:“自己果然进步了,这件事情,分分钟搞定!”
福至心灵,摘掉耳机,远离轻音乐,开启“心流”模式,撸起代码,先来个格调高的注释:
/**
* 2033.1.23 鱼C-IT学院流程建档
* 按钮点击事件下,不同状态
* @program {number} status 活动状态:
* 1、开课进行中 2、开课失败 3、教材售空 4、开课成功 5、取消选课6、其他
*/
需求中说:
当用户单击提交选课按钮后,针对不同的状态反馈相应的信息。
好吧,既然如此,用最简单的 if/else 来实现:
function onButtonClick(statue){
if(status == 1){
sendLog('running');
jumpTo('indexPage');
}
else if(status == 2){
sendLog('fail');
jumpTo('failPage');
}
else if(status == 3){
sendLog('fail');
jumpTo('failPage');
}
else if(status == 4){
sendLog('success');
jumpTo('successPage');
}
else if(status == 5){
sendLog('cancel');
jumpTo('cancelPage');
}
else{
sendLog('other');
jumpTo('indexPage')
}
}
这样基本的按钮逻辑就实现了:
根据不同活动状态做两件事情,发送日志埋点和跳转到对应页面。
写完代码,小不二突然回想起之前玄武大佬因为自己写的方法不够“高级”,说给项目组蒙羞...
算了,基本业务逻辑有了,用 const 和 switch 来重写:
const onButtonClick = (status)=>{
switch(status){
case 1:
sendLog('running');
jumpTo('indexPage');
break;
case 2:
case 3:
sendLog('fail');
jumpTo('failPage');
break;
case 4:
sendLog('success');
jumpTo('successPage');
break;
case 5:
sendLog('cancel');
jumpTo('cancelPage');
break;
default:
sendLog('other');
jumpTo('indexPage');
}
}
嗯,这样看起来比 if/else 清晰多了,代码量也得到优化了。
既然 status 中 2 和 3 逻辑一样,合起来处理也没问题。
写完第二个版本,小不二觉得这还不行!
上周五开组会,玄武大佬特意说了一点“江湖潜规则”:
**** Hidden Message *****
既然如此,一定要相应领导号召,如果用数组关联一下,代码还能更直观些:
const actions = {
'1':['running','indexPage'],
'2':['fail','failPage'],
'3':['fail','failPage'],
'4':['success','successPage'],
'5':['cancel','cancelPage'],
'default':['other','index']
}
const onButtonClick = (status)=>{
var action = actions || actions['default'];
sendLog(action);
sendLog(action);
}
等小不二自己写完这段代码,突然有了那么一丝丝的小骄傲。
这个方法让代码看起来更加清爽了。
将判断条件作为对象的属性名,将处理逻辑作为对象的属性值,这样当单击按钮时,通过对象属性查找的方式就可以进行逻辑判断。
这样就可以发给玄武大佬啦!
不对,还不能提交?!
不知道怎么肥四,还是突然接收到宇宙中的神奇量子波动...
小不二突然想到上午看到的 ES6(EcmaScript 6)中有一个 Map 对象也可以用到。
(PS:程序猿的精进时刻(bug时刻),往往在于此,渴望将自己看到的新技术用到实际开发中)
Map 对象和我们现在创建的 Object 对象还是有区别滴:
一个对象通常都有自己的原型,所以一个对象总有一个"prototype"键。
一个对象的键只能是字符串或者Symbols,但一个Map的键可以是任意值。
你可以通过size属性很容易地得到一个Map的键值对个数,而对象的键值对个数只能手动确认。
这就意味上面的代码还可以写为:
const actions = new Map([
],
],
],
],
],
['default',['other','index']]
])
const onButtonClick = (status)=>{
var action = acctions.get(status) || actions.get('default')
sendLog(action);
sendLog(action);
}
哈哈哈,写了 3 种方案(switch、数组、Map),可以像玄武大佬交差了。
“玄武大佬,代码我提交过去了,您看一下{:10_256:} ”,小不二边微笑,边在通讯软件上打字。
“好的,我来看一下”
5min后...
“小不二,代码可以是可以,你没有判断用户的身份呐?!”
“阿{:10_266:} ,我现在加上...”,小不二有点尴尬。
"嗯,以前咱们按钮单击时候只需要判断 status,现在还需要判断用户的身份:guest 游客 ;student 学生"
“好的”,小不二赶紧回复到。
“对了,还有,基本结构就用你最后的 Map 对象”
“好的,我现在弄。”
“好,争取下班前给我。”
和玄武短暂沟通后,菜鸟小不二开始修改代码,算了明明需求中没有,估计又是金主粑粑口头交待的...
既然两种用户身份:guest 游客 ;student 学生,那岂不是就有 2*5=10+default=11 种 actions:
const actions = new Map([
],
],
],
],
],
],
],
],
],
],
['default',['other','index']]
])
然后单击事件中需要获取身份和状态,然后调用:
const onButtonClick = (identity,status)=>{
var action = acctions.get(`${identity}_${status}`) || actions.get('default');
action.call(this)
}
把两个条件拼接成字符串,并通过以条件拼接字符串作为键,以处理函数作为值的 Map 对象进行查找并执行。
这种写法在多元条件判断时候还是很好用滴。
先这样吧,发给玄武大佬。
“嗯,不错,小不二你进步不少{:10_275:} ”
“谢谢大佬夸奖”
“还有,虽然目前用户没有提,但是万一哪天金主粑粑,想让 student 访客下,status 1到3逻辑一样怎么办?这个不着急,你先想想吧。”
“好的好的,我先把手头的刚才的开发完成,后续再来优化。”一看到不着急,小不二悬着的心放下了。
其实这个也好实现,只要在 Object 对象中返回一个 Map 对象就可以了。
不过,先不实现了,我的进度吖...
美好的一天就这样结束了...
(加班就这样开始了)
static/image/hrline/2.gif
下一篇:0 2 4 1★ How JavaScript Grew Up and Became ... |【中英】
如果喜欢,别忘了评分{:10_281:} :
http://xxx.fishc.com/forum/201709/19/094516hku92k2g4kefz8ms.gif
这位鱼油,如果喜欢本系列Js帖子,请订阅 专辑☞(传送门)(不喜欢更要订阅{:10_297:} )
我还没有学到那个地步呢。你们太厉害了
龟速学习中{:10_245:} 666 11 本帖最后由 TCY 于 2019-2-16 11:42 编辑
你还是加到设计模式中吧……好久没更新了 0 看看内容 朕想知道 打卡打卡,从0000到0240利用上班空闲时间看完了一遍不二大神写的JavaScript庖丁解牛,虽然真正记住的可能还不到百分之一,不过还是有很多启发。等后面小甲鱼老师的视频出来再深入了解,。, 嘤嘤嘤 666
{:10_257:} 看看潜规则,hhh hahaha ? 6666 {:10_277:} 1
页:
[1]
2