什么是面向切面编程?为什么要面向切面编程? 说这个问题之前,我们先来花一分钟时间回顾一下软件发展简史。在最高的时候,软件开发是面向过程的实现方式,各个模块之间顺序调用,实现自己的功能,当初C语言大为流行,大家就知道为什么了,因为它的设计很简单,而且面向过程的编程支持做的非常好。但是后来,随着软件规模的发展,这种做法使得软件代码难以难度,因为代码量太大了嘛,你调我我调你,来回调,一不小心就互相等待,结果就完蛋了。所以,就出来了各种面向模块的设计,把软件拆分成若干个模块,然后分给不同的团队开发,在这各个模块之间约定一个统一的互相调用或者依赖的接口,这种做法确实解决了前面说的这些问题,但是它仍然面向着一个很严重的问题没有解决,那就是各个软件模块之间,代码重复量很高,复用价值低,重复劳动难以避免,而且对于一些共性的东西,不好统一管理,所以就出来了面向对象编程(OOP),面向对象编程在前人发展的基础上,对公共的模块,进行抽象,区分为属性和行为两种东西,然后对这些东西归纳为统一的公共的接口让别人使用,而把它们的具体的实现和一些细节都隐藏起来,这就方便多了,再配以多态、继承等特性,可以非常好的解决大型的复杂的问题。而且这种做法更加切近于现实社会人们解决问题的思维方式,易于理解和掌握,所以应用非常广泛。
然而,世界是变化的,一切都在发展,几十年过去了,我们的软件规模的复杂程度进一步升级,甚至复杂到了人类不能解决而必须依赖机器的程度(这可能是未来的趋势吧),这个时候,出现了新的问题,比如一个超大型的电商网站(比如万能宝),它里面有很多的东西,超级复杂,然而罗马不是一天建成的,这是一个逐步的过程。我们设想这个事情是这样的:项目刚启动,也没有什么客户,需求方说做简单点吧,能保存商品、能售卖商品就完事了,两个星期完成就行,不能再久了。所以这样的功能很快就上线了,后来,逐渐有了用户,需求就变了,我们需要用户管理系统,需要商品系统、需要支付系统、需要库存管理系统、需要供应链管理系统、需要物流管理系统、需要商家管理系统、需要监控系统、需要安全系统。。。这个事情已经变的复杂到了无以复加的程度。更要命的是,这里的这些东西的需求,它们是不同的,比如说物流管理系统,它是个独立的系统,开发出来之后公开一些接口就可以让别人调用为别人服务了,而安全系统和监控系统这类东西则不然,它是要贯穿于任何系统之中的,我们需要在众多的系统和服务中设计、开发、测试、配置、管理、维护它们,而且,我们还需要对每一个重要的操作都做到具有事务性。
所谓操作的事务性,我个人的理解,也就是记录一些重要操作的每一个具体步骤,要么全部成功,要以全部失败,如果其中有任何一个步骤失败了,整个操作都要执行回滚,确保数据不能乱,设想一下用户付款给平台成功了而平台给商户付款失败了,结果用户付钱了商户没发货,而这个事情却扔在那里没人管,这是什么情景。。。谁来平息他们的怒火补偿他们的损失。。。