从事前端开发很久了,有幸在刚开始时就认识了一个教我面向对象思维的人,这种思维方式一直受用到今天。所以很想写一篇关于这方面的一点感受。对于一个码农来说,这样的文章不太好写,没有生动的图片,没有代码展示。但我觉得很重要,所以很想写出来。
js中的思维方式
当成为一个中级开发者的时候,是否还停在function的世界里
近年的js学习及工作节奏越来越快,一般的开发者在1〜2年就能晋升为中级开发者,熟练编程,了解不少类库。
但是很多中级开发者可能在接收到一个功能模块开发任务时,第一反应依然是我要引入哪些工具库,要写什么样或者多少个function才能完成这项工作。我所带的新人里面有不少是刚开始做一些营销活动类的专题页面,不复杂,但习惯就这么养成了,代码里面都是function调用,久而久之就成了一种思维习惯了。
告别纯function的思维,把自己提升到更高级的层面
我们知道,世界上的事情没有绝对的,只是在当前环境下的合理存在。
在从中级晋升到高级的路上,会接触到中大型的项目,这个时候纯function的代码就显示出来的劣势,一个功能模块可能会变复杂,调试以及阅读起来都很显得吃力。
当然如果你说,我逻辑好,记忆力强,写几百个function,别管写多少个闭包,别管怎么嵌套,我保证能正常工作,能完成功能迭代。那么我会说,你遇到我的话,不行,因为我会对你进行代码review,我会让你以后带人一起迭代项目,以后会让你把项目交接给别人。
之前我甚至有遇到用纯c写的用户基础服务系统,代码量庞大,纯funtion式的模式,结果这个项目组的工作就是从年初重构到年末,每次聊起来他们在干嘛,他们会说在重构代码。其实应该会大概想到,function之间的相互依赖调用,改动一处结构,调用的地方就要相应修改。可能略有夸张,但事实是频繁的重构对于效率的提升以及稳定性都有影响。
所以,没有固定的模式能在任何情况下能工作得很好,程序也一样。
在历史的发展中,面向对象的思想也是在同样的情况下发展起来了。把具有一定功能作用的模块抽象为类,能很好地解决共享、耦合等问题。
恰恰js也是面向对象的一门语言,在这种时候就要发挥强大的作用了。
抽象,让你的js进化
就像我上一篇关于一个小游戏的分享里,会抽象出来地图、金币、角色等对象模型,使用一个game
管理对象把用户的操作按一定的逻辑转换成上述对象的行为,这样一来,整个流程及代码就会显得更加简单清晰,阅读起来也很容易找到关键点。
在面向对象的世界里,我们会发现很多与现实世界类似的模式。又或者说,现实世界里的模式存在是大自然的杰作,必有合理性,那么也能被我们拿来运用到开发之中。
比如在考虑按一定顺序执行的问题,那么这是不是跟现实中排队去买机票一样,特权阶级可以插队或者进入vip通道,类似地,我们也会给需要执行的操作对象分配到不同的队列中,并根据他们排队的顺序或者操作对象的优先级进行队列运算。
甚至在做一些节日专题的h5动画中,我也会告诉一些新人,动画的效果你想象成现实世界里怎么显现会更加生动得体,而不是去copy一些固定的动画效果。比如圣诞节专题,假如你跟你的女朋友在一个下雪世界里,你希望的雪花是怎么样的效果,那你就按照这个效果去实现出来。比如你希望一个礼物怎么样的效果出现在你女朋友的手机屏幕上,她会开心,那你就把这种效果做出来。
学会思考,让自己进化
哲学家苏格拉底并没有什么哲学理论留给后人,只是引导人们要去思考,这反而更加重要。
当有一天你发现自己已经处在一种固定模式下运作的时候,也许就该考虑是不是要换一种思维看待世界看待js了。这也是从中级人员晋升为高级人员的必走之路,是对知识、经验的升华。
后话
写这篇文章可能有点偏离前端了,但确实是工作这么多年来感触最深的,以后的文章还是尽量偏技术一些。
关于面向对象思维,其实我是一直推荐给新人的,从一开始就尽量去用es6里的class,并慢慢理解为什么要写class,背后的原理是什么,class之间是什么样的关系,这样,从一些简单的入口去拓展自己的思维,会让人受益。
纵然我写面向对象,本文也并不是在推广、普及面向对象。还是之前那个观点,没有一个固定或者单一的模式能解决所有情景下的问题,学会思考,拓宽思维,才是最重要的。
如有错误,还望不吝赐教。内容均为原创,需要转载,请与本人联系。