[ JavaScript 代码质量优化之路-1 | 青训营笔记]

100 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天

一、本堂课重点内容:

  • 代码实践 - 交通灯

二、详细知识点介绍:

代码实践 - 交通灯

实现多个交通灯状态切换的功能。

版本1:使用多个setTimeout的嵌套,来实现每秒切换到另一个交通灯。

image.png

版本2(数据封装抽象):将交通灯的每个状态以及持续时间抽象出来变成状态列表,定义一个start方法,传入交通灯对象以及状态列表,用于进行状态切换。其中的applyState方法,先根据传入的序号,在状态列表中获取对应的状态以及持续时间,再在持续时间结束后递归调用自身,传入下一序号,切换状态。

版本优点:添加新状态时,只需要在状态列表中添加新的状态以及持续时间即可。

image.png

版本3(过程抽象):定义wait方法表示等待多长时间,用于计时。再定义一个异步poll方法表示一个轮循,在传入的function list中取出一个,用await进行apply。再定义一个异步setState方法进行状态的切换以及await wait方法进行持续。然后创建一个trafficStatePoll轮循,调用poll方法。传入poll方法的参数,是使用bind方法将参数传入setState方法中得到的结果。然后循环await trafficStatePoll方法,就可以实现交通灯。

版本优点:不仅可以解决交通灯问题,被抽象出来的poll方法还可以用于解决其他类似的问题,更具备灵活性和可扩展性。

版本缺点:代码过多且过于复杂。

image.png

版本4(异步+函数式):定义一个wait方法用于状态持续,定义一个setState方法用于状态切换,最后用一个异步start方法,循环执行一轮交通灯状态切换过程,单轮交通灯状态切换过程为:调用一个setState,传入下一状态;await一次wait方法,传入状态持续的时间。直到所有的状态都切换了一遍则为一轮。

版本优点:简单,贴近自然,可读性强。

image.png

三、课后个人总结:

通过多个setTimeout嵌套实现的方法可读性低,且需要添加状态时过程复杂;

而将数据抽象出来之后,交通灯状态的切换变成了一个function,增删状态时不需要再去改变function,而是改变状态列表即可,增删方式更为简单,代码可读性也得到了提高;

另外,还可以将过程抽象出来,将状态的持续抽象为方法wait,再将设置状态并wait的过程设置为方法setState,然后将切换传入的列表项的过程抽象为poll方法,将调用poll并传入通过bind设置了参数的setState方法声明为trafficStatePoll,最后循环调用trafficStatePoll即可.这个方法的可读性稍差,代码较多,但是抽象出来的方法具有较强的灵活性和可扩展性;

最后是异步+函数式的方法,将状态持续和状态切换抽象成两个方法,然后设置多次的状态切换与持续为一个循环,在每次状态切换和持续时可以传入不同参数,设置不同的状态以及持续时间。这个方法较为贴近自然,可读性很强。