【转】侵入式与非侵入式设计的含义
在设计一个类时,按理说,需要考虑的应该只是该类所企图表示的那个“概念”本身:为表示有关概念应记录哪些信息,该类的对象与外界交换信息的界面等等。但定义这个类并不是为了放在那里观赏,而是为了使用。在考虑类对象的使用时,使用环境的一些要素就可能“侵入”这个类的设计之中。实际上,许多情况下我们常常可以在“侵入式”设计和“非侵入式”设计之间做一个选择,不同选择各有优缺点。在考虑非类的程序部分时,这种问题也同样存在。
例如,我们可能需要对类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的特性.
分享到:
相关推荐
postgresql-16.6.tar.gz,PostgreSQL 安装包。 PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只是在比较迟的时候才出现在商业网站数据库中。PostgreSQL支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询、外键、触发器、视图、事务完整性、多版本并发控制等。同样,PostgreSQL也可以用许多方法扩展,例如通过增加新的数据类型、函数、操作符、聚集函数、索引方法、过程语言等。另外,因为许可证的灵活,任何人都可以以任何目的免费使用、修改和分发PostgreSQL。
机械设计传感器真空灌胶机_step非常好的设计图纸100%好用.zip
HRNet的onnx格式转rknn格式的工程
【岗位说明】物资设备部部门职责
山东大学软件学院编译原理学习笔记
各大交易所的行情数据收集服务。行業服務行情服务根据各个交易所当前提供的不同方式,通过REST API或Websocket方式实现了对各大交易所平台实时行情数据的获取及个体。安装需要安装thenextquant量化交易框架,使用pip可以简单方便安装pip install thenextquant運行git clone https://github.com/TheNextQuant/Market.git # 下载项目cd Market # 进入项目目录vim config.json # 编辑配置文件python src/main.py config.json # 启动之前请修改配置文件配置请参考配置文件说明。各大交易所行情币安OKExOKEx 期货
unidac-10.3.0-src.zip
记录本人整理的一些数据集NLP数据集大家好,我是刘聪NLP。本项目为本人收集整理的数据集,目前包括一些中文摘要数据集、中文片段抽取式阅读理解数据集(QA)、中文文本相似度数据集和中文NER数据集。希望大家可以多多转发、多多启动。更新日期 2022 年 6 月 16 日从网上收集的数据,将CMeEE数据集、IMCS21_task1数据集、CCKS2017_task2数据集、CCKS2018_task1数据集、CCKS2019_task1数据集、CLUENER2020数据集、MSRA数据集、NLPCC2018_task4数据集、CCFBDCI数据集、MMC数据集、万创数据集、佩奥pleDairy1998数据集、PeopleDairy2004数据集、GAIIC2022_task2数据集、微博数据集、电子商务数据集、新浪财经数据集、BoSon数据集、简历整理数据集、银行数据集、FNED数据集和DLNER数据集等22个数据集进行清理,构建一个较为完善的中文数据库。数据集清洗时,仅进行了简单的地规则清洗,普及格式进行了统一化,标签为“BIO”。处理后数据集详细信息,见数据集
【岗位说明】酒店洁净部经理岗位职责
【岗位说明】传媒公司部门职责人员细则
### 基于Python语音识别的智能垃圾分类系统 #### 概述 随着环境保护意识的不断增强以及资源回收技术的发展,垃圾分类已成为社会关注的重点之一。本文介绍了一款基于Python语音识别技术的智能垃圾分类系统的设计与实现。该系统通过语音识别技术帮助用户更加便捷地完成垃圾分类工作,不仅提高了垃圾分类的效率,也为环境保护作出了贡献。 #### 系统架构与关键技术 ##### 1. Python语音识别模块 本系统的核心在于语音识别模块,采用Python语言开发。Python作为一种高级编程语言,以其简洁易读的语法特性,在数据处理与机器学习领域拥有广泛的应用。在本项目中,利用Python中的`SpeechRecognition`库来实现语音信号的捕捉与转换为文本的功能。此外,还需要集成其他相关的语音处理库,如`pyaudio`用于音频采集等。 ##### 2. 数据库管理模块 为了有效存储和管理用户的个人信息以及上传的音频文件,本系统采用了MySQL数据库作为后台支持。MySQL因其高性能。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
汽球彩旗儿童教学课件模板
【岗位说明】酒店电信服务员岗位职责
双PWM整流器实现飞轮储能系统MATLAB仿真(含与仿真完全对应的54页报告) [1]选用永磁同步电机作为飞轮驱动电机,通过矢量控制的方式对其发电和电动的工况进行控制。 同时,配合双PWM整流器实现能量在电网侧与电机侧之间不断流动。 [2]电机侧控制系统:采用转速电流双闭环的控制方法,其中电流内环选择电流滞环的控制方式 [3]网侧:采用电压、电流双闭环控制策略,空间矢量调制(SVPWM) 资料:内含两个飞轮储能模型:模型一的机侧网侧分开运行,附54页建模仿真说明;模型二的机侧网侧同步运行——内含完整建模过程,课设与文章写作可做参考。
postgis-bundle-pg96x32-setup-2.5.0-1.exe,postgis安装包。 PostGIS 在对象关系型数据库 PostgreSQL 上增加了存储管理空间数据的能力,相当于 Oracle 的 spatial 部分。PostGIS 最大的特点是符合并且实现了 OpenGIS 的一些规范,是最著名的开源 GIS 数据库。
【岗位说明】销售员岗位职责01
机械设计轧机机架step非常好的设计图纸100%好用.zip
内容概要:这篇文档详细介绍了用C++实现的斗地主游戏。该实现包括基本规则、牌型分类和判定、出牌规则、牌堆操作(如发牌、洗牌)、玩家与地主角色行为等关键功能。整个游戏通过面向对象的方式构建了卡片(Card)、牌组合类型(CardsType)、牌集合(CardGroup)、玩家(Player)、最后出牌记录(LastCards)等多个类,模拟真实的斗地主流程,并支持基本的游戏交互。 适用人群:具有一定的C++编程能力以及熟悉或愿意学习面向对象编程思想的程序员;对于数据结构如链表、排序等有一定的理解和应用能力的人士也会从中学有所获。 使用场景及目标:本项目主要用于学习目的,旨在加深对斗地主游戏机制的理解,同时通过具体的应用练习来提升自己的C++语言技能。它不仅提供了完整的游戏玩法示例,还可以作为参考模板用于类似棋牌游戏的开发。 其他说明:本文档采用纯文本格式编码并附带完整的源代码,适用于编译环境直接运行测试。文中包含了注释帮助理解每部分的功能,还涉及到一些较为复杂的算法逻辑,比如不同类型的牌之间的胜负关系判断、出牌顺序控制等等。因此,在研究这份资料时,应先仔细读一遍整体结构再深入了解细节部分。
数据集自动化制作脚本音频预处理脚本主要功能diffsinger、visinger数据集一键制作长录播音频切片基于demucs伴奏分离基于whisper语音识别mfa对齐完成后处理,构建diffsinger nomidi格式数据集注意!!!!开发中,,仅在mac和linux下通过部分测试,可能有各种bug!若要尝试请备份好自己的数据!!!!需要安装的依赖ffmpegdemucs==4.0.0 Auditok zhconv pypinyin librosa matplotlib praat-parselmouth pyyaml 声音文件 sox textgridgit+ https://github.com/openai/whisper.git数据集准备dataset├───speaker0│ ├───录播1.mp4│ ├───...│ └───录播2.mp4└───speaker1 ├───录播1.mp4 ├───... └───录播2.mp4等人colab 笔记本链接参考DiffSinge
一、项目简介 本项目是一套基于Servlet+Jsp实现的学生管理系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经过严格调试,确保可以运行! 二、技术选择 处于安全性,功能可扩展性。我们采用java ee。 数据库使用开源的Mysql; 服务器采用Tomcat; 三、系统的运行环境及工具 Web服务器:Tomcat7及其以上版本 数据库服务器:Mysql5及以上 eclipse或者idea navicat 四、系统功能描述 系统分为三种用户:管理员,教师,学生 主要功能有: 系统管理员:学生信息管理,教师信息管理,课程信息管理; 教师:开设课程,成绩提交,信息查询; 学生:课程选择、成绩查询; 五、数据库表 系统用户表 学生表 教师表 课程表 学生课程关联表 教师课程关联表