不二如是 发表于 2019-1-23 09:53:21

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:} )

chaowei2008 发表于 2019-1-25 16:36:16

我还没有学到那个地步呢。你们太厉害了

qianduan2018 发表于 2019-1-25 21:25:36

龟速学习中{:10_245:}

qiuyouzhi 发表于 2019-1-30 19:28:49

666

longren_fu 发表于 2019-2-10 15:56:07

11

TCY 发表于 2019-2-16 11:40:07

本帖最后由 TCY 于 2019-2-16 11:42 编辑

你还是加到设计模式中吧……好久没更新了

符华 发表于 2019-2-28 19:10:20

0

zhanyy08 发表于 2019-3-8 14:58:41

看看内容

鱼小二 发表于 2019-3-12 17:44:04

朕想知道

a641743376 发表于 2019-3-15 15:15:10

打卡打卡,从0000到0240利用上班空闲时间看完了一遍不二大神写的JavaScript庖丁解牛,虽然真正记住的可能还不到百分之一,不过还是有很多启发。等后面小甲鱼老师的视频出来再深入了解,。,

被遗弃的咸鱼干 发表于 2019-4-8 09:57:00

嘤嘤嘤

My_A 发表于 2019-5-26 16:58:17

666

Qmh 发表于 2019-7-3 12:13:23

{:10_257:}

天地~玄黄 发表于 2019-7-11 16:20:50

看看潜规则,hhh

逗泥玩 发表于 2020-1-17 22:03:48

hahaha

weiter 发表于 2020-2-29 22:45:06

?

287187056 发表于 2020-4-2 23:20:31

怀南哥哥 发表于 2020-5-8 10:16:42

6666

tianyuan 发表于 2020-5-12 11:04:44

{:10_277:}

优时风 发表于 2020-5-22 13:58:06

1
页: [1] 2
查看完整版本: 0 2 4 0 ★ 平行宇宙下的玄武和小不二 |【还不来学 JS】