flyisland
  • 2004-04-24

    由AOP想到建模语言的进步

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://flyisland.blogbus.com/logs/152245.html

    在学习AOP的过程中,面临这样一个问题:AOP究竟带来了什么?在思考的过程中,自己隐隐约约有了一些想法,而在看到Booch的这一段话后,我得出自己的结论:技术的发展都可以看成是“建模语言”的发展,建模语言的进步就是提高我们对复杂系统的建模能力。
     
    Booch:我对OO编程的目标从来就不是复用。相反,对我来说,对象提供了一种处理复杂性的方式。这个问题可以追溯到亚里士多德:您把这个世界视为过程还是对象?在OO兴起运动之前,编程以过程为中心--例如结构化设计方法。然而,系统已经到达了超越其处理能力的复杂性极点。有了对象,我们能够通过提升抽象级别来构建更大的、更复杂的系统--我认为,这才是面向对象编程运动的真正胜利。
     
    当我们基于一种语言来设计系统,可以看作是用这种语言对系统进行建模,总会遇到很多仅仅在语言级别无法解决的问题,于是开发者就会建立自己的方法库(Library)或者框架(Framework)。这方面MFC就是一个很典型的例子,当时C++语言没有提供诸如RTTI、Persistence等特性,但是开发者可以通过MFC得到这些特性(候捷《深入浅出MFC》第三章“MFC六大关键技术之仿真”详细说明了其实现方法)。
     
    但是基于框架对存在一些较大的不足,开发者可能会担心框架锁定,而且需要遵循一些额外的规则(例如MFC中的宏);更重要的是在交流方面有很大的困难。当一个MFC开发者向另一个OWL开发者提到“Persistence”也许会很困难,因为OWL可能用的是另外一种叫法(举例子而已,我对OWL很不熟悉)。因为标准的“建模语言”不存在这个概念,所以尽管我们能够实现相关的技术,但是在进行描述的时候仍可能存在很大的问题。
     
    《设计模式》在最后一章“结论”中提到设计模式带给我们的第一个影响就是“一套通用的设计词汇”,我的看法这就是丰富了我们的“建模语言”。有了设计模式后,不仅仅总结了一些好的经验,更重要的是增强了我们描述复杂系统的能力。例如在现在的Web开发中,当你提到“这部分我们采用MVC模式来实现”的时候,是如此轻易地表达了一个复杂的实现;假如不存在“MVC模式”的说法,那么相同的内容的表达将困难很多。
     
    一个更好的例子就是Java语言,它在语言级别提供了很多特性,包括RTTI(instance of), Persistence(java.io.Serializable), Dynamic Creation(java.lang.Class.forName()/newInstance())等等。这些特性在其他语言中也能做到(通过框架实现),也许并不能说Java比其他语言强多少,Java能够开发的系统别的语言也能够实现。但是在语言级别提供的特性,也就等于是扩充了我们的“建模语言”,在Java的世界中,描述一个复杂系统会更加容易。
     
    这种“建模语言”的发展,也许在初期不易体会到其进步,但是潜移默化下我们“自然而然”地提高了描述/设计复杂系统的能力。
     
    回到AOP上面来,也许在了解AOP之后我们会觉得它的原理很简单,因为解决横切问题的方法以前也是存在的。但是当AOP进入我们的“建模语言”之后,也就是存在非常通用、成熟的框架实现或者干脆加入Java语言,许多曾经困扰我们的问题(例如AOP的御用例子——日志和授权),就会在你说到“这部分采用AOP来实现”而烟消云散。
     
    所以当出现一个新名词时,不必过于紧张,也许它所表达的内容根本就是你已经实现过的;但也不要鄙视它,说“其实是起了个新名字来唬人”,也许一个统一的名字背后就是一次革新。

    历史上的今天:


    随机文章:

    Spring Web Flow 2005-06-05

    收藏到:Del.icio.us




    Tag:技术