资讯专栏INFORMATION COLUMN

筛选未知的最优解-迭代器模式

Coly / 844人阅读

摘要:而事实上为了消除这个现象,衍生出来的模式有很多,比如策略模式,单例模式,迭代器模式等。比如自己定义一个迭代器这就是一个简单的内部迭代器。迭代器的应用说了迭代器的基本原理后,应该来点干货了。

程序的bug王

请不要被标题所迷惑,这样说bug王,只是为了吸睛。 在程序的世界里,我们要多喝茶,慢慢聊。回归正题,这里想说的bug王指的是条件的分支语句。 比如: if...else if...else if... else if.........esle... 。想这样的。
看个实例:

var model = function(flag){
    if(flag===0){
        return "this is zero";
    }else if(flag === 1){
        return "this is first";
    }else if(falg === 2){
        return "this is second";
    }else {
        ...
    }
}

像这样的。 因为每一次条件判断都是对性能的一次rape。而事实上为了消除这个现象,衍生出来的模式有很多,比如: 策略模式,单例模式,迭代器模式等。这里主要想讲一下,迭代器模式.

迭代器模式

迭代器其实就是一个遍历,能够顺序遍历一个聚合对象中的一些属性. 比如数组中的.Array.prototype.forEach。
其实就是遍历,然后将获得的参数进行回调处理(!!!注意,迭代器最重要的一点就是将循环中的遍历数组的参数传给回调函数处理.)

var arr = [1,2,3,4,5];
arr.forEach(function(val,index,arr){
    ...
})

而且迭代器模式你可以自定义迭代,比如内部迭代,外部迭代,顺序迭代,倒序迭代等等. 由于懒,所以就列一个比较常见的顺序迭代吧。
通常也就是使用了for循环来构建的。 比如自己定义一个迭代器

var each = function(arr,fn){
    for(var i = 0,val;val = arr[i++];){
        if(val==false){
            break;
        }
        fn(val,index,arr);
    }
}

这就是一个简单的内部迭代器。即将数组类型进行简单的遍历,然后如果遍历完成则返回。

迭代器的应用

说了迭代器的基本原理后,应该来点干货了。
迭代器在各种语言中,差不多都已经普及了,所以重构已有的方法是没有什么价值的。但迭代器最主要的功能是自定义一些系列算法,将所需要的提取出来. 比如: 事件模型事件的获取。

var bind = (function() {
    if (document.addEventListener) {
        return function(ele, fn, type) {
            ele.addEventListener(type, fn, false);
        }
    } else if (document.attachEvent) { //检测低版本的IE
        return function(ele, fn, type) {
            ele.attachEvent(type, fn);
        }
    } else {
        return function(ele,fn,type){
            ele[`on${type}`] = fn;
        }
    }
})();

可以看出里面充斥着分支语句,为了消除分支。可以将不同的方法包装起来,然后使用迭代器统一遍历.

var bind = (function(){
    var DOM2 = (function(){
         if (document.addEventListener) {
             return function(ele,fn,type){
                 ele.addEventListener(type,()=>{fn();},false);
             }
         }else {
             return false;
         }
    })();
    var IE = (function(){
        if(document.attachEvent){
            return function(ele,fn,type){
                ele.attachEvent(type,fn);
            }
        }else{
            return false;
        }
    })();
    var DOM0 = function(ele,fn,type){
        ele[`on${type}`] = ()=>{fn();};
    }
    //添加迭代器
    var Itera = function(){
        for(var i = 0,val;val = arguments[i++];){
            if(typeof val === "function"){
                return val;
            }
        }
    }
    return Itera(DOM2,IE,DOM0);
})();
console.log(bind);  ////function (ele,fn,type){ele.addEventListener(type,()=>{fn();},false);}

接着你就可以使用bind()函数进行事件的绑定处理。但是这个应该算是将原来简单的变复杂了,因为现在事件模式几乎只有这3种(原生). 拓展性我就不说了。 所以一般用来判断事件绑定的话,推荐还是使用上面那个方式,来得更直接.
但可以从上面的例子可以看出,迭代器模式只是提供一种思想,提取最精华的部分,通过遍历选出最优解。模式这么多,关键要找到最适合你的。还是那句话,如果这个坑 坑不死我,我一定会踩更多的坑。 所以多实践,多学习,多踩坑才是进步的证明。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91598.html

相关文章

  • 全新视角:用变分推断统一理解生成模型

    摘要:相比于,它将也作为隐变量纳入到变分推断中。结论综述本文的结果表明了变分推断确实是一个推导和解释生成模型的统一框架,包括和。 作者丨苏剑林单位丨广州火焰信息科技有限公司研究方向丨NLP,神经网络个人主页丨kexue.fm前言我小学开始就喜欢纯数学,后来也喜欢上物理,还学习过一段时间的理论物理,直到本科毕业时,我才慢慢进入机器学习领域。所以,哪怕在机器学习领域中,我的研究习惯还保留着数学和物理的...

    tinylcy 评论0 收藏0
  • 贪心算法

    摘要:贪心算法与动态规划算法的差异贪心算法和动态规划算法都要求问题具有最优子结构性质,这是类算法的一个共同点。 贪心算法的基本要素对于一个具体的问题,怎么知道是否可用贪心算法解此问题,以及能否得到问题的最优解呢?这个问题很难给予肯定的回答。但是,从许多可以用贪心算法求解的问题中看到这类问题一般具有2个重要的性质:贪心选择性质和最优子结构性质。 1、贪心选择性质所谓贪心选择性质是指所求问题的整...

    missonce 评论0 收藏0
  • 算法导论笔记动态规划DP详解-钢条切割的分析与实现

    摘要:假定出售一段长度为英寸的钢条的价格为单位,钢条长度均为整英寸。注若长度为英寸的钢条的价格足够大,最优解可能就是完全不需要切割。考虑长度为的情况,下图给出了英寸钢条的所有切割方案。 DP和分治的相似 都是通过组合子问题的解来求解原问题。 DP中的programming指的是一种表格法,而非coding。 DP和分治的不同 分治步骤:(例如归并排序) 将问题划分为互不相交的子问题 ...

    shinezejian 评论0 收藏0

发表评论

0条评论

Coly

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<