版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、软件体系结构(SoftwareArchitecture)软件体系结构描述语言假定你是Module Designer你最近加盟一家公司,并被安排在一个新项目的开发组中。虽然你富有经验,但是对此项目所涉及的领域还是一个新手。系统的高层体系结构设计已经完成。你的老板(项目经理)让你预计你将要完成的几个模块的开发时间。你怎么办?假定你是Module Designer你来开发A2和A3,怎么开始?假定你是Consultant(顾问)你是一个请来的顾问,对一个体系结构设计进行评估。Modifibility和Performance是重要的体系结构质量因素。你会询问什么样的信息?假定你是Consultant(
2、顾问)面对这样的图,你会有什么反应?体系结构文档的用处软件开发过程中各种角色之间交流设计思想的媒介进行上层分析的基础。此基础上可以验证体系结构设计方案,精炼或改变必要的方案让别人理解系统的第一手资料与Module Designer交流基本想法是什么?我该做什么 (如,实现哪些需求) ?我该在哪做 (如,这项功能实现在哪里) ?我和谁交互?接口是什么?有什么可以复用的代码?必须遵从什么约定(质量目标、旧体系/接口、预算等)?有哪些硬性规定(设计、接口、约束等)?与顾问交流体系结构的必要需求(driving requirement)是什么(如,performance, availability,
3、security, modifiability, interoperability)?各种体系结构视图是如何描述的?抽象出来什么?功能怎样分解?功能怎样分配?使用什么硬件以及软件怎样布置在硬件上?采用了哪些体系结构风格?这是什么?上图的毛病很多事情没有说:组件类型连接件类型圆圈和箭头代表什么?这种布局的意义是什么?为什么CP要放在上层?只画出方框和线条不是体系结构,只是体系结构的开始好的体系结构文档的必要元素需求陈述商业环境、产品的背景、领域描述环境必须和什么系统交互、外部接口使用体系结构图用恰当的线框简洁的说明好的体系结构文档的必要元素考虑实现时的限制但是仅在它们能影响体系结构设计的范围内被
4、限定的下层结构、处理器需求通常包含其他结构图体系结构设计的原理它怎样去符合需求与约束其他的设计其他方面风格/产品线问题设计可变的尺度体系结构的那个方面必须不被改变?管理问题暗含开发团队的组织结构体系结构评审情况其他设计问题代码复用、标准的运用风险分析运作、管理和维护软件体系结构的现状体系结构的理解停留在直觉、逸事和传说层面非形式化描述框线图非形式化的陈述惯用的词汇传递了丰富的语义RPCClient-ServerPipe and FilterLayeredDistributedOO该层次的非形式化是严重的问题吗?体系结构描述语言的必要性体系结构是降低开发成本的关键开发焦点转移到粗粒度系统成分形式
5、化的体系结构模型是需要的体系结构描述语言(ADLs)作为一种可能的解决方案被提出 ACME MetaH Aesop Rapide ArTek SADL C2 UniCon Darwin Weaves LILEANNA Wright若干原型ADLs被开发出来ADL及其扮演的角色仍是一个开放的问题ADL扮演的角色提供了描述构件及其交互的模型、符号体系和工具支持大规模、高层设计支持体系结构风格的理性选择和应用支持抽象用户定义应用特定(application-specific)支持设计的实现系统化的(可能)自动化的语言和环境之间相互作用语言使能精确的规约环境使得规约被复用体系结构描述方法分类图形表达工
6、具模块内连接语言 基于构件的系统描述语言软件体系结构描述语言 图形表达工具项目管理测试结果打印程序复杂度函数调用关系图带时间特性的流程图复杂度计算布图算法最优/最劣时间计算缓冲测试结果库测试配置时间分析器静态分析器模块内连接语言采用将一种或几种传统程序设计语言的模块连接起来的模块内连接语言。由于程序设计语言和模块内连接语言具有严格的语义基础,因此它们能支持对较大的软件单元进行描述,诸如定义/使用和扇入/扇出等操作。例如,Ada语言采用use实现包的复用,Pascal语言采用过程(函数)模块的交互等。MIL方式对模块化的程序设计和分段编译等程序设计与开发技术确实发挥了很大的作用。但是由于这些语言
7、处理和描述的软件设计开发层次过于依赖程序设计语言,因此限制了它们处理和描述比程序设计语言元素更为抽象的高层次软件体系结构元素的能力。 基于构件的系统描述语言 基于软构件的系统描述语言将软件系统描述成一种是由许多以特定形式相互作用的特殊软件实体构造组成的组织或系统。 例如,一种多变配置语言就可以用来在一个较高的抽象层次上对系统的体系结构建模,最初用作设计和构造复杂分布式系统的配置说明语言,因具有动态特性,也可用来描述动态体系结构。 这种表达和描述方式虽然也是较好的一种以构件为单位的软件系统描述方法,但是他们所面向和针对的系统元素仍然是一些层次较低的以程序设计为基础的通信协作软件实体单元,而且这些
8、语言所描述和表达的系统一般而言都是面向特定应用的特殊系统,这些特性使得基于构件的系统描述仍然不是十分适合软件体系结构的描述和表达。软件体系结构描述语言软件体系结构的第四种描述和表达方法是参照传统程序设计语言的设计和开发经验,重新设计、开发和使用针对软件体系结构特点的专门的软件体系结构描述语言由于ADL是在吸收了传统程序设计中的语义严格精确的特点基础上,针对软件体系结构的整体性和抽象性特点,定义和确定适合于软件体系结构表达与描述的有关抽象元素,因此,ADL是当前软件开发和设计方法学中一种发展很快的软件体系结构描述方法,目前,已经有几十种常见的ADL软件体系结构描述框架标准鉴于体系结构描述的概念和
9、实践的不统一,IEEE于1995年8月成立了体系结构工作组IEEE P1471 IEEE P1471于2000年9月21日通过IEEE-SA标准委员会评审。 IEEE P1471适用于软件密集的系统,其目标在于:便于体系结构的表达与交流,并通过体系结构要素及其实践标准化,奠定质量与成本的基础。IEEE P1471详细介绍了一套体系结构描述的概念框架,并给出建立框架的思路。但如何描述以及具体的描述技术等方面缺乏更进一步的指导。 RationalRational起草了可复用的软件资产规格说明,专门讨论了体系结构描述的规格说明,提出了一套易于复用的体系结构描述规范。该建议草案已经提交OMG。基于RU
10、P(Rational United Process)、采用UML模型描述软件的体系结构,认为体系结构描述的关键是定义视点、视图以及建模元素之间的映射关系。与IEEE P1471相比,该建议标准的体系结构描述方案涉及面比较窄,所注重的层次比较低,因而更具体。由于将体系结构的描述限于UML和RUP,具有一定的局限性,但该建议标准结合了业界已经广泛采用的建模语言和开发过程,因而易于推广,可以有效实现在跨组织之间复用体系结构描述结果。软件体系结构描述语言 ADL是在底层语义模型的支持下,为软件系统的概念体系结构建模提供了具体语法和概念框架。基于底层语义的工具为体系结构的表示、分析、演化、细化、设计过程
11、等提供支持。其三个基本元素是:构件、连接件、体系结构配置。 主要的体系结构描述语言有Aesop、MetaH、C2、Rapide、SADL、Unicon和Wright等,尽管它们都描述软件体系结构,却有不同的特点。 这些ADL强调了体系结构不同的侧面,对体系结构的研究和应用起到了重要的作用,但也有负面的影响。每一种ADL都以独立的形式存在,描述语法不同且互不兼容,同时又有许多共同的特征 ADL与其他语言的比较(1) 构造能力:ADL能够使用较小的独立体系结构元素来建造大型软件系统; 抽象能力:ADL使得软件体系结构中的构件和连接件描述可以只关注它们的抽象特性,而不管其具体的实现细节; 复用能力:
12、ADL使得组成软件系统的构件、连接件甚至是软件体系结构都成为软件系统开发和设计的可复用部件; 组合能力:ADL使得其描述的每一系统元素都有其自己的局部结构,这种描述局部结构的特点使得ADL支持软件系统的动态变化组合; 异构能力:ADL允许多个不同的体系结构描述关联存在; 分析和推理能力:ADL允许对其描述的体系结构进行多种不同的性能和功能上的多种推理分析。典型元素含义常见体系结构元素ADL定义定义ADL是一种语言,提供了对软件系统概念体系结构进行建模的特性(features)基本特性:对以下成分进行显式规约构件(components)连接件(connectors)配置(configuratio
13、ns)ADL构件定义构件是计算或数据存储单元构件是计算和状态的场所所有的ADLs支持构件建模不同的术语构件(component)接口(interface)进程(process)ADL连接件定义连接件是组成体系结构的“积木”,用于模型化构件之间的交互,以及指导这些交互的规则所有的ADLs支持连接件建模一些ADLs不把连接件作为第一类实体建模所有的ADLs至少支持语法连接(interconnection)不同的术语连接件(connector)连接(connection)绑定(binding)ADL配置定义体系结构配置或拓扑是构件和连接件的连接图,描述了系统的体系结构通过定义,ADLs必须显式地建模
14、配置配置有助于确保体系结构属性构件是否正确连接、接口是否匹配、通信是否正确、组合语义是否适合并发和分布属性遵守设计启发规则和风格规则ADL实例 UniCon UniCon: Universal Connector language CMU开发,支持对体系结构的描述。对构件交互模式的定位和编码,并且对需要不同交互模式的构件加以区分。 提供对大量构件和连接件的统一访问 区分不同类型的构件和连接件以便对体系结构配置进行检查 支持不同的表示方法和不同开发人员的分析工具 支持对现有构件的使用 通过定义类型、特性列表与用于和连接件相连的交互点来描述构件 构件的交互点称为端口 连接件的交互点称为角色 系统组
15、合构造就是通过定义构件端口和连接件角色之间的连接来完成的 预定义的构件和连接件类型 构件类型:模块 (module),计算(computation),过滤器 (filter),进程 (process), 连接件类型:管道(pipe),文件IO (),过程调用 (procedure call),数据访问 (data access),远程过程调用 (remote proc call), 为构件连接生成“胶水”代码 实现约束 允许非功能属性规约UniCon的语法 (1)一个体系结构是包含以下成分的复合构件(composite component)原子(atomic)或复合构件类型包括接口 (inte
16、rface) 预定义的演员(players)和属性(attributes)集合 预定义的每个演员的属性集合实现 (implementation)连接件类型协议 (protocol) 预定义的角色和属性集合 为每个角色预定义的属性集合实现 (implementation)构件类型和连接件类型的实例化 (uses)实例的配置 (connect)UniCon的语法 (2)UniCon构件演员PLAYER input IS StreamInMAXASSOCS (1)MINASSOCS (1)SIGNATURE (“line”)PORTBINDING (pipe.Source)END inputUniC
17、on连接件角色约束ROLE output IS SourceMAXCONNS (1)ACCEPT (Filter.StreamIn)END outputUniCon的语法 (3)UniCon配置USES p1 PROTOCOL Unix-pipeUSES sorter INTERFACE Sort-filterUSES p2 PROTOCOL Unix-pipeUSES printer INTERFACE Print-filterADL实例 RapideStanford Uni.开发,可执行的ADL。目的在于定义并模仿基于事件的行为对分布式并发系统建模。集中于动态行为的建模和模拟通过事件的偏序
18、集合刻画系统的行为 (posets)构件计算由构件接受到的事件触发,并进一步产生事件传送到其它构件,由此触发其他的计算Rapid模型的执行结果为一个事件的集合,其中的事件满足一定的因果和时序关系 包含若干子语言 类型 (types)语言:定义接口类型和函数类型,支持通过继承已有的接口来构造新的接口类型 模式 (pattern)语言:定义具有因果、独立、时序等关系的事件所构成的事件模式 体系结构 (architecture)语言:通过定义同步和通信连接来描述构件之间的事件流 约束 (constraint)语言:定义构件行为和体系结构所满足的形式化约束,其中约束为需要的或禁止的偏序模式 可执行 (
19、executable)语言:包含描述构件行为的控制结构 优点 提供多种分析工具,基于检测在某个模拟过程中的事件是否违反了已定义的偏序关系 基于接口定义体系结构,可以在体系结构定义中使用尚未存在的构件,只要构件符合特定接口就可以了Rapide的语法 (1)一个体系结构包括构件类型 (interfaces)接口元素(functions)的同步通讯 provides requires接口元素(events)的异步通讯 in action out action连接件 (connections)约束 (constraints)Rapide的语法 (2)Rapide事件模式Evt1(?prm) and E
20、vt2(?prm);Evt1Evt2;Evt1 Evt2;Evt1(?prm) where ?prm Results(?M);end Application;C2概述(1)C2和其提供的设计环境(Argo)支持采用基于时间的风格来描述用户界面系统,并支持使用可替换、可复用的构件开发应用系统体系结构。在C2中,连接件负责构件之间消息的传递,而构件维持状态、执行操作并通过两个名字分别为“top”和“bottom”的端口和其它的构件交换信息。每个接口包含一种可发送的消息和一组可接收的消息。构件之间的消息要么是请求其它构件执行某个操作的请求消息,要么是通知其他构件自身执行了某个操作或状态发生改变的通知
21、消息。C2概述(2)构件之间的消息交换不能直接进行,而只能通过连接件来完成。每个构件接口最多只能和一个连接件相连,而连接件可以和任意数目的构件或连接件相连。请求消息只能向上层传送而通知消息只能向下层传送。通知消息的传递只对应于构件内部的操作,而和接收消息的构件的需求无关。C2对构件和连接件的实现语言、实现构件的线程控制、构件的部署以及连接件使用的通讯协议等都不加限制。 C2对构件接口的描述C2对构件的描述component_message_interface := top_domain_interface bottom_domain_interfacetop_domain_interface
22、:= top_domain is out interface_requests in interface_notificationsbottom_domain_interface := bottom_domain is out interface_notifications in interface_requestsinterface_requests := request; | null;interface_notifications := notification; | null;request := message_name(request_parameters)request_para
23、meters := to component_nameparameter_listnotification := message_nameparameter_list 会议安排系统的C2风格Attendee-1Attendee-M.AttConnImportantAttendee-1ImportantAttendee-N.ImportantAttConnMainConnMeetingInitiatorC2对MeetgingInitiator构件的描述(1)component MeetingInitiator is interface top_domain is out GetPrefSet()
24、; GetExclSet(); GetEquipReqts(); GetLocPrefs(); RemoveExclSet(); RequestWithdrawal(to Attendee); RequestWithdrawal(to ImportantAttendee); AddPrefDates(); MarkMtg(d:date;l:lov_type);C2对MeetgingInitiator构件的描述(2) in PrefSet(p:date_mg); ExclSet(e:data_mg); EquipReqts(eq:equip_type); LocPref(l:loc_type);
25、 behavior startup always_generate GetPrefSet, GetExclSet, GetEquipReqts, GetLocPrefs; received_messages PrefSet may_generate RemoveExclSet xor RequestWithdrawal xor MarkMtg; received_messages ExclSet may_generate AddPrefDates xor RemoveExclSet xor RequestWithdrawal xor MarkMtg; received_messages Equ
26、ipReqts may_generate AddPrefDates xor RemoveExclSet xor RequestWithdrawal xor MarkMtg; received_messages LocPref always_generate null;end MeetingInitiator; C2对Attendee构件的描述(1) component Attendee is interface bottom_domain is out PrefSet(p:date_mg); ExclSet(e:date_mg); EquipReqts(eq:equip_type); in G
27、etPrefSet(); GetExclSet(); GetEquipReqts(); RemoveExclSet(); RequestWithdrawal(); AddPrefDates(); MarkMtg(d:date;l:loc_type);C2对Attendee构件的描述(2) behaviorreceived_messages GetPrefSet always_generate PrefSet;received_messages AddPrefDates always_generate PrefSet;received_messages GetExclSet always_gen
28、erate ExclSet;received_messages GetEqipReqts always_generate EqipReqts;received_messages RemoveExclSet always_generate ExclSet;received_messages ReuestWithdrawal always_generate null;received_messages MarkMtg always_generate null;end Attendee; C2对ImportantAttendee构件的描述component ImportantAttendee is
29、subtype Attendee(in and beh) interface bottom_domain is out LocPrefs(l:loc_type); ExclSet(e:date_mg); EquipReqts(eq:equip_type); in GetLocPrefs(); behaviorreceived_messages GetLocPrefs always_generate LocPrefs;end ImportantAttendee; C2对体系结构的描述architecture MeetingScheduler is conceptual_components At
30、tendee;ImportantAttendee;MeetingInitiator; connectors connector MainConn is message_filter no_filtering; connector AttConn is message_filter no_filtering; connector ImportantAttConn is message_filter no_filtering; architectural_topology connector AttConn connections top_ports Attendee; bottom_ports
31、MainConn; connector ImportantAttConn connections top_ports ImportantAttendee; bottom_ports MainConn; connector MainConn connections top_ports AttConn;ImportantAttConn; bottom_ports MeetingInitiator;end MeetingScheduler; C2对会议安排系统的描述 system MeetingScheduler_1 is architecture MeetingScheduler with Att
32、endee instance Att_1,Att_2,Att_3; ImportantAttendee instance ImpAtt_1,ImpAtt_2; MeetingInitiator instance MtgInit_1;end MeetingScheduler_1; ADL实例 ACME Acme是一种体系结构交换语言,旨在解决目前出现的众多ADLs之间的不兼容问题 Acme提供了一个统一的结构化框架,描述公共的体系结构信息 通过注释的方法,刻划特定于某种ADL的信息 从不同方面对体系结构进行描述 结构 属性 约束 类型和风格结构 Acme使用七种成分描述一个系统的体系结构: 构件
33、(components) 连接件(connectors) 端口(ports) 角色(roles) 系统(systems) 表示(representations) 性质(properties)系统成分 在Acme中,软件体系结构描述了构件和构件之间的相互关系。 构件是实施计算和存放状态的场所,每个构件通过接口规约(interface specification)定义了一组属性,包括功能属性和非功能属性两个方面,每个构件属于某个类型或子类型(例如,过滤器、客户、服务器等)。 连接件是表达构件之间关系的场所,每个连接件通过协议规约(protocol specification)定义了一组属性,规定了
34、它能连接的接口类型、事件发生的顺序、对交互的承诺等,每个连接件属于某个类型或子类型(例如,远程过程调用、管道、消息广播、事件等)。 打个形象的比喻,每个构件通过接口规范定义了一组“演员”,每个连接件通过协议规范定义了一组“角色”,只有当构件中的“演员”和连接件中的“角色”匹配时,它们才能连接在一起。System simple_cs = Component client = Port send-request; Component server = Port receive-request; Connector rpc = Role caller; Role callee; Attachment
35、s client.send-request to rpc.caller ; server.receive-request to rpc.callee ACME的例子属性记录一个系统体系结构的非结构属性取决于系统的特性、所需要的分析种类、可以获得的工具和在描述中所包括的详细程度ACME采用属性列表对体系结构进行注释,每个属性有名称、可选类型和值利用属性列表记录与体系结构相关的分析和设计细节System simple_cs = Component client = Port send-request; Properties request-rate : float = 17.0; source-c
36、ode : external-file = CODE-LIB/client.c Component server = Port receive-request; Properties boolean = true; max-concurrent-clieidempotence :nts : integer = 1; source-code : external-file = CODE-LIB/server.c Connector rpc = Role caller; Role callee; Properties synchronous : boolean = true; max-roles
37、: integer = 2 Attachments client.send-request to rpc.caller ; server.receive-request to rpc.callee 设计约束ACME使用一阶谓词逻辑的约束语言来描述设计约束约束可以与任何设计元素相关联Connected (comp1, comp2) 如果构件如果构件comp1与与comp2之间至少有一个连之间至少有一个连接件,则取接件,则取True,否则取,否则取FalseReachable (comp1, comp2) 如果构件如果构件Comp2处在处在Connected (comp1, *)上,则取上,则取T
38、rue,否则取,否则取FalseHasProperty (elt, propName) 如果元素如果元素elt有一个属性,取名为有一个属性,取名为ProNameHasType (elt, typeName)如果元素如果元素elt有一个类型,取名为有一个类型,取名为TypeName。类型和风格风格允许定义领域特定的或应用特定的设计词汇,以及如何使用这些词汇的约束ACME风格定义中的基本构造块是一个类型系统属性类型、结构类型和风格Component Type Client = Port Request = Property protocol: CSProtocolT; Property Reque
39、st-rate: Float; Invariant size(self.Ports) =0; Heuristic request-rate 100;风格一组结构元素和属性、一组约束、默认结构Family PipeFilterFam = Componet Type FilterT = Ports stdin; stdput; Property throughout:int; ; Compont Type UnixFilterT extends FilterT with Port stderr; Property implementationFile: String; ; connector Ty
40、pe PineT = roles source; sink property bufferSize:int; Property Type StringMsgFormatT = Record size:int; msg: String; Invariant Forall c in self.Connectors HasType (c, pipeT);软件体系结构与UMLUML简介UML(Unified Modeling Language)是下面这些最好的建模方法中最好部分的集成商务流程模型(Work Flow)对象建模方法构件建模思想UML是一种用可视化方法对软件系统进行描述、实施和说明的标准语
41、言。适用于各种软件开发方法、软件生命周期的哥哥阶段、各种应用领域以及各种开发工具,总结了以往建模技术的经验并吸收当今优秀成果的标准建模方法。UML简介UML简介UML简介Use CaseDiagramsUse CaseDiagrams用例图ScenarioDiagramsScenarioDiagrams协作图StateDiagramsStateDiagrams构件图ComponentDiagramsComponentDiagrams部署图StateDiagramsStateDiagrams对象图ScenarioDiagramsScenarioDiagrams状态图Use CaseDiagram
42、sUse CaseDiagrams序列图StateDiagramsStateDiagrams类图活动图UML用例图用于显示若干角色以及这些角色与系统提供的用例之间的连接关系。用例是系统提供的功能的描述 类图表示系统中的类和类与类之间的关系,它是对系统静态结构的描述 序列图用来反映若干个对象之间的动态协作关系,也就是随着时间的推移,对象之间是如何交互的 协作图描述对象间的协作关系,协作图跟序列图相似,显示对象间的动态合作关系。如果强调时间和顺序,则使用序列图;如果强调上下级关系,则选择协作图。这两种图合称为交互图。 状态图描述类的对象所有可能的状态以及事件发生时状态的转移条件。通常,状态图是对类
43、图的补充 活动图描述满足用例要求所要进行的活动以及活动间的约束关系,有利于识别并行活动 构件图描述代码构件的物理结构及各构件之间的依赖关系 部署图部署图定义系统中软硬件的物理体系结构直接使用UML建模元-元模型元模型模型用户对象元-元模型层定义了元模型层的规格说明语言,元模型层为给定的建模语言定义规格说明,模型层用来定义特定软件系统的模型,用户对象用来构建给定模型的特定实例。 直接使用UML建模语义约束由对象约束语言OCL表示,OCL基于一阶谓词逻辑,每一个OCL表达式都处于一些UML模型元素的背景下(由“self”引用),可使用该元素的属性和关系作为其项(term),同时OCL定义了在集合(sets)、袋(bags)等上的公共操作集和遍历建模元素间关系的构造,因此,其它建模元素的属性也可以作为它的项。直接使用UML建模类及其属性、操作和类之间的静态关系,类的包和它的依赖关系;类的状态及其行为;对象之间的交互行为;源代码的结构
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年工交企业流动资借款合同
- 2024年营口旅客运输从业资格证考试题库
- 2024年合作养殖协议范本
- 2024年南京大客车从业资格证考试
- 2024年客运从业资格证试题下载电子版
- 2024年长沙汽车客运从业资格考试
- 2024年房屋买卖定金合同范
- 2024年经济适用房出售协议
- 2024年杭州市新建房屋白蚁预房工程合同
- 2024年中药饮片采购项目政府采购合同
- 杭州本级公共租赁住房资格续审申请表Ⅴ
- GB/T 18281.7-2024医疗保健产品灭菌生物指示物第7部分:选择、使用和结果判断指南
- 北京四中初一年级期中语文试题
- 二十届三中全会精神学习试题及答案(100题)
- 2024二十届三中全会知识竞赛题库及答案
- 2024年江苏省昆山市自然资源和规划局招聘编外13人历年(高频重点复习提升训练)共500题附带答案详解
- 小学一年级拼音天天练
- 支气管哮喘急性发作个案护理记录
- 一年级数学专项练习(大括号问题、求总数、求部分数、一图四式)
- 档案整理及数字化服务方案
- 李居明的《饿命学》五+行+饿+命+改+运+学
评论
0/150
提交评论