论AOP面向切面编程思想
原文:https://mp.weixin.qq.com/s/8klfhCkagOxlF1R0qfZsgg
【前言】
AOP(Aspect-Oriented Programming)面向切面编程思想已经有多年历史了,但是在.Net里面一直没有得到重视,不过这在MVC框架后被变革了,AOP思想开始在.Net流行起来,各种框架组件里面,面向切面已经是标配了,各种笔试面试的过程中,更是不可或缺的!下面Eleven就来好好说说对AOP的理解,以及在.Net里面几种实现方式。
1【面向对象编程】
面向对象编程OOP大家都耳熟能详,熟练的不能再熟练了,但是这真的是一个很伟大的设计思想!软件设计因为引入OOP而逐渐变得丰富起来。“一切皆为对象”的精义,使得程序世界所要处理的逻辑简化,开发者可以用一组对象以及这些对象之间的关系将软件系统形象地表示出来。而从对象的定义,进而到模块,到组件的定义,利用OOP的封装、继承、多态,让软件开发可以像建房那样循序渐进,先烧砖(类)到砌墙(类库),从楼层(模块)到大厦(系统),甚至可以建立整个城市(互联网)!
在一些简单的小应用上,OOP可能还觉得麻烦,但是在设计规模更大、逻辑更复杂的系统时,开发周期反而能变的更短。有了OOP,我们才能化繁为简,用一种模式然后叠加,最终去建立大型复杂的系统,面向对象设计技术居功至伟。
2【OOP的问题】
面向对象设计的唯一问题是,它本质是静态&封闭,任何需求的细微变化都可能对系统造成重大影响。常见的解决办法是设计模式(DesignPattern)。GOF将OOP设计经验总结为设计模式,让开发者能复用成功的设计和体系结构。设计模式解决特定的设计问题,使面向对象设计更灵活、优雅,最终复用性更好。然而,设计模式虽然给了我们设计准则与典范,最大程度的利用面向对象特性,诸如利用封装、继承、多态,对责任进行分离、对依赖进行倒置,面向抽象,面向接口,最终设计出灵活、可扩展、可重用的类库、组件,乃至于整个系统的架构。在设计的过程中,通过各种模式体现了对象的行为,暴露的接口,对象间关系,以及对象分别在不同层次中表现出来的形态。然而鉴于对象封装的特殊性,“设计模式”的触角始终在接口与抽象中大做文章,而对于对象内部则无能为力。
3【AOP面向切面编程】
AOP恰好可以做到这个!它支持动态修改OO模型,能在不破坏封装的前提下,动态的扩展功能!就像现实世界中,对象也会在其生命周期中不断变化,应用程序也可以拥有新的功能。AOP剖解开封装的对象内部,将那些分散在多个类的共同行为封装成一个可重用模块,并将其名为“Aspect”,就是将那些与业务无关,却为业务模块所共同调用的逻辑,如事务、日志、权限、缓存等封装起来,可以减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
由于软件系统越来越复杂,大型的企业级应用越来越需要人们将核心业务与公共业务分离。AOP能支持分离通用服务形成统一功能架构,能够将应用程序中的业务逻辑和通用服务进行分离,让开发人员专注于企业的核心业务逻辑,通用逻辑通过AOP的方式统一提供!
4【AOP优势】
AOP其实是OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。而AOP却能做到把动态修改对象,将通用功能注入!
AOP前:权限/异常/日志/缓存功能需要写入每个具体的业务功能模块,AOP后:权限/异常/日志/缓存功能封装成独立的模块,能动态提供给不同的业务模块。具体分析,OOP程序设计结合上AOP,优势主要表现在:
1、将通用功能从业务逻辑中抽离,可以避免大量重复代码(不需要到处都写),有利于代码维护升级,也有利于项目的规范化开发(通用功能不再是各写各样);
2、AOP有利于软件设计的模块化,降低软件架构的复杂度。能把通用功能抽出来,那么在系统设计时就只需要专注于业务逻辑开发设计(不再操心通用功能)。
【结语】
大谈了一篇纯理论性的东西,不知道小伙伴儿们能get多少,后续会更新多篇Demo,从C#的具体实现来看看AOP的效果。欢迎关注公众号,欢迎讨论,欢迎转发,愿天下有需求的人都能看到!
欢迎关注公众号【程序员在职场】获取更多干货~
喜欢本文章的朋友,欢迎关注公众号【程序员在职场】支持一下作者。