`
LD_21
  • 浏览: 130101 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

【转】侵入式与非侵入式设计的含义

阅读更多

有读者讲“侵入式”这一术语无法理解,这里给一个简单解释,是我个人的看法。

在设计一个类时,按理说,需要考虑的应该只是该类所企图表示的那个“概念”本身:为表示有关概念应记录哪些信息,该类的对象与外界交换信息的界面等等。但定义这个类并不是为了放在那里观赏,而是为了使用。在考虑类对象的使用时,使用环境的一些要素就可能“侵入”这个类的设计之中。实际上,许多情况下我们常常可以在“侵入式”设计和“非侵入式”设计之间做一个选择,不同选择各有优缺点。在考虑非类的程序部分时,这种问题也同样存在。

例如,我们可能需要对类A的对象做引用计数,这里有两种基本可能性:将计数功能纳入类A的设计内(侵入式引用计数设计,此时类A的对象中包含了与引用计数有关的要素,这显然是与类A所要表示的概念无关的东西),或者将计数功能放在类A之外(非侵入式引用计数)。

本书中讨论容器时提出了“侵入式容器”设计和“非侵入式容器”设计的概念:当我们希望将类A的对象放入一种容器时,是否需要将该容器的实现要素“侵入”类A的设计实现之中(这显然是与类A本身并无必然关系的要素)。不同考虑导致不同的容器设计。  

 

我基本上知道了,从夏大虾得著作中得知。
比如struts,需要继承一些struts得类,这就是侵入式,使得系统离不开那个框架。
而spring中,业务类不需要继承框架得类,将来抛弃spring也比较方便。
楼上大虾(土豆块)能否谈下ejb与spring之间得关系。你用ejb吗?如果用了,感觉如何?

 

非侵入式(non-intrusive)设计是目前非常热门的话题。在一般的讨论中,非侵入式设计总是和Spring这样的IoC容器或者AOP技术联系在一起。但是从思想上说,non-intrusive并不等价于IoC或者AOP,它是一个比AOP更加宽泛的概念。
      首先,我们考察一下何谓intrusive。典型的intrusive实现是继承特定的基类, 或者实现特定的接口. 在抽象的意义上说, intrusive意味着在基础结构中预留了一些特殊的,专用的结构, 这些结构对于基础功能而言不仅仅是无用的, 甚至是有害的, 例如影响性能或者模糊了原有的概念结构, 而系统整体的后期扩展能力也受到这些预设的结构通道的限制.
non-intrusive设计的基本特点是尽量利用基础结构的元素, 而不是引入额外的特殊结构.例如, 在witrix平台的tpl模板中
<button tpl:tag="ui:FlatButton" value="xx" onclick="alert('ok')" />
如果后台tpl引擎不解析<ui:FlatButton>标签, 那么该标签的表现就是普通的html button. 这里整个页面的界面表现结构没有被tpl标签所破坏,而如果像jsp tag那样强行规定必须采用节点语法, 即
<ui:FlatButton value="xx" onclick="alert('ok')" />
则在没有tpl引擎的情况下, 界面结构被tpl标签所破坏,此时在dreamweaver这样的可视化工具中我们无法再识别出有效的界面元素, 丧失了WYSIWYG编辑的能力.
tpl:tag属性属于html语法本身规定了的自定义属性, 它在html中的存在是符合规范的, 而且它对于button来说没有造成什么限制或损害, 因而是一种无害的标记. 在没有tpl模板引擎的情况下, tpl:tag属性与其他自定义属性一样处于同样的地位, 没有什么特殊的作用. 而一旦tpl模板引擎识别出该特殊标记, 整个节点就被解释成一个具有丰富表现形式的平面按钮而不是系统缺省风格的普通按钮. 从级列设计的角度上说, button对应于ui:FlatButton在没有tpl解析能力情况时退化了的结果. 在EJB3的规范中, 普通的POJO(Plain Old Java Object)对象在经过无害的标记(annotation)之后通过Enhance过程获得持久化等特性, POJO正对应于EJB Object的退化形式. 在某种意义上我们可以说, 存在着多少种可退化方式,就对应着多少种non-intrusive design。
      与传统设计中的结构堆砌不同, 现代技术更加强调在原有结构基础上的同态变化, 关注原有结构中的某些部分出现特殊意义后所产生的对称破缺. 在non-intrusive设计中, 基础的结构中没有为扩展内置什么特殊的结构, 一般仅仅是标记而已, 这些标记是无害的甚至本身在基础结构中是有用的, 例如某些javascript库在前台html页面中利用html标签的class属性作为标记. 为了识别这些属于结构标准部分的标记并对之进行处理,我们需要一种可选择的结构透明性, 具体来说我们需要能渗透到系统内部,准确的定位到标记处. 这就类似于x光检测, x光只与某些特殊材料发生强烈作用而普通部分对于x光而言是透明的. 而当外部引擎识别出这些特殊的标记之后, 可能需要操纵该局部结构, 例如在基础结构中插入一些新的结构以实现基础结构的增强. 这些都可能需要应用类似于AOP的技术, 而在这一增强过程中关于扩展结构的具体知识存在于扩展引擎中而不是基础结构中, 因而往往整体表现出一种IoC的特性.

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics