zoukankan      html  css  js  c++  java
  • 高阶函数实现AOP

          AOP(面向切面程序)的主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日至统计、安全控制、异常处理等。把这些功能抽离出来之后,再通过“动态织入”的方式掺入业务逻辑模块中。这样做的好处首先是可以保证业务逻辑模块的纯洁和高内聚性,其次是可以很方便的复用日志统计模块。在JavaScript中实现AOP,都是只把一个函数“动态织入”到另一个函数之中,具体实现技术很多,现在用prototype来实现一个

    面向切面程序

    Function.prototype.before=function(beforefn){
        var self=this;//保存原函数的引用
        return function(){//返回包含了原函数和新函数的“代理”函数
            beforefn.apply(this,arguments);//执行新函数,修正this
            return self.apply(this,arguments);//执行原函数
        }
    }
    Function.prototype.after=function(afterfn){
        var self=this;//保存原函数的引用
        return function(){//返回包含了原函数和新函数的“代理”函数
            var ret=self.apply(this,arguments);//执行原函数
            afterfn.apply(this,arguments);//执行新函数,修正this
            return ret;
        }
    }
    
    var fn=function(){
        console.log("fn");
    }
    fn=fn.before(function(){
        console.log("before");
    }).after(function(){
        console.log("after");
    });
    
    fn();

     使用场景

      AOP(面向切面程序)使用的场景还是很多的,那最简单例子来说,现在小明入职刚刚入职,之前他们写的代码小明还没时间看,现在呢!要小明实现一个form表单提交前验证。小明看了看之前的验证规则,是一个很大的函数,内部代码混乱不堪,无从下手,甚至不知道修改了会不会影响其他功能。现在AOP(面向切面程序)就给我们提供了方便。下面我给大家演示一下怎么使用。

    Function.prototype.before=function(beforefn){
        var self=this;//保存原函数的引用
        return function(){//返回包含了原函数和新函数的“代理”函数
            if(beforefn.apply(this,arguments)){
                return self.apply(this,arguments);//执行原函数
            };//执行新函数,修正this
        }
    }
    
    var fn=function(){
        console.log("form表单提交");
    }
    fn=fn.before(function(){
        if(1==1){
            console.log("验证通过");
            return true;
        }else{
            console.log("验证失败");
            return false;
        }
       
    })
    
    fn();

    可以看出,我们不需要知道你这个函数内容是什么。我们只关心我们写的代码,用户提交的数据是否正确。

    简单方式实现AOP(面向切面程序)

    function ajax(){
         console.log("fajax提交");
    }
    var ajaxfn=ajax;//把ajax函数引用保存起来。
    var ajax=function (){//重新ajax函数;
        if(1==1){
            console.log("验证通过");
        }else{
            return false;
        }
        //先验证上边代码在执行ajax提交
        ajaxfn();
    }
    ajax();

    这种方式会修改原函数,重新ajax时候一定要用函数表达式,不能用函数声明。因为函数声明会前置。类似于变量提升一样。

    总结:

         AOP(面向切面程序)在实际应用中还是很广泛。希望上边的方法能够帮助你写出更为简洁的代码处理复杂的业务。如果有不对的地方希望大家指出。

  • 相关阅读:
    Suricata的输出
    Setting up IPS/inline for Linux in Suricata
    Suricata的初始化脚本
    Suricata的Reputation
    Suricata的配置
    Suricata的性能
    Suricata里的规则与Snort区别之处
    Suricata的命令行解释
    [转]ASP.NET 成员资格 Part.1(API)
    [转]ASP.NET MVC4+BootStrap 实战(一)
  • 原文地址:https://www.cnblogs.com/xiaoxiaokun/p/7224016.html
Copyright © 2011-2022 走看看