代码质量
2020-04-16 11:10:08 0 举报
AI智能生成
前端代码质量
作者其他创作
大纲/内容
健壮性
意外情况下的应对能力
技巧
参数判断
typeof
try catch
node 中经常用到,<font color="#924517">读取文件、网络操作</font>
实例化检测
object <b>instanceof</b> constructor<br><br>检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。<br>
单例模式
<font color="#c41230">防止把全局对象 new 两次</font>
function store(){<br> this.store={<br><br> }<br> if(store.singleInstance){<br> //<b> 将 store.singleInstance 作为标志,在这里返回 this 的方法是不行的,<br> // 这里的 this 指的是 new 的过程中产生的新对象 </b><br> // return this <br> return store.singleInstance<br> }<br> // store.singleInstance=true<br> // <b><font color="#924517">单例模式必须将第一次产生的实例保存起来供下次使用</font></b><br> store.singleInstance=this<br> return this<br>}<br>var s1=new store()<br>var s2=new store()<br>s1.store.a=2333<br>console.log(s1,s2)<br>
复用性
不重复自己
技巧
组合与继承
<b><font color="#924517">继承基于类,组合基于方法</font></b>(组合不是基于类的)
组合大于继承<br><br><b><font color="#16884a">能用组合就不用继承</font></b>
组合优点
可扩展性强
享元模式
享元模式(Flyweight Pattern)主要用于<b>减少创建对象的数量,以减少内存占用和提高性能</b>。<br>这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。<br>
看了张容铭书中对应的章节,感觉就是把多个地方要用到的能提取单元的提取出来
可扩展(维护)
<font color="#16884a">从容面对需求改变</font>
<font color="#16884a">整体架构上一定要使用 mvc 模式</font><br>
基础
<font color="#16884a">低耦合模块</font>
技巧
装饰者模式
装饰模式指的是<b>在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能</b>。<br>它是通过创建一个包装对象,也就是装饰来包裹真实的对象。<br>
Vue 中的应用
对于数组的检测<br><br>异步编程脑图中的<br>AOP 面向切片编程<br>
Object.defineProperty(obj, prop, descriptor) 无法检测数组的变化<br><br>// vue-2.6/src/core/observer/array.js<br><br>methodsToPatch.forEach(function(method) {<br><b> // </b><font color="#16884a"><b>cache original method</b></font><br><b> const <font color="#924517">original = arrayProto[method]</font>;</b><br> def(arrayMethods, method, function mutator(...args) {<br><b> const <font color="#924517">result = original.apply(this, args)</font>;</b><br> const ob = this.__ob__;<br> let inserted;<br> switch (method) {<br> case "push":<br> case "unshift":<br> inserted = args;<br> break;<br> case "splice":<br> inserted = args.slice(2);<br> break;<br> }<br> if (inserted) ob.observeArray(inserted);<br><b> // <font color="#16884a">notify change</font></b><br><b> ob.dep.notify();<br> return result; </b><br> });<br>});<br>
职责链模式
解决请求的发送者与接受者之间的耦合,通过职责链上多个对象分解请求流程,实现请求在多个对象之间的传递,直到最后一个对象完成请求的处理。
步骤
<ol><li>分解需求<br></li><li>每个对象只做分内的事<br></li><li>无关的事情传到下一个对象中做,直到需求完成<br></li></ol>
优点
<font color="#16884a">即便项目经理某一模块需求不确定,也不影响开发其他模块</font>
方便进行单元测试
封装 axios,<br><b><font color="#16884a">方便给请求前请求后增加功能</font></b><br>
var a = new<b> myAxios</b>({<br> baseURL: "xxx"<br>});<br>a.send({<br> url: "xxx",<br> data: {},<br> <font color="#924517"> <b>beforeSend: function() {}</b></font><br>});<br>
function <b><font color="#16884a">myAxios</font></b>(axiosConfig) {<br> this.axios = <b>axiosBuild</b>(axiosConfig);<br>}<br>myAxios.prototype.send = function(config) {<br><b> beforeSend</b>.call(this, { <font color="#924517">cb: config.beforeSend</font>, url: config.url });<br> var sendPromise = <b>send</b>.call(this, config);<br> var afterData = <b>afterSend</b>.call(this, {<br> promise: sendPromise,<br> cb: config.afterCb<br> });<br> return afterData;<br>};<br>
function axiosBuild(config) {<br> const service = axios.create(config);<br> return service;<br>}<br>function<b> beforeSend</b>(config) {<br> this.axios.get("xxxurl" + config.url);<br> return <font color="#924517">config.cb.apply(this, arguments)</font>;<br>}<br>function send(config) {<br> var arg;<br> var state = {<br> get: function() {<br> var parse = qs(config.data);<br> return [config.url + parse];<br> },<br> post: function() {<br> return [config.url, config.data];<br> }<br> };<br> arg = state[config.type]();<br> return this.axios[config.type].apply(this, arg);<br>}<br>
状态模式
更好扩展(维护),<b><font color="#924517">也更易读</font></b>
示例
var m=new superMary()<br><b>m.putAction(['run','shot'])<br>m.run()</b><br>
// <b><font color="#16884a">将 if else 判断变成对象上的状态</font></b><br>function superMary(action){<br><b> this.state=[]</b><br><font color="#924517"> this.action={<br> run:function(){<br> },<br> jump:function(){<br> },<br> shot:function(){<br> }<br> }</font><br>}<br><br>superMary.<b>prototype.putAction</b>=function(action){<br><b> if(typeof action==='string'){<br> this.state.push(action)<br> }else{<br> this.state=action<br> }</b><br>}<br><br>superMary.<b>prototype.run</b>=function(){<br> <font color="#924517"> this.state.forEach((action)=>{<br> this.action[action]()<br> })</font><br>}<br>
0 条评论
下一页