Components通常-构建框架有关的AI组件库指南-Web (component翻译中文)
一、让人又爱又恨的WebComponents
WebComponents是一种用于构建可重用的Web元素的技术。它准许开发者创立自定义的元素,这些元素可以在不同的Web运行程序中重复经常使用,并且具有自己的样式、行为和性能。
WebComponents并非一项新技术,而是一组继续演进的、由W3C规范化的组件化API。最早可以追溯到2011年左右,大概在2016年左右各个阅读器才成功了CustomElementV1版本。但是,在同一期间,诸如Vue和React等组件化框架曾经开局主导前端开出现态。
虽然近几年WebComponents规范和技术都趋于成熟,但早期面临的兼容性疑问以及起初Vue和React等MVVM框架的崛起,造成WebComponents畛域不时处于低调形态。接上去,咱们将从WebComponents的开展历程、好处以及开发中面临的应战三个方面更深化地了解WebComponents。
1、WebComponents开展历程
•2011年:颁布了Chrome阅读器,并提出了ShadowDOM概念,这是WebComponents的一个关键组成局部。
•2013年:谷歌工程师AlexKomoroske在GoogleI/O大会上初次提出了WebComponents的概念,并推进了关系规范的制订。
•2014年:W3C颁布了WebComponents的规范草案,其中包括四个关键技术:CustomElements、ShadowDOM、HTMLTemplates和HTMLImports。
•2015年:WebComponents的规范逐渐失掉阅读器厂商的支持,Chrome、Firefox、Safari等干流阅读器开局逐渐成功关系性能。
•2018年:WebComponents逐渐成为前端开发的干流技术之一,越来越多的开发者开局经常使用WebComponents来构建可重用的组件。
![Web](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
•至今:WebComponents技术不时开展和完善,越来越多的框架和库开局支持WebComponents,使其在前端开发中施展更大的作用。
2、WebComponents有哪些好处
• 封装性: WebComponents具有良好的封装性,可以将页面中的性能和样式封装在一个自定义元素外部,防止全局作用域的污染,提高了代码的可保养性和可重用性。
• 跨框架兼容 :WebComponents是基于Web规范的技术,可以在任何支持CustomElements和ShadowDOM的现代阅读器中经常使用,与各种前端框架和库兼容性良好。
• 规范化 :WebComponents的规范由W3C组织制订,具有较高的规范化水平,无利于一致前端开发的规范和通常,提高了代码的可保养性和可移植性。
• 性能好处 :经过经常使用ShadowDOM技术,WebComponents可以成功更好的性能提升,防止不用要的重绘和重排,提高页面的渲染效率和用户体验。
目前,前端开发中有许多盛行的框架可供选用,如React、Vue、Angular、Solid、Svelte、Preact等。框架的选用是一个复杂的决策环节。当框架版本更新时,名目或者须要面临重构的疑问。例如,从Vue2更新到Vue3或者须要付出较大的改形老本。假设不启动更新,就不可经常使用最新特性,甚至或者面临框架旧版本不再保养的难堪局面。在这种状况下,WebComponents的 框架有关性 可以在必定水平上改善这种局面。
就性能而言,以将React组件转换为WebComponents为例,可以提升执行环节,缩小阻塞,提高页面性能。在个别的React组件中,初次执行时须要一次性性成功一切必定的节点逻辑,这些逻辑的执行会同步占用在Script的主线程上。当页面变得足够复杂时,一些非外围逻辑或者会阻塞前面外围逻辑的执行。而经过经常使用WebComponents提升React组件,执行环节会变得更繁复。例如,注册一个复杂的逻辑组件时,在React执行时只要执行一个语句,创立组件只要要1-2微秒即可成功。真正的逻辑不会立刻执行,而是等到外围义务执行终了后再执行,甚至可以在适宜的机遇再执行,从而 降落Diff老本 。
3、经常使用WebComponents开发的痛点
虽然WebComponents具有许多令人青睐的好处,但在实践开发中也存在一些辣手的疑问。以下是几个典型疑问:
•原生开发难题:WebComponents是一项原生技术,因此在组件编写环节中须要回归到原生开发。事情处置、形态治理等方面都须要自行处置。虽然大少数框架都提供了对WebComponents的封装方案,但经常使用这些方案又须要引入相应框架的运转时,这造成脱离了框架有关性这一最大好处。
•Form表单疑问:在ShadowDOM中,蕴含<input>、<textarea>或<select>等标签的value不会智能与表单关联,因此在表单提交时不可失掉相应的value,须要手动处置,另外ElementInternals提案也在努力于处置这个疑问。
•样式隔离疑问:虽然样式隔离有助于防止全局样式污染的疑问,但在某些场景下,如主题色彩等,仍须要将样式同步到WebComponents组件外部。目前可以经过变量成功主题切换。此外,须要留意的是,slot插槽中的DOM元素样式并未失掉隔离。
针对这些疑问,开发人员或者须要思考采取一些额外的措施来处置当战,以确保WebComponents在实践运行中能够愈加顺畅地运转。
二、目前干流的WebComponents组件方案
1、头部案例
Twitter2016年开局将自己的嵌入式推文从iframe切换成ShadowDOM,缩小了内存消耗、放慢了渲染速度,并批量渲染的时刻坚持丝滑。UpcomingChangetoEmbeddedTweetDisplayonWeb
Youtube作为google系的产品,很早就在全站用上了WebComponents,并且开源了自己播放器组件-GoogleWebComponents/google-youtube:YouTubevideoplaybackwebcomponent此外google开源的WebComponents还是很多的,GoogleWebComponents·GitHub,包括地图、drive、日历等等。
Github对WebComponents的经常使用很早,详细可以看:HowweuseWebComponentsatGitHub|TheGitHubBlog,2017年CustomElementsv1版本在chrome和safari上相继成功之后,Github开局大范围使。要知道Github2018年才刚刚齐全移除jQuery:RemovingjQueryfromGitHub.comfrontend|TheGitHubBlog这既得益于Github自身名目组件化的架构,也得益于WebComponents自身与框架有关的特性十分识协作老名目更新。
AdobeSpectrum
AdobeSpectrum是由Adobe创立的设计系统,该站点是一个基于WebComponents的UI框架产品。
2、方案对比
目前干流的WebComponents组件方案有三种:
方案一:
•特点:以React和Vue为代表,经过将React或Vue组件包装为WebComponents组件的形式成功。
•好处:应用了自身框架的特性如生命周期、形态治理等,易于开发者经常使用。
•缺陷:须要引入自身框架的运转时,造成组件体积参与,同时丢失了框架有关性这一好处。
方案二:
•特点:以Stencil和LitElement为代表,提供了专门的编译器、工具链和语法糖来构建WebComponents。
•好处:相比第一种方案,引入自身框架的运转时或者更小,缩小了体积。
•缺陷:须要学习新的语法和工具,或者参与开发者的心智累赘。
方案三:
特点:以Svelte和Solid为代表,间接将组件编译成原生WebComponents
好处:丢弃了虚构DOM,应用编译或转译才干间接生成操作DOM的更新函数,性能低劣,凑近原生DOM。另外Vue3中的Vapor形式,正是自创了这种形式,目前正在实验阶段。
三、与SolidJS联合的化学反响
1、SolidJS有何不同
SolidJS是一个极速、灵敏、可裁减的JavaScript库,用于构建用户界面。与其余前端框架相比,SolidJS有一些共同的特点和好处:
•ReactivitySystem:SolidJS经常使用基于数据变动的照应式系统,可以准确追踪形态的变动,并只更新出现变动的局部,从而提高性能。
•Fine-grnedReactivity:SolidJS提供了 细粒度的照应式更新 ,可以在组件级别、元素级别甚至属性级别启动更新,防止不用要的从新渲染。
•NoVirtualDOM:与其余框架不同,SolidJS 不经常使用虚构DOM ,而是间接编译生成操作实在DOM的函数,缩小了diff算法的开支,提高了性能。
•Hooks-basedAPI:SolidJS经常使用相似ReactHooks的API,使得组件逻辑更易于复用和组合
2、可以处置哪些疑问
•间接在编译阶段生成原生WebComponents,外围库十分小巧,没有额外的依赖,可以协助缩小名目标体积。
•提供照应式形态治理、事情治理、生命周期等,处置原生开发的痛点。
•类React语法,上手容易,降落开发者心智累赘,转换成WebComponents十分流利。
四、从0到1搭建AuraDesignWebComponents组件库
1、工程目录设计
该名目驳回了Monorepo设计,旨在 一致治理各个子名目,防止开发阶段频繁颁布/装置npm包 来同步代码。详细内容包括:
•packages/eslint-config-aurai:用于治理ESLint性能,集成了TypeScript和Prettier(用于JavaScript/TypeScript格局化)。
•packages/stylelint-config-aurai:用于治理StyleLint性能,集成了stylelint-order(用于样式属性排序)和Prettier(用于样式格局化)。
•packages/aura-design:基于eslint-config-aurai和stylelint-config-aurai规范,经常使用Solid和SolidElement构建的WebComponents元组件库,包括按钮、图标、卡片、规划等基础组件。
•packages/aura-design-pro:与aura-design相似,但封装了一些复杂组件,通常是依赖第三方库的组件,例如支持Markdown渲染的富文本组件、视频播放组件等。
•s/aura-design-docs:基于Storybook的组件文档库,支持检查代码、组件预览,并可实时预览修正组件属性。
•apps/react-starter、apps/vue-starter:方案用于验证WebComponents在React和Vue组件中的兼容性等疑问。
2、局部细节展现
2.1、组件样式编写
WebComponents组件中的样式是内联到每一个组件的ShadowDOM中,因此不能用惯例的CSSModules等方案。本名目中经常使用了大概4种不同的内联样式方案,以对应不同的运行场景:
•原子化CSS方案:UnoCSS努力于将一切样式属性细分为最小单元的CSS,以便成功最大水平的自在组合和复用。此外,UnoCSS还具有智能剖析文件中经常使用的样式的性能,只将实践经常使用的样式打包,从而减小文件大小。
•CSSinline形式:应用Vite的性能,将外部样式作为内联形式引入,当须要自定义复杂样式或语义化场景时,或者会经常使用此形式。
importstylesfrom'./Button.css?inline';
•CSSTemplate:CSS模板字符串相似于CSS-in-JS方案,通罕用于依据prop变量灵活控制样式。虽然这种方法会参与必定的运转时处置逻辑,但可以有效缩小CSS重复和文件大小。
conststyles=css`
display:inline-block;
height:${props.size+2}px;
line-height:${props.size+2}px;
position:relative;
overflow:hidden;
.nums-chip{
transition:transform1.5s;
transform:translate(0,-50%);
overflow:hidden;
font-size:${props.size}px;
line-height:${props.size+2}px;
•CSSLink:经常使用link标签引入外部样式表,当组件样式比拟多、体积较大时,假设间接内嵌到组件外部,当有N个组件时,体积就会增大N倍(暂不思考阅读器内置提升逻辑),而经常使用link标签缩小体积同时也可以应用上阅读器缓存的特性。
2.2、Svg图标集成
Icon组件引入和注册
defineCustomElements,
registerIcon,
}from'@aura-group/aura-design';
registerIcon('/iconfont.svg');//自定义svg图标注册,经常使用主名目根目录的svg图标文件,假设不注册则经常使用自动图标
defineCustomElements({Icon});//注册WebComponents图标组件
组件经常使用
2.3、组件打包
支持ES(按需加载)和UMD两种范式,智能生成Typescript申明文件:
package.json
"name":"@aura-group/aura-design",
"version":"0.3.9",
"description":"",
"main":"dist/aura-design.umd.js",
"module":"dist/aura-design.es.js",
"typings":"dist/types/components/index.d.ts",
"type":"module",
Vite关系性能
entry:'src/components/index.ts',
name:'aura-design',
fileName:(format)=>`aura-design.${format}.js`,
3、基于Storybook的组件文档
Storybook是一个开源工具,用于开发和展现React、Vue、Angular等前端组件的交互式UI组件库。经过Storybook,开发人员可以在一个独立的环境中编写、展现和测试组件,而不用依赖于整个运行程序。这样可以更快地开发和调试组件,同时也繁难团队成员之间的协作。
Storybook提供了一个交互式的界面,开发人员可以在其中创立不同的故事(stories),每个故事对应一个组件的不同形态或交互形式。经过Storybook,开发人员可以轻松地检查和测试组件在不同形态下的体现,从而更好地理解和调试组件的行为。
AuraDesign组件库文档
4、未来规划
目前,咱们的组件库中蕴含了16个基础组件和一些与AIChat关系的组件。在A-M网站中,95%的组件都源自AuraDesign组件库。未来,除了继续封装一些基础组件外,咱们将优先开发惯例组件库中缺失的比如AI运行的关系组件。随着组件库的逐渐丰盛和条件的成熟,咱们会思考将其开源。 假设您有任何关系组件的封装需求或宿愿成为名目标成员,请随时与我咨询。
参考文献
•WebComponents从技术解析到生态运行团体心得指北
•2022WebComponents趋向解读和展望
•你不知道的WebComponents-过去和未来
•浅析Webcomponents的痛点
常见的大数据分析工具有哪些?
我推荐一些常用的大数据分析工具1.专业的大数据分析工具2.各种Python数据可视化第三方库3.其它语言的数据可视化框架一、专业的大数据分析工具1、FineReportFineReport是一款纯Java编写的、集数据展示(报表)和数据录入(表单)功能于一身的企业级web报表工具,只需要简单的拖拽操作便可以设计复杂的中国式报表,搭建数据决策分析系统。 2、FineBIFineBI是新一代自助大数据分析的商业智能产品,提供了从数据准备、自助数据处理、数据分析与挖掘、数据可视化于一体的完整解决方案,也是我比较推崇的可视化工具之一。 FineBI的使用感同Tableau类似,都主张可视化的探索性分析,有点像加强版的数据透视表。 上手简单,可视化库丰富。 可以充当数据报表的门户,也可以充当各业务分析的平台。 二、Python的数据可视化第三方库Python正慢慢地成为数据分析、数据挖掘领域的主流语言之一。 在Python的生态里,很多开发者们提供了非常丰富的、用于各种场景的数据可视化第三方库。 这些第三方库可以让我们结合Python语言绘制出漂亮的图表。 1、pyechartsEcharts(下面会提到)是一个开源免费的javascript数据可视化库,它让我们可以轻松地绘制专业的商业数据图表。 当Python遇上了Echarts,pyecharts便诞生了,它是由chenjiandongx等一群开发者维护的Echarts Python接口,让我们可以通过Python语言绘制出各种Echarts图表。 2、BokehBokeh是一款基于Python的交互式数据可视化工具,它提供了优雅简洁的方法来绘制各种各样的图形,可以高性能的可视化大型数据集以及流数据,帮助我们制作交互式图表、可视化仪表板等。 三、其他数据可视化工具1、Echarts前面说过了,Echarts是一个开源免费的javascript数据可视化库,它让我们可以轻松地绘制专业的商业数据图表。 大家都知道去年春节以及近期央视大规划报道的网络大数据产品,如网络迁徙、网络司南、网络大数据预测等等,这些产品的数据可视化均是通过ECharts来实现的。 2、D3D3(Data Driven Documents)是支持SVG渲染的另一种JavaScript库。 但是D3能够提供大量线性图和条形图之外的复杂图表样式,例如Voronoi图、树形图、圆形集群和单词云等。
什么是软件架构?有没有具体解释?
软件架构软件架构(software architecture)是一系列相关的抽象模式,用于指导大型软件系统各个方面的设计。 软件架构是一个系统的草图。 软件架构描述的对象是直接构成系统的抽象组件。 各个组件之间的连接则明确和相对细致地描述组件之间的通讯。 在实现阶段,这些抽象组件被细化为实际的组件,比如具体某个类或者对象。 在面向对象领域中,组件之间的连接通常用接口_(计算机科学)来实现。 软件体系结构是构建计算机软件实践的基础。 与建筑师设定建筑项目的设计原则和目标,作为绘图员画图的基础一样,一个软件架构师或者系统架构师陈述软件构架以作为满足不同客户需求的实际系统设计方案的基础。 软件构架是一个容易理解的概念,多数工程师(尤其是经验不多的工程师)会从直觉上来认识它,但要给出精确的定义很困难。 特别是,很难明确地区分设计和构架:构架属于设计的一方面,它集中于某些具体的特征。 在“软件构架简介”中,David GArlan 和 Mary Shaw 认为软件构架是有关如下问题的设计层次:“在计算的算法和数据结构之外,设计并确定系统整体结构成为了新的问题。 结构问题包括总体组织结构和全局控制结构;通信、同步和数据访问的协议;设计元素的功能分配;物理分布;设计元素的组成;定标与性能;备选设计的选择。 ”[GS93]但构架不仅是结构;IEEE Working Group on Architecture 把其定义为“系统在其环境中的最高层概念”[IEEE98]。 构架还包括“符合”系统完整性、经济约束条件、审美需求和样式。 它并不仅注重对内部的考虑,而且还在系统的用户环境和开发环境中对系统进行整体考虑,即同时注重对外部的考虑。 在 Rational Unified ProcESs 中,软件系统的构架(在某一给定点)是指系统重要构件的组织或结构,这些重要构件通过接口与不断减小的构件与接口所组成的构件进行交互。 从和目的、主题、材料和结构的联系上来说,软件架构可以和建筑物的架构相比拟。 一个软件架构师需要有广泛的软件理论知识和相应的经验来事实和管理软件产品的高级设计。 软件架构师定义和设计软件的模块化,模块之间的交互,用户界面风格,对外接口方法,创新的设计特性,以及高层事物的对象操作、逻辑和流程。 是一般而言,软件系统的架构(ArchitECture)有两个要素:·它是一个软件系统从整体到部分的最高层次的划分。 一个系统通常是由元件组成的,而这些元件如何形成、相互之间如何发生作用,则是关于这个系统本身结构的重要信息。 详细地说,就是要包括架构元件(Architecture Component)、联结器(Connector)、任务流(TASk-flow)。 所谓架构元素,也就是组成系统的核心砖瓦,而联结器则描述这些元件之间通讯的路径、通讯的机制、通讯的预期结果,任务流则描述系统如何使用这些元件和联结器完成某一项需求。 ·建造一个系统所作出的最高层次的、以后难以更改的,商业的和技术的决定。 在建造一个系统之前会有很多的重要决定需要事先作出,而一旦系统开始进行详细设计甚至建造,这些决定就很难更改甚至无法更改。 显然,这样的决定必定是有关系统设计成败的最重要决定,必须经过非常慎重的研究和考察。 历史早在1960年代,诸如E·W·戴克斯特拉就已经涉及软件架构这个概念了。 自1990年代以来,部分由于在 Rational Software Corporation 和MiCROSoft内部的相关活动,软件架构这个概念开始越来越流行起来。 卡内基梅隆大学和加州大学埃尔文分校在这个领域作了很多研究。 卡内基·梅隆大学的Mary Shaw和David Garlan于1996年写了一本叫做 Software Architecture perspective on an emerging DIscipline的书,提出了软件架构中的很多概念,例如软件组件、连接器、风格等等。 加州大学埃尔文分校的软件研究院所做的工作则主要集中于架构风格、架构描述语言以及动态架构。 计算机软件的历史开始于五十年代,历史非常短暂,而相比之下建筑工程则从石器时代就开始了,人类在几千年的建筑设计实践中积累了大量的经验和教训。 建筑设计基本上包含两点,一是建筑风格,二是建筑模式。 独特的建筑风格和恰当选择的建筑模式,可以使一个独一无二。 下面的照片显示了中美洲古代玛雅建筑,Chichen-Itza大金字塔,九个巨大的石级堆垒而上,九十一级台阶(象征着四季的天数)夺路而出,塔顶的神殿耸入云天。 所有的数字都如日历般严谨,风格雄浑。 难以想象这是石器时代的建筑物。 图1、位于墨西哥Chichen-Itza(在玛雅语中chi意为嘴chen意为井)的古玛雅建筑。 (摄影:作者) 软件与人类的关系是架构师必须面对的核心问题,也是自从软件进入历史舞台之后就出现的问题。 与此类似地,自从有了建筑以来,建筑与人类的关系就一直是建筑设计师必须面对的核心问题。 英国首相丘吉尔说,我们构造建筑物,然后建筑物构造我们(We shape our buildings, and afterwaRDS our buildings shape us)。 英国下议院的会议厅较狭窄,无法使所有的下议院议员面向同一个方向入座,而必须分成两侧入座。 丘吉尔认为,议员们入座的时候自然会选择与自己政见相同的人同时入座,而这就是英国政党制的起源。 Party这个词的原意就是方、面。 政党起源的关键就是建筑物对人的影响。 在软件设计界曾经有很多人认为功能是最为重要的,形式必须服从功能。 与此类似地,在建筑学界,现代主义建筑流派的开创人之一Louis Sullivan也认为形式应当服从于功能(FORMs follows function)。 几乎所有的软件设计理念都可以在浩如烟海的建筑学历史中找到更为遥远的历史回响。 最为著名的,当然就是模式理论和XP理论。 架构的目标是什么正如同软件本身有其要达到的目标一样,架构设计要达到的目标是什么呢?一般而言,软件架构设计要达到如下的目标:·可靠性(Reliable)。 软件系统对于用户的商业经营和管理来说极为重要,因此软件系统必须非常可靠。 ·安全行(Secure)。 软件系统所承担的交易的商业价值极高,系统的安全性非常重要。 ·可扩展性(SCAlable)。 软件必须能够在用户的使用率、用户的数目增加很快的情况下,保持合理的性能。 只有这样,才能适应用户的市场扩展得可能性。 ·可定制化(CuSTomizable)。 同样的一套软件,可以根据客户群的不同和市场需求的变化进行调整。 ·可扩展性(Extensible)。 在新技术出现的时候,一个软件系统应当允许导入新技术,从而对现有系统进行功能和性能的扩展·可维护性(MAIntainable)。 软件系统的维护包括两方面,一是排除现有的错误,二是将新的软件需求反映到现有系统中去。 一个易于维护的系统可以有效地降低技术支持的花费·客户体验(Customer Experience)。 软件系统必须易于使用。 ·市场时机(Time to Market)。 软件用户要面临同业竞争,软件提供商也要面临同业竞争。 以最快的速度争夺市场先机非常重要。 架构的种类根据我们关注的角度不同,可以将架构分成三种:·逻辑架构、软件系统中元件之间的关系,比如用户界面,数据库,外部系统接口,商业逻辑元件,等等。 比如下面就是笔者亲身经历过的一个软件系统的逻辑架构图图2、一个逻辑架构的例子从上面这张图中可以看出,此系统被划分成三个逻辑层次,即表象层次,商业层次和数据持久层次。 每一个层次都含有多个逻辑元件。 比如WEB服务器层次中有HTML服务元件、Session服务元件、安全服务元件、系统管理元件等。 ·物理架构、软件元件是怎样放到硬件上的。 比如下面这张物理架构图描述了一个分布于北京和上海的分布式系统的物理架构,图中所有的元件都是物理设备,包括网络分流器、代理服务器、WEB服务器、应用服务器、报表服务器、整合服务器、存储服务器、主机等等。 图3、一个物理架构的例子 ·系统架构、系统的非功能性特征,如可扩展性、可靠性、强壮性、灵活性、性能等。 系统架构的设计要求架构师具备软件和硬件的功能和性能的过硬知识,这一工作无疑是架构设计工作中最为困难的工作。 此外,从每一个角度上看,都可以看到架构的两要素:元件划分和设计决定。 首先,一个软件系统中的元件首先是逻辑元件。 这些逻辑元件如何放到硬件上,以及这些元件如何为整个系统的可扩展性、可靠性、强壮性、灵活性、性能等做出贡献,是非常重要的信息。 其次,进行软件设计需要做出的决定中,必然会包括逻辑结构、物理结构,以及它们如何影响到系统的所有非功能性特征。 这些决定中会有很多是一旦作出,就很难更改的。 根据作者的经验,一个基于数据库的系统架构,有多少个数据表,就会有多少页的架构设计文档。 比如一个中等的数据库应用系统通常含有一百个左右的数据表,这样的一个系统设计通常需要有一百页左右的架构设计文档。 构架描述 为了讨论和分析软件构架,必须首先定义构架表示方式,即描述构架重要方面的方式。 在 Rational Unified Process 中,软件构架文档记录有这种描述。 构架视图 我们决定以多种构架视图来表示软件构架。 每种构架视图针对于开发流程中的涉众(例如最终用户、设计人员、管理人员、系统工程师、维护人员等)所关注的特定方面。 构架视图显示了软件构架如何分解为构件,以及构件如何由连接器连接来产生有用的形式 [PW92],由此记录主要的结构设计决策。 这些设计决策必须基于需求以及功能、补充和其他方面的约束。 而这些决策又会在较低层次上为需求和将来的设计决策施加进一步的约束。 典型的构架视图集 构架由许多不同的构架视图来表示,这些视图本质上是以图形方式来摘要说明“在构架方面具有重要意义”的模型元素。 在 Rational Unified Process 中,您将从一个典型的视图集开始,该视图集称为“4+1 视图模型”[KRU95]。 它包括: 用例视图:包括用例和场景,这些用例和场景包括在构架方面具有重要意义的行为、类或技术风险。 它是用例模型的子集。 逻辑视图:包括最重要的设计类、从这些设计类到包和子系统的组织形式,以及从这些包和子系统到层的组织形式。 它还包括一些用例实现。 它是设计模型的子集。 实施视图:包括实施模型及其从模块到包和层的组织形式的概览。 同时还描述了将逻辑视图中的包和类向实施视图中的包和模块分配的情况。 它是实施模型的子集。 进程视图:包括所涉及任务(进程和线程)的描述,它们的交互和配置,以及将设计对象和类向任务的分配情况。 只有在系统具有很高程度的并行时,才需要该视图。 在 Rational Unified Process 中,它是设计模型的子集。 配置视图:包括对最典型的平台配置的各种物理节点的描述以及将任务(来自进程视图)向物理节点分配的情况。 只有在分布式系统中才需要该视图。 它是部署模型的一个子集。 构架视图记录在软件构架文档中。 您可以构建其他视图来表达需要特别关注的不同方面:用户界面视图、安全视图、数据视图等等。 对于简单系统,可以省略 4+1 视图模型中的一些视图。 构架重点 虽然以上视图可以表示系统的整体设计,但构架只同以下几个具体方面相关: 模型的结构,即组织模式,例如分层。 基本元素,即关键用例、主类、常用机制等,它们与模型中的各元素相对。 几个关键场景,它们表示了整个系统的主要控制流程。 记录模块度、可选特征、产品线状况的服务。 构架视图在本质上是整体设计的抽象或简化,它们通过舍弃具体细节来突出重要的特征。 在考虑以下方面时,这些特征非常重要:系统演进,即进入下一个开发周期。 在产品线环境下复用构架或构架的一部分。 评估补充质量,例如性能、可用性、可移植性和安全性。 向团队或分包商分配开发工作。 决定是否包括市售构件。 插入范围更广的系统。 构架模式 构架模式是解决复发构架问题的现成形式。 构架框架或构架基础设施(中间件)是可以在其上构建某种构架的构件集。 许多主要的构架困难应在框架或基础设施中进行解决,而且通常针对于特定的领域:命令和控制、MIS、控制系统等等。 构架模式示例[BUS96] 根据构架模式最适用的系统的特征将其分类,其中一个类别处理更普遍的结构问题。 下表显示了 [BUS96] 中所提供的类别和这些类别所包含的模式。 类别 模式 结构 层 管道和过滤器 黑板 分布式系统 代理 交互系统 模型-视图-控制器 表示-抽象-控制 自适应系统 反射 微核 软件构架是一个容易理解的概念,多数工程师(尤其是经验不多的工程师)会从直觉上来认识它,但要给出精确的定义很困难。 特别是,很难明确地区分设计和构架:构架属于设计的一方面,它集中于某些具体的特征。 在“软件构架简介”中,David Garlan 和 Mary Shaw 认为软件构架是有关如下问题的设计层次:“在计算的算法和数据结构之外,设计并确定系统整体结构成为了新的问题。 结构问题包括总体组织结构和全局控制结构;通信、同步和数据访问的协议;设计元素的功能分配;物理分布;设计元素的组成;定标与性能;备选设计的选择。 ”[GS93] 但构架不仅是结构;IEEE Working Group on Architecture 把其定义为“系统在其环境中的最高层概念”[IEEE98]。 构架还包括“符合”系统完整性、经济约束条件、审美需求和样式。 它并不仅注重对内部的考虑,而且还在系统的用户环境和开发环境中对系统进行整体考虑,即同时注重对外部的考虑。 在 Rational Unified Process 中,软件系统的构架(在某一给定点)是指系统重要构件的组织或结构,这些重要构件通过接口与不断减小的构件与接口所组成的构件进行交互。 为阐明其含义,下面将详述其中的两个;完整说明请参见 [BUS96]。 模式以下列广泛使用的形式来表示:模式名 环境 问题影响,描述应考虑的不同问题方面 解决方案基本原理 结果环境 示例 模式名层环境需要进行结构分解的大系统。 问题必须处理不同抽象层次的问题的系统。 例如:硬件控制问题、常见服务问题和针对于不同领域的问题。 最好不要编写垂直构件来处理所有抽象层次的问题。 否则要在不同的构件中多次处理相同的问题(可能会不一致)。 影响系统的某些部分应当是可替换的 构件中的变化不应波动 相似的责任应归为一组 构件大小 -- 复杂构件可能要进行分解 解决办法将系统分成构件组,并使构件组形成层叠结构。 使上层只使用下层(决不使用上层)提供的服务。 尽量不使用非紧邻下层提供的服务(不跳层使用服务,除非中间层只添加通过构件)。 示例:1. 通用层严格的分层构架规定设计元素(类、构件、包、子系统)只能使用下层提供的服务, 服务可以包括事件处理、错误处理、数据库访问等等。 相对于记录在底层的原始操作系统级调用,它包括更明显的机制。 2. 业务系统层上图显示了另一个分层示例,其中有垂直特定应用层、水平层和基础设施层。 注意:此处的目标是采用非常短的业务“烟囱”并实现各种应用程序间的通用性。 否则,就可能有多个人解决同一问题,从而导致潜在的分歧。 有关该模式的深入讨论,请参见指南:分层。 模式名黑板环境没有解决问题的确定方法(算法)或方法不可行的领域。 例如 AI 系统、语音识别和监视系统。 问题多个问题解决顾问(知识顾问)必须通过协作来解决他们无法单独解决的问题。 各顾问的工作结果必须可以供所有其他顾问访问,使他们可以评估自己是否可以参与解决方案的查找并发布其工作结果。 影响知识顾问参与解决问题的顺序不是确定的,这可能取决于问题解决策略 不同顾问的输入(结果或部分解决方案)可能有不同的表示方式 各顾问并不直接知道对方的存在,但可以评估对方发布的工作 解决办法多名知识顾问都可访问一个称为“黑板”的共享数据库。 黑板提供监测和更新其内容的接口。 控制模块/对象激活遵循某种策略的顾问。 激活后,顾问查看黑板,以确定它是否能参与解决问题。 如果顾问决定它可以参与,控制对象就可以允许顾问将其部分(或最终)解决方案放置于黑板上。 示例:以上显示了使用 UML 建模的结构或静态视图。 它将成为参数化协作的一部分,然后会绑定到实参上对模式进行实例化。 构架风格 软件构架(或仅是构架视图)可以具有名为构架风格的属性,该属性减少了可选的形式,并使构架具有一定程度的一致性。 样式可以通过一组模式或通过选择特定构件或连接器作为基本构件来定义。 对给定系统,某些样式可作为构架描述的一部分记录在构架风格指南(Rational Unified Process 中设计指南文档的一部分)中。 样式在构架的可理解性与完整性方面起着主要的作用。 构架设计图 构架视图的图形描述称为构架设计图。 对于以上描述的各种视图,设计图由以下统一建模语言图组成 [UML99]: 逻辑视图:类图、状态机和对象图。 进程视图:类图与对象图(包括任务 - 进程与线程)。 实施视图:构件图。 部署视图:配置图。 用例视图:用例图描述用例、主角和普通设计类;顺序图描述设计对象及其协作关系。 构架设计流程 在 Rational Unified Process 中,构架主要是分析设计工作流程的结果。 当项目再次进行此工作流程时,构架将在一次又一次迭代中不断演化、改进、精炼。 由于每次迭代都包括集成和测试,所以在交付产品时,构架就相当强壮了。 构架是精化阶段各次迭代的重点,构架的基线通常会在此阶段结束时确定。 架构师软体设计师中有一些技术水平较高、经验较为丰富的人,他们需要承担软件系统的架构设计,也就是需要设计系统的元件如何划分、元件之间如何发生相互作用,以及系统中逻辑的、物理的、系统的重要决定的作出。 这样的人就是所谓的架构师(Architect)。 在很多公司中,架构师不是一个专门的和正式的职务。 通常在一个开发小组中,最有经验的程序员会负责一些架构方面的工作。 在一个部门中,最有经验的项目经理会负责一些架构方面的工作。 但是,越来越多的公司体认到架构工作的重要性,并且在不同的组织层次上设置专门的架构师位置,由他们负责不同层次上的逻辑架构、物理架构、系统架构的设计、配置、维护等工作。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。