高級軟件工程課件_第1頁
高級軟件工程課件_第2頁
高級軟件工程課件_第3頁
高級軟件工程課件_第4頁
高級軟件工程課件_第5頁
已閱讀5頁,還剩280頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

高級軟體工程

第一章概述1、軟體發(fā)展現(xiàn)狀

2、軟體發(fā)展趨勢3、現(xiàn)有軟體標準4、軟體工程研究範圍的擴展1、軟體發(fā)展現(xiàn)狀

(1)已經(jīng)存在大量正在運行的軟體 金融、電信、航空航太等(2)軟體的應用範圍不斷擴大 商務、交通、家電等,“無處不在的軟體”(3)軟體的規(guī)模與複雜性持續(xù)增加 越來越多的知識正在由軟體進行顯式表達(4)出現(xiàn)了大量與軟體相關的標準 (3)的需求(5)軟體危機仍然存在(軟體脫節(jié))

1968-20002、軟體發(fā)展趨勢(1)遺留軟體將繼續(xù)發(fā)揮作用(2)軟體應用範圍將繼續(xù)擴大,成為資訊社會的物理設施(3)網(wǎng)路化軟體將是發(fā)展重點(4)軟體的可靠性與安全性日趨重要(5)工業(yè)化生產(chǎn)是必由之路3、與軟體相關的各種標準(1)網(wǎng)路協(xié)議:ISO/OSIvsTCP/IP(2)軟體構件:CORBAvsCOM(3)建模語言:UML(4)數(shù)據(jù)訪問:ODBC(5)工程管理:CMMvsISO(9001-3,15504)4、軟體工程研究範圍的擴展軟體工程: “確立並使用正確的工程原理和方法, 以便能夠經(jīng)濟地獲得可靠而有效的軟體”。

FriedrichI.Bauer

原則 (形式化、模組化等)方法與技術(過程及結果表示)開發(fā)方法(結果描述為主):結構化方法面向對象方法開發(fā)模型(過程描述為主):瀑布模型漸進(增量)模型螺旋模型噴泉模型工具

高級軟體工程: 以傳統(tǒng)軟體工程研究內容為基礎, 以面向對象技術、網(wǎng)路計算技術、軟體複用技術為核心

以CORBA、COM、UML標準等為主要參考 討論、研究軟體開發(fā)過程中需要關注的新焦點

新概念(原理): 軟體構件 體系結構新方法(技術): 過程與結果 軟體複用與 工程管理方法與技術原則工具面向對象技術分佈計算技術軟體複用技術傳統(tǒng)軟體工程高級軟體工程概念與原理 方法與技術工具與環(huán)境第二章軟體構件

本章以分佈對象為核心 結合CORBA與COM

介紹運行級大粒度構件的 概念與原理

什麼是軟體構件 構件是系統(tǒng)中可以明確辨識的構成成分 軟體構件是軟體系統(tǒng)中具有一定意義的 獨立構成成分 可複用軟體構件是可以被多個軟體系統(tǒng)所複用的、 具有獨立功能的軟體系統(tǒng)構成成分

構件 是可以被直接複用的軟體實體 由構件介面與構件實現(xiàn)兩部分組成

構件分類: 縱向: 系統(tǒng)級構件 應用構件 共性 面向領域 橫向: 介面構件(控件) 業(yè)務構件 數(shù)據(jù)訪問構件本課程重點關注: 應用構件 業(yè)務構件這樣的構件與分佈對象技術中的構件(分佈對象)概念 完全吻合

本章內容一、分佈對象技術發(fā)展過程二、CORBA三、COM四、不同實現(xiàn)技術的比較一、分佈對象技術發(fā)展過程

程式=演算法+數(shù)據(jù)結構軟體=程式+文檔模組化是軟體的規(guī)模與複雜性 發(fā)展到一定程度時產(chǎn)生的必然結果

關注焦點的不同,形成了不同的技術: 數(shù)據(jù)與操作的封裝 面向對象技術 利用網(wǎng)路計算環(huán)境 分佈計算技術 利用已經(jīng)開發(fā)出的代碼 軟體複用技術

不論哪種技術 模組形式及模組之間的協(xié)作方式是關鍵問題 面向對象技術: 對象 對象之間的關聯(lián) 分佈計算技術: 不同節(jié)點上的運行程式 及程式之間的通訊 軟體複用技術: 軟體構件 軟體構件的組裝從運行時刻不同模組所處的進程考慮,兩個模組之間存在如下三種關係:同一進程內部: 副程式 共用變數(shù)同一機器的不同進程: 操作系統(tǒng)提供進程間通訊不同機器上: 消息傳遞:TCP/IP

遠程過程調用:RPC(DCE)模組化繼續(xù)發(fā)展的結果之一即為分佈對象分佈對象技術是 面向對象技術 分佈式計算(網(wǎng)路計算)技術 軟體複用技術 的結合 三者具有內在的一致性:自治、協(xié)作分佈對象技術的核心: 分佈對象模型,以及分佈對象間的互操作分佈對象技術的實現(xiàn):

OMG的CORBA

微軟的DCOM二、CORBA

本節(jié)內容1、OMG與CORBA2、CORBA對象模型3、CORBA概述4、IDL5、ORB介面6、IR7、POA8、舉例(9、CCM)1、OMG與CORBA(1)OMG();成立於1989年4月固定成員很少不做開發(fā):OMG不寫任何代碼致力於利用現(xiàn)有的技術進行應用系統(tǒng)的集成目前已經(jīng)擁有超過1000個的成員: 包括軟體廠商、系統(tǒng)集成商以及最終用戶OMG與CORBA匯流排

(2)如何使分佈對象互操作電腦硬體中的模組及互聯(lián)方式:OMG與CORBAObjectRequestBrokerObjectServicesApplicationInterfacesDomainInterfacesCommonFacilitiesOMG與CORBAOMA:ObjectManagementArchitectureOMG發(fā)佈的與CORBA相關的規(guī)範1、ORB

CORBA:CommonObjectRequestBrokerArchitectureand Specification2、ObjectServices CORBAservices:CommonObjectServicesSpecification.3、CommonFacilities

CORBAfacilities:CommonFacilitiesArchitecture本章介紹CORBA的主要內容其他規(guī)範的部分內容將在第三章中進行介紹OMG與CORBACORBA規(guī)範(2.3.1)內容第一部分:CORBACORE第一章:對象模型,描述CORBA環(huán)境中的計算模型第二章:CORBA綜述,描述ORB結構,以及介面、實現(xiàn)資訊第三章:OMGIDL詞法與語義,描述OMGIDL,IDL被用於 描述客戶對象調用、對象實現(xiàn)提供的介面第四章:ORB介面,定義ORB中不依賴於對象適配器的功能介面第五章:值類型語義,描述通過值傳送對象的語義。第六章:抽象介面語義,解釋一種抽象介面,它提供了延遲至 運行時刻決定對象由引用還是由值傳送。OMG與CORBA第七章:動態(tài)調用介面(DII),客戶端介面,允許動態(tài)創(chuàng)建併發(fā)出對象的請求。第八章:動態(tài)骨架介面(DSI),伺服器端介面,可以從ORB

向對象實現(xiàn)發(fā)出請求,該實現(xiàn)體不具有它所實現(xiàn)對象 類型的編譯知識。第九章:AnyValues的動態(tài)管理,描述動態(tài)AnyValues的介面。第十章:介面池,描述ORB的一個組成部分,它管理並提供對 對象定義集合的訪問。第十一章:可移植對象適配器(POA),定義一組IDL介面, 實現(xiàn)體用它們訪問ORB功能。OMG與CORBA第二部分:CORBA互操作第十二章:互操作綜述第十三章:ORB互操作體系結構第十四章:建立ORB間互操作的橋第十五章:GeneralInter-ORBProtocol(GIOP)第十六章:DCEESIOP-Environment-Specific Inter-ORBProtocol(ESIOP)OMG與CORBA

第三部分:CORBA協(xié)作第十七章:協(xié)作體系結構第十八章:Mapping:COMandCORBA第十九章:Mapping:OLEAutomationandCORBA第二十章:與非CORBA系統(tǒng)互操作第二十一章:InterceptorsOMG與CORBA第一章:CORBA對象模型第二章:CORBA綜述第三章:OMGIDL第四章:ORB介面第五章:值類型語義第六章:抽象介面語義第七章:動態(tài)調用介面第八章:動態(tài)骨架介面第九章:AnyValues的動態(tài)管理第十章:介面池第十一章:可移植對象適配器(POA)本節(jié)主要講述內容

應用程式具體開發(fā)步驟

2、CORBA對象模型(概念)客戶對象(執(zhí)行服務)以客戶/伺服器模式為對象間互操作模型CORBA對象模型請求

對象實現(xiàn)對象系統(tǒng)的實現(xiàn)執(zhí)行請求服務所需的計算活動這些活動可以包括計算請求的結果和更新系統(tǒng)狀態(tài)在這個過程中可能發(fā)出其他請求實現(xiàn)模型包括兩部分:執(zhí)行模型和構造模型執(zhí)行模型描述如何執(zhí)行服務構造模型描述如何定義服務(1)對象符合傳統(tǒng)對象的語義,具有封裝、繼承、多態(tài)等特點?!皩ο笫强蓸俗R的封裝實體,

提供客戶可以請求的一個或多個服務”。CORBA對象模型(2)請求(request)客戶通過發(fā)出請求來請求服務?!皬目蛻舻某跏蓟_始,至與該初始化因果相關的最後一個事件之間的全部因果相關的事件序列”。最後一個事件可能為:客戶從伺服器接收到與請求相關的最後回應。伺服器在單向請求的情況下處理完相關操作。與請求相關的事件序列因失敗而終止。 與請求相關的資訊包括: 操作 目標對象 零個或多個(實際)參數(shù) 以及可選的請求環(huán)境CORBA對象模型值(Value) 任何可以作為合法請求(實)參數(shù)的皆可以是值。 尤其是,一個值是一個OMGIDL數(shù)據(jù)類型的一個實例。

對象引用(objectreference)對象引用是可靠地指示一個特定對象的值。特別地,每次在請求中使用引用時,對象引用將標識相同的對象(受到某些空間和時間的實際限制)。對象可以由多個不同的對象引用指示。CORBA對象模型(3)類型(type)類型是與一個定義在一組實體之上的謂詞(結果為布爾型的單參數(shù)數(shù)學函數(shù))相關聯(lián)的可標識實體。如果謂詞對於某個實體為真,那麼該實體滿足類型。 滿足類型的實體稱為類型的成員。類型用於在簽名(signature,基調、函數(shù)頭)中對可能的參數(shù)進行約束、特徵化可能的返回結果。對象類型(objecttype)是成員為對象引用的類型。

CORBA對象模型(4)操作(operation)一個操作是一個指示不可分割原語的可標識實體,該原語是可以被請求的服務體。請求一個操作的活動被稱為調用(invoking

,喚起)操作。一個操作是由操作識別字標識的。操作有一個描述請求參數(shù)合法值和返回值的簽名。簽名包括:·

請求該操作時所需參數(shù)的規(guī)定·

操作結果的規(guī)定·

請求操作所引發(fā)例外處理的規(guī)定和它們附帶的參數(shù)類型·

可能影響請求的其他環(huán)境資訊規(guī)定·

客戶預期從請求操作獲得的執(zhí)行語義指示CORBA對象模型

操作簽名的一般形式為:

[oneway]<op_type_spec><identifier>(param1,...,paramL) [raises(except1,...,exceptN)][context(name1,...,nameM)]

其中:

·

可選的oneway關鍵字指示對該操作的請求預期獲得最佳效果 語義;如果操作成功返回結果,則默認語義是只有一次,如 果返回例外處理,則默認語義是最多一次。

· <op_type_spec>是返回結果的類型

· <identifier>為介面中的操作提供名稱

·

操作所需的操作參數(shù);它們以修飾符in、out或inout標記, 目的是指示信息流的方向(相對於執(zhí)行請求的對象)

·

可選的raises運算式指示可以引發(fā)的用戶定義例外處理,它們 用於終止對該操作的請求;如果沒有提供這樣的運算式,那麼 不會引發(fā)任何用戶定義的例外處理

·

可選的context運算式指示將對對象實現(xiàn)有效的請求環(huán)境資訊; 沒有其他資訊需要與請求一起傳送。CORBA對象模型(5)介面(interface)“介面是一組操作的描述,客戶可以通過該介面向對象請求這些操作”。介面提供了句法描述,說明支持該介面的對象所提供服務的如何被訪問。我們說一個對象滿足一個介面,如果它按照操作的規(guī)約通過介面的操作提供其服務。一個給定介面的介面類型是一個對象類型,一個對象引用滿足該類型,當且僅當所引用的對象也滿足該介面。介面是用OMGIDL指定的。介面繼承提供的複合機制允許對象支持多個介面。CORBA對象模型值類型(valuetype)

一個值類型是一個實體,同時具有介面與結構的許多特徵。它是關於客戶可能請求的操作集合與可以由客戶訪問的狀態(tài)集合的描述。值類型實例總是某種編程語言中的本地實在實現(xiàn)體。

值類型是用OMGIDL指定的。抽象介面(abstractinterface)一個抽象介面是一個實體,在運行時可能表示一個通常的介面,也可能表示一個值類型。實體運行時刻的類型取決於它們使用的語義。CORBA對象模型(6)屬性(attribute) 屬性是介面的一部分 屬性從邏輯上等價於聲明一對輔助函數(shù) 一個獲取屬性的值(set) 一個設置屬性的值(get)屬性可以是只讀的CORBA對象模型CORBA概述例子:GridObjectGridobjectserver123581321345589144233widthheightget(row,col)set(row,col,value)clientCORBA概述客戶是希望在對象上執(zhí)行操作的實體對象實現(xiàn)是實現(xiàn)對象的代碼和數(shù)據(jù)ORB負責組成請求的數(shù)據(jù)的通訊 查找請求所需對象實現(xiàn)的機制 準備接收請求的對象實現(xiàn) (1)對象請求代理的結構客戶如何通過ORB向對象實現(xiàn)發(fā)出請求CORBA概述對象請求代理的結構CORBA概述客戶利用存根或者DII發(fā)出請求CORBA概述對象實現(xiàn)通過Skeleton或者DSI接收請求CORBA概述介面池與實現(xiàn)池對CORBA結構中元素的解釋

ORB及介面 客戶 對象實現(xiàn) 對象引用

IDL及向編程語言的映射 客戶存根與DII

實現(xiàn)骨架與DSI

對象適配器 介面池 實現(xiàn)池CORBA概述CORBA概述對象請求代理(ORB)不要求將ORB實現(xiàn)為單獨的構件 而僅定義其介面任何提供正確介面的ORB實現(xiàn)都是可以接受的

ORB的具體實現(xiàn)包括:

ORBCore、IDL編譯器、IR、ObjectAdapterORB可以有多種實現(xiàn)它們對對象引用有不同的表示方法並且有不同的調用執(zhí)行方法

ORBCore提供對象的基本表示,以及請求的通訊 特別地:編排/反編排(Marshal/Unmarshal) 將高層語言的參數(shù)等表示轉換為 便於底層網(wǎng)路傳輸?shù)男问絆RB介面

ORB介面是客戶與對象實現(xiàn)可以直接訪問到的

ORB功能介面其他多數(shù)功能提供給 對象適配器

stub skeleton

動態(tài)調用

ORB介面 對所有ORB都是一樣的 不依賴於任何對象的介面或對象適配器CORBA概述CORBA概述客戶(Client)(對象的)客戶訪問對象的對象引用 並且調用對象上的操作客戶只知道對象的邏輯結構 根據(jù)它的介面,並通過調用感受對象的行為儘管一般認為客戶是向對象發(fā)出請求的程式或進程但是客戶只是相對於特定對象而言的,是一個相對概念 一個對象的實現(xiàn)可以是其他對象的客戶客戶客戶伺服器伺服器CORBA概述對象實現(xiàn)通過為對象實例定義數(shù)據(jù)和 為對象方法定義代碼 提供對象的語義對象可以具有不同的實現(xiàn)方式,包括: 單獨的伺服器 庫 每個方法的程式 封裝應用程式 面向對象的資料庫等等對象實現(xiàn)不依賴於ORB或者客戶調用對象的方式對象實現(xiàn)可以通過選擇ObjectAdapter

達到選擇與ORB相關服務的介面的目的對象實現(xiàn)(ObjectImplementation)

對象引用提供在ORB內指定對象時所需要的資訊

對象引用對於客戶和對象實現(xiàn)都是一個位流(opaque)的概念因此客戶與對象實現(xiàn)可以與引用的實際表示分離。在選擇對象引用表示上,不同的ORB可以有所差別傳遞給客戶的對象引用表示僅在客戶的生命期內有效對於一個特定的編程語言,所有的ORB都必須提供對象引用(通常稱為對象)的相同語言映射。這就允許用特定語言編寫的程式可以在獨立於特定ORB的情況下訪問對象引用。語言映射也可以提供其他訪問對象引用的方式CORBA概述對象引用(ObjectReference)OMG介面定義語言(OMGIDL)通過指定對象介面 定義對象類型介面包括一組已命名的操作和這些操作的參數(shù)。

IDL是一個分析設計結果描述ORB操縱的對象 其源代碼的存在對ORB正常工作不是必須的在運行時刻,以stub程式或者運行時介面repository的形式 提供等價的資訊。通過IDL,特定對象實現(xiàn)告訴它潛在的客戶: 什麼是有效的操作以及如何調用這些操作從IDL定義可以將CORBA對象向 特定編程語言或者對象系統(tǒng) 映射CORBA概述OMG介面定義語言interfaceGrid{readonlyattributeshortheight;readonlyattributeshortwidth;voidset(inshortrow,inshortcol,inlongvalue);longget(inshortrow,inshortcol);};例子:grid.idlCORBA概述CORBA中主要構件的介面全部由IDL進行定義 例如:ORB介面、Stub、Skeleton、對象適配器更主要的用途是定義應用對象!

語言映射包括定義特定於語言的數(shù)據(jù)類型和通過ORB訪問對象的過程介面。它包括:

客戶stub介面的結構(面向對象的語言不需要) 動態(tài)調用介面 實現(xiàn)骨架 對象適配器和直接ORB介面語言映射也包括對象調用之間以及客戶或實現(xiàn)中控制線程之間的交互。最常見的映射提供同步調用:當對象操作完成時副程式返回編譯開關(選項)控制映射具體策略。CORBA概述IDL向具體語言的映射CORBA概述ORBclientlibraryORBserverlibrary編譯

IDL:gridS.cppserverskeletongridC.cppclientstubsClientServergrid.hcommondeclarationsgrid.idl所產(chǎn)生的

C++頭檔(Orbix):classGrid:publicvirtualCORBA::Object{public: staticGrid_ptr_bind(....); virtualCORBA::Shortheight(CORBA::Environment&); virtualCORBA::Shortwidth(CORBA::Environment&); virtualvoidset(CORBA::Shortrow,CORBA::Shortcol, CORBA::Longvalue,CORBA::Environment&);

virtualCORBA::Longget(CORBA::Shortrow, CORBA::Shortcol, CORBA::Environment&);};CORBA概述客戶存根(Clientstub)

由IDL編譯器根據(jù)IDL檔生成客戶訪問對象的操作主要方式實現(xiàn)對象位置透明性

向非面向對象語言映射時 將為每個介面類型產(chǎn)生一個stub編程介面面向對象的編程語言不需要stub介面 它通過偽對象的方式提供訪問對象的操作。CORBA概述DII(動態(tài)調用介面)

客戶指定要調用的對象、要執(zhí)行的操作和調用或調用序列中操作的參數(shù)集,而不是調用特定於特殊對象上特殊操作的stub副程式??蛻舸a必須提供要執(zhí)行操作的資訊和傳送參數(shù)的類型動態(tài)調用介面的特性可能因編程語言映射的不同而不同客戶通過靜態(tài)還是動態(tài)介面發(fā)出請求 對於對象實現(xiàn)是透明的CORBA概述CORBA_Create_request(...)…CORBA_Request_add_arg(...)CORBA_Request_add_arg(...)…CORBA_Request_invoke(...)…CORBA_Request_delete(...)實現(xiàn)骨架(ImplementationSkeleton)

由IDL編譯器根據(jù)IDL檔生成對象適配器訪問對象實現(xiàn)中方法的主要形式對於一種特定映射語言,以及可能的特定對象適配器

Skeleton與stub不是必然對應的 客戶也可以通過動態(tài)調用介面發(fā)出請求但也可以編寫不使用skeleton調用實現(xiàn)方法的對象適配器CORBA概述動態(tài)骨架介面(DSI)

通過一個“提供訪問操作名與參數(shù)的介面” 獲得一個對象的實現(xiàn)實現(xiàn)代碼必須向ORB提供所有操作參數(shù)的描述

ORB提供任何輸入?yún)?shù)的值,以便在執(zhí)行操作時使用在執(zhí)行操作後,實現(xiàn)代碼向ORB提供 任何輸出參數(shù)的值或者例外處理適配器通過靜態(tài)還是動態(tài)骨架介面訪問對象實現(xiàn) 對於客戶是透明的 CORBA概述動態(tài)骨架與動態(tài)調用可以被一起用於創(chuàng)建網(wǎng)關(Gateway)這些網(wǎng)關包括:不同ORB環(huán)境之間的網(wǎng)關 不同防火牆軟體之間的網(wǎng)關 安全網(wǎng)關對象適配器(ObjectAdaptor)

對象適配器是對象實現(xiàn)訪問ORB所提供服務的主要方式

ORB通過對象適配器提供的服務通常包括: 生成和解釋對象引用 方法調用 交互的安全性 對象和實現(xiàn)啟動及取消啟動 將對象引用映射到實現(xiàn) 註冊實現(xiàn) 對象粒度、壽命、策略、實現(xiàn)風格等的明顯區(qū)別使得

ORB核心很難為所有對象提供方便和有效的單一介面 通過對象適配器

ORB可以將一組特定的對象實現(xiàn)作為目標CORBA概述介面池(InterfaceRepository)

介面池提供持久對象的服務 這些對象在運行時以可用的形式表示IDL資訊

ORB可以使用介面池資訊執(zhí)行請求,例如: 如果程式在編譯時遇到介面未知的對象, 那麼使用介面池中的資訊可以: 確定對象的有效操作 對它發(fā)出調用除了在ORB運行時提供職能外,介面池也是存儲 與ORB對象介面相關的其他資訊的公共地點 例如:調試資訊

stub或skeleton庫形式化或流覽特定對象 等等CORBA概述實現(xiàn)池(ImplementationRepository)

實現(xiàn)池包含的資訊允許ORB定位和啟動對象實現(xiàn) 儘管實現(xiàn)池中的大多數(shù)資訊特定於ORB或者操作系統(tǒng), 但是實現(xiàn)池是習慣上記錄這些資訊的地點。 安裝實現(xiàn)和與啟動及執(zhí)行對象實現(xiàn)的策略控制是通過 實現(xiàn)池上的操作完成的 除了提供ORB運行時的職能外,實現(xiàn)池也是存儲 與ORB對象實現(xiàn)相關的其他資訊的公共地點 例如: 調試資訊 管理控制 資源分配 安全性 等等CORBA概述(2)ORB實現(xiàn)方式

位於客戶和對象實現(xiàn)內部的ORB

如果有合適的通訊機制,那麼ORB可以 在客戶和對象實現(xiàn)的程式中實現(xiàn)

客戶中的stub使用位置透明的IPC機制或者直接訪問地點服務 建立與實現(xiàn)的通訊

與實現(xiàn)關聯(lián)的代碼負責為客戶設置合適的資料庫(操作定位)

CORBA概述

基於伺服器的ORB

所有客戶和實現(xiàn)可以與一個或多個伺服器通訊 伺服器的任務是將請求從客戶發(fā)送到對象實現(xiàn)就底層操作系統(tǒng)而言,ORB可以是普通的程式 並且可以使用普通的IPC與ORB通訊

這是主要的ORB實現(xiàn)方式,優(yōu)點: 客戶與伺服器目標碼大小適度 便於配置

CORBA概述基於系統(tǒng)的ORB

為增強安全性、健壯性和性能 可以將ORB作為底層操作系統(tǒng)的基本服務對象引用可以永遠不變,從而減少了每次請求時驗證的開銷由於操作系統(tǒng)可以知道客戶和實現(xiàn)的地點及介面 因此可以實現(xiàn)許多不同的優(yōu)化例如當客戶與實現(xiàn)在同一臺機器上時,可以省缺編排活動基於庫的ORB

對於小型、並且其實現(xiàn)可以共用的對象,實現(xiàn)可以在庫中CORBA概述客戶在它們的程式中以庫副程式的方式訪問 特定對象類型的stub客戶程式在它的編程語言中以用普通方式調用該副程式客戶將對象引用傳送給stub副程式以初始化調用

Stub能夠訪問對象引用表示,並與ORB交互,以執(zhí)行調用

(3)客戶的結構CORBA概述在最常見的情況下,客戶通過調用擁有引用的其他對象 並作為輸出參數(shù)來獲取對象引用也可以採用從字串轉換的方法: 伺服器方將對象引用轉換為字串 然後將字串存儲在檔中 則客戶方可以將它轉換回對象引用客戶程式的具體表現(xiàn)形式與ORB的實現(xiàn)方式有關不論哪種形式,客戶程式由兩部分組成 (1)程式員編寫的代碼(2)IDL編譯器生成的代碼它們與ORB提供的功能一起,構成了抽象意義的

CORBA客戶方CORBA概述CORBA概述#include“grid.hh”#include<iostream.h>main(){Grid_varp; //LikeaC++pointer //ConnecttoaremoteGridobjectp=string_to_object(“grid.ref”);//p=Grid::_bind(“myGrid:GridSrv”,GridHost); //NowuseitlikearegularC++objectcout<<“heightis“<<p->height()<<endl;cout<<“widthis“<<p->width()<<endl;p->set(2,4,123);//aremotecallcout<<“grid[2,4]is“<<p->get(2,4)<<endl;};CORBA概述客戶程式(GridC.cpp)(4)對象實現(xiàn)的結構CORBA概述

對象實現(xiàn)以不同的方式與ORB交互來 建立它的表示 創(chuàng)建新對象 獲取與ORB相關的服務等它主要是通過對象適配器完成這些工作由於對象實現(xiàn)與

ORB實現(xiàn)方式 對象適配器實現(xiàn)途徑密切相關因此,對象實現(xiàn)的具體結構不易描述

在發(fā)生調用時

ORB核心 對象適配器

skeleton共同協(xié)商,確定調用針對的實現(xiàn)方法方法的參數(shù)之一指定要調用的對象,以便定位對象 其他參數(shù)則根據(jù)skeleton定義被提供 方法完成後返回,並導致 輸出參數(shù)或 將例外結果傳輸回客戶當創(chuàng)建新對象時,通常需要通知ORB

以便ORB知道如何找到該對象的實現(xiàn)CORBA概述CORBA概述virtualCORBA::ShortGrid_i::width(CORBA::Environment&){returnm_width;}virtualCORBA::ShortGrid_i::height(CORBA::Environment&){returnm_height;}virtualvoidGrid_i::set(CORBA::Shortrow,CORBA::Shortcol,CORBA::Longvalue,CORBA::Environment&);{m_array[row][col]=value;}CORBA::LongGrid_i::get(shortrow,shortcol,CORBA::Environment&){returnm_array[row][col];}CORBA概述對象實現(xiàn)的核心代碼(GridS.cpp)

對象適配器負責下列功能:生成和解釋對象引用方法調用交互的安全性對象和實現(xiàn)的啟動及取消啟動將對象引用映射到相應的對象實現(xiàn)註冊對象實現(xiàn)

這些功能由ORB核心與其它所需的附加構件實現(xiàn)對象適配器將保持自己的狀態(tài)來完成它的任務特定的對象適配器可以代理核心的一個或多個職能以定義大多數(shù)對象實現(xiàn)所依靠的來自ORB的服務(5)對象適配器的結構CORBA概述由於某些對象實現(xiàn)有特殊要求,所以 不同對象適配器可以提供不同的介面或功能例如,面向對象的資料庫系統(tǒng)可能希望 隱式註冊它的幾萬個對象 而不是對對象適配器做單獨調用此時,對象適配器維護每個對象的狀態(tài)是不實際和不必要的通過使用 為這樣的對象實現(xiàn)調整過的對象適配器介面可以利用特定ORB核心的細節(jié) 提供最有效的方式訪問ORBCORBA概述CORBA概述(6)一個完整的典型請求過程1.客戶獲取對象引用2.向Stub發(fā)出請求3.Stub調用ORB介面,定位伺服器4.ORB對請求進行編排5.客戶方ORB發(fā)送消息1.伺服器方接收消息2.ORB進行反編排3.OA定位(啟動)實現(xiàn)4.定位(啟動)對象5.調用方法6.返回結果6.ORB接收結果7.客戶處理結果等待伺服器處理請求客戶方伺服器方1、IDL特點

CORBA規(guī)範中最有意義的內容

IDL類似於應用程式介面(API) 在客戶代碼與對象實現(xiàn)(服務)之間定義了 一個清晰的邊界

OMGIDL是一個穩(wěn)定的標準 自1991年公佈以來,基本未改變 是OMG其他被採納規(guī)範的基礎 已經(jīng)被ISO採納(ISODIS14750)

OMGIDL

一個IDL檔可以向多個編程語言映射

IDL是獨立於語言的

CORBA規(guī)範包含IDL向具體編程語言的映射 已經(jīng)發(fā)佈映射規(guī)範的語言包括:

C,C++,SmallTalk,Ada95等

IDL支持平臺獨立性

IDL是獨立於平臺的 由IDL指定的介面可以在不同的ORB

與平臺上一致地表達 只要程式員使用由IDL定義的介面 不會遇到由於使用CORBA導致的 平臺移植問題OMGIDL IDL是一個純規(guī)範,不涉及實現(xiàn)問題:

IDL定義的介面不對對象實現(xiàn)進行任何約束 例如: 編程語言 進程 演算法 等 將客戶從對象實現(xiàn)細節(jié)中清晰地分離出來 有利於: 軟體複用 軟體演化 這是IDL被廣泛接收的重要原因OMGIDL IDL設計的品質至為重要

IDL通常被用於定義應用系統(tǒng)中的重要介面 例如: 子系統(tǒng)介面 企業(yè)模型介面 庫介面 等 這些介面是複用、互操作的關鍵部分

IDL的變化將影響系統(tǒng)中的多個軟體模組

好的IDL將: 提高複用與互操作性 提高系統(tǒng)的適應性 降低維護費用

OMGIDL2、IDL規(guī)範

IDL是一個嚴格的定義用OMGIDL編寫的介面定義 完整地定義了介面並且 完全指定了每個操作的參數(shù)

OMGIDL介面提供的資訊 被用於開發(fā)使用介面操作的客戶客戶程式不用純描述性語言OMGIDL編寫而是用事先定義的映射 從OMGIDL概念映射到的語言編寫的OMGIDLOMGIDL詞法遵循C++的詞法規(guī)則OMGIDL語法是已被提議的ANSIC++標準的子集 但比C++更嚴格:函數(shù)返回類型是強制的對操作聲明的每個正式參數(shù)都必須提供名稱由單個符號void組成的參數(shù)列表 不允許作為空參數(shù)列表的同義字結構、discriminated聯(lián)合和枚舉要求被標記整數(shù)類型不能定義為簡單的int或unsigned

它們必須顯式聲明為short或longchar不能由signed或unsigned關鍵字限定OMGIDL(1)IDL模組(Modules)

為IDL定義創(chuàng)建分離的名空間 防止不同領域中標識之間的衝突 模組可以嵌套 以創(chuàng)建 具有一定長度的 限定範圍的 名字引用 名字引用例子:

Part::Assembly::ComponentWidget

OMGIDL3個模組例子:

moduleAssembly{ typedefstringWidget; };

modulePart{ typedef::Assembly::WidgetPartWidget; moduleComponentPart{ typedefPartWidgetComponentWidget; }; };CORBAServices對模組進行擴充使用 每個服務定義了一個或多個模組OMGIDL(2)IDL介面(Interface) IDL介面定義分佈對象顯露的細節(jié) 每個IDL介面定義了一個新對象類型 操作簽名 是介面的核心 是服務請求的入口點 介面 清晰地劃分了服務的實現(xiàn)與客戶之間的邊界 介面的不足之處:未顯示代碼之間的關係OMGIDL例子:

InterfaceAccount{ //Accountdefinitions } InterfaceCheking:Account{ //InheritsallAccountdefinitions //addsCheckingdefinitions }; InterfaceSaving:Account{ //InheritsallAccountdefinitions //addsSavingsdefinitions };IDL支持多繼承OMGIDL(3)IDLForward

用於聲明一個未定義的介面 例子:

interfaceEmployee;//forwarddeclaration structEmployeeContacts{ Employeesupervisor; Employeesecretary; Employeeunion_shop_leader; } interfaceEmployee{ attributeEmployeeContactscontacts; typedefstringJobTitle; //otherdefinitions }

OMGIDL(5)IDL類型聲明(4)IDL常量(Constants)

IDL中類型定義的目的在於 支持操作簽名的強類型檢查類型聲明包括:

IDL中特殊類型的重命名創(chuàng)建用戶定義的類型 例如: 枚舉 結構 數(shù)組 序列 聯(lián)合 等OMGIDL例子:typedefunsignedlongPhoneNumber;typedefstringGuestName,Address;enumChargeCard{MasterCard,Visa,AmericanExpress}; structGuestRecord{ GuestNamename; Addressaddress; PhoneNumbernumber; ChargeCardcard_kind; unsignedlongcard_number,expiration;};typedefsequence<GuestRecord>GuestList;OMGIDLtypedefstructEmployeestruct{ stringname; Addressaddress; unsignedlongsocial_security_number;}EmployeeRecord;typedefEmployeeRecordEmployee[100];enumPersonKind{A_GUEST,AN_EMPLOYEE,AN_OTHER};cunionPersonswitch(PersonKind){ caseA_GUEST: GuestRecordguest_record; caseAN_EMPLOYEE EmployeeRecordemployee_record; default:stringdescription;};OMGIDL(6)IDL序列(Sequence)序列是IDL特有的特殊數(shù)據(jù)類型 其本質上是變長數(shù)組下麵的例子通過IDL向C語言的映射 顯示了序列的實現(xiàn)方式IDL:typedefsequence<long>LongSeq;structAutomobile{ stringmake,model; unsignedshortyear;};typedefsequence<Automobile>AutomobileSeq;OMGIDLC:typedefstruct{ CORBA_unsigned_long_maximum; CORBA_unsigned_long_length; CORBA_long*_buffer;}LongSeq;typedefstruct{ CORBA_char*make,*model; CORBA_unsigned_shortyear;}Autumobile;typedefstruct{ unsignedlong_maximum; unsignedlong_length; Automobile*_buffer;}AutomobileSeq;OMGIDL(7)動態(tài)IDLTypeAnyIDL提供了強類型介面定義的能力 同時也存在弱類型數(shù)據(jù)值的能力方式:CORBAtypeany。例如:

typedefanyDynamicallyTypedValue;structRunTimeValue{ stringdescription; anyrun_time_value;};exceptionuserError{ stringexplanation; anyexception_value;};OMGIDL類型Any的值是自標識的 包含關於運行時類型的資訊IDL編譯器為用戶定義的類型產(chǎn)生typecode值CORBA介面池的介面包括 運行時產(chǎn)生新類型代碼的機制typeany在定義可複用介面方面有用 例如,typeany在CORBAServices中被大量使用 因為這些服務被期望在任意應用程式中複用OMGIDL(8)IDL屬性IDL定義顯露公共的屬性與操作如果屬性或者操作是私有的 則它不應出現(xiàn)在IDL定義中屬性可以是 只讀的(Read-only) 或者 可讀寫的(read-write)每個屬性都具有一個IDL數(shù)據(jù)類型 並出現(xiàn)在一個特定的IDL介面定義中OMGIDL(9)IDL例外(Exceptions)與其它計算模型相比,CORBA作出了一個重要的保證 發(fā)出調用的客戶總是可以接收到 一個成功的返回 或者一個例外這是對分佈計算複雜性的重要簡化 並可以明顯地降低客戶方的代碼量例外值的聲明類似於IDL結構類型例如:exceptionCardExpired{stringexpiration_date;};exceptionCreditLimitExceeded {unsignedlongcredit_limit;};exceptionCardReportedStolen{ stringreporting_instructions; unsignedlonghotline_phone_number;};OMGIDL例外被分為兩類: 用戶定義的與

CORBA定義的標準例外與標準例外相關的IDL:#defineex_body{ unsignedlongminor; completion_statuscompleted;};enumcompletion_status{ COMPLETED_YES, COMPLETED_NO, COMPLETED_MAYBE};enumexception_type{ NO_EXCEPTION, USER_EXCEPTION, SYSTEM_EXCEPTION};OMGIDL(10)IDL操作簽名操作簽名規(guī)範是IDL的基本目標當IDL向特定語言編譯時 每個簽名對應於一個目標對象 目標對象的類型是介面的聲明名字例如:

interfaceHospital{ typedefstringPatientId; PatientIdadmit_patient(); voidrelease_patient(inPatientIdpatient); };確省情況下,IDL操作是同步的當有oneway關鍵字時,IDL操作是非同步的OMGIDL一個完整的例子:

interfaceAirlineReservation{ typedefunsignedlongConfirmationNumber; enumSeatKind{Window,Aisle,Middle}; exceptionBadFrequentFlyerNumber{}; exceptionSeatNotAvailable{}; ConfirmationNumbermake_reservation{ instringpassenger_name, inunsignedlongfrequent_flyer_number, inoutSeatKindseat_kind, outstringseat_assignment} raises(BadFrequentflyerNumber, SeatNotAvailable) context(“TicketAgent”,“Agency”); };OMGIDLIDL很重要 是CORBA規(guī)範的關鍵 是分離客戶與實現(xiàn)的關鍵 是具體代碼實現(xiàn)的起點IDL從何而來?手工編寫OOD導出OMGIDL5、ORB介面ORB操作綜述對象引用操作ORB初始化獲取初始對象應用策略對象線程相關的操作ORB介面(1)ORB操作綜述由ORB核心實現(xiàn)

不依賴於所使用的對象適配器ORB介面對於所有的ORB和所有的對象實現(xiàn)而言 這些操作都是一樣的它們既可以由客戶端的對象執(zhí)行 也可以由實現(xiàn)方的對象執(zhí)行一些這樣的操作在ORB上出現(xiàn) 另一些在對象引用上出現(xiàn)儘管在描述方式上這些操作 看起來就象對象上的操作一樣但是,因為該部分所討論的操作都由ORB自身實現(xiàn) 所以實際上不是對象上的操作ORB介面因為 對象引用是不透明的 而且各ORB之間不一樣所以 對於對象引用的長期存儲或 對象引用的通信(除啟動之外)來說 對象引用不是一個很方便的值因而必須解決兩個問題: 允許對象引用轉換成 一個客戶可以存儲在其他介質上的值 並確保該值以後能夠轉換為正確的對象引用(2)對象引用與字串的轉換ORB介面ORB介面可以通過object_to_string操作 把一個對象引用轉化為一個字串該字串值就可以以任何字串所能被處理的方式 進行存儲或通信string_to_object操作 接受由object_to_string產(chǎn)生的字串 並返回相應的對象引用(3)對象引用操作有一些操作可以在所有對象上進行 它們並不是通常意義上的操作 因為這些操作直接由ORB實現(xiàn) 而並不傳遞到對象實現(xiàn)端 我們將以在對象引用上的操作的方式 來討論這些操作 儘管它們的介面實際上依賴於語言綁定ORB介面interfaceObject{//PIDL InterfaceDefget_interface(); booleanis_nil(); Objectduplicate(); voidrelease(); booleanis_a(instringlogical_type_id); booleannon_existent(); booleanis_equivalent(inObjectother_object); unsignedlonghash(inunsignedlongmaximum);這樣的操作包括:ORB介面voidcreate_request(inContextctx inIdentifieroperation, inNVListarg_list, inoutNamedValueresult, outRequestrequest, inFlagsreq_flag);Policyget_policy(inPolicyTypepolicy_type);DomainManagersListget_domain_managers();Objectset_policy_overrides(inPolicyListpolicies, inSetOverrideTypeset_add);};ORB介面InterfaceDefget_interface(); ImplementationDefget_implementation();確定對象實現(xiàn)和介面對象引用上的get_interface操作返回

InterfaceRepository裏的一個對象該對象提供可能對程式有用的類型資訊Object上的get_implementation操作 返回實現(xiàn)池裏的一個對象 該對象描述對象的實現(xiàn)ORB介面Objectduplicate(); voidrelease();複製和釋放對象引用的拷貝如果需要多於一個的對象引用 則客戶可以用duplicate操作創(chuàng)建一個副本注意:對象實現(xiàn)不能創(chuàng)建副本而且實現(xiàn)方也不能區(qū)別在一個特定的請求中 客戶使用的是原來的對象引用還是副本當程式不再需要一個對象引用時則可以用release操作收回它所佔用的存儲空間注意:對象實現(xiàn)不能進行這樣的操作對象自身和任何其他對它的引用 都不會受到release操作的影響ORB介面booleanis_a(instringlogical_type_id) 等價性檢查操作定義該操作的目的是在一個ORB範圍上 幫助維護對象引用的類型安全性如果該對象確實是該類型的一個實例 或者如果該類型是該對象的“最底層”的類型的祖先 則該操作返回truebooleanis_nil(); 測試一個對象引用是否為空一個值為OBJECT_NIL的對象引用表示沒有對象ORB介面booleannon_existent();用來檢測一個對象(如一個代理對象)是否已被破壞那些維護著包括對象引用的狀態(tài)的服務, 如橋、事件通道和基本關係服務等可以利用它們的“空閒時間” 使用該操作從對象表中篩選出那些不再存在的對象並以垃圾收集的形式刪除它們ORB介面unsignedlonghash(inunsignedlongmaximum); booleanis_equivalent(inObjectother_object);對象引用同一性為了有效地管理包含大量對象引用的狀態(tài) 部分服務需要支持一個對象引用同一性的概念 這樣的服務包括: 橋 關係服務 其他分層的服務等CORBA提供了兩個有關同一性的操作 一個操作是把對象引用映射到不相鄰的組裏 這樣的組裏的對象引用具有潛在的等價性; 另一個操作是支持開銷更大的成對地定價性檢查這些操作一起支持對以對象引用為關鍵字的表的 高效地維護和檢索ORB介面Policyget_policy(inPolicyTypepolicy_type);獲取與對象相關的策略Objectset_policy_overrides(inPolicyListpolicies, inSetOverrideTypeset_add);設置策略DomainManagersListget_domain_managers();獲取域管理者ORB介面(4)ORB初始化當應用程式要求CORBA環(huán)境時 它需要一種獲得ORB和OA偽對象引用的機制這樣的機制有兩個作用: 把應用程式初始化到ORB和OA環(huán)境 向應用程式返回ORB和OA偽對象引用 以便將來使用ORB和OA操作ORB介面在ORB中初始化應用程式 並獲得ORB的偽對象引用的操作 不是在一個對象上進行的因為應用程式開始時並沒有一個能啟動操作的對象ORB初始化操作是應用程式進入CORBA世界的引導程式應用程式可以初始化到一個或多個ORB中去當完成一個ORB初始化之後, 返回該ORB的偽對象引用 然後可以用該偽對象引用 獲得該ORB的其他對象引用(例如OA)ORB介面(5)獲取初始對象引用應用程式要求一種方便的辦法 通過它可以獲得它們的初始對象引用初始引用並不通過一個新的介面獲得,而是增加兩個新的操作到ORB偽對象介面中去這兩個操作提供了列出和解析初始對象引用的便利Objectresolve_initial_references(inObjectIdidentifier) raise(InvalidName)ObjectIdListlist_initial_services();ORB介面(6)策略域的管理一個ORB或者CORBA服務可以選擇對某些選項進行訪問 它們對其操作具有影響該資訊是以結構化的方式 通過從Policy介面繼承的介面訪問到的

一個CORBA服務可以不用這種方法訪問上述操作 策略域提供了較直接的方式特別需要指出的是,安全服務使用這種技術 將安全策略與系統(tǒng)中的對象進行關聯(lián)ORB介面相關概念:策略域一個策略域是一個對象集合 與該域相關的策略可以應用於這些對象這些對象是領域成員策略代表了:對於該領域內對象活動進行約束的原則與規(guī)則在生成對象引用時

ORB隱式地將對象引用與一個或多個策略域關聯(lián)通過在一個領域的粒度 而不是單個對象實例的粒度上應用策略 策略域提供策略管理在規(guī)模問題上的平衡ORB介面策略域管理器每一個策略域所包含的唯一的一個對象 它與領域中的策略對象相關域管理器還記錄域的成員 並提供 增加 刪除成員的方法域管理器本身是一個域的成員 可能是它所管理域的成員ORB介面120

內容概述

IR的範圍實現(xiàn)相關性概念與原理IR介面介面池121(1)概述ORB提供對對象集合的分佈式訪問 方法是使用OMGIDL中指定的對象公共定義介面介面池為相關對象的介面定義集合 提供存儲、分佈和管理ORB可以使用兩種形式的對象定義: 通過將資訊從過程上合併到stub程式中 例如,作為將C語言副程式映射到通訊協(xié)議中的代碼 通過動態(tài)可訪問的介面池訪問到 例如,作為通過特定於OMGIDL介面訪問的“介面對象”介面池122ORB可以使用在介面池中維護的對象定義 解釋和處理請求中提供的值:提供請求簽名的類型檢查(請求是否通過DII或stub發(fā)出的)幫助檢查介面繼承關係的正確性幫助提供不同ORB實現(xiàn)之間的互操作性由於介面池中所維護對象定義的介面是公共的 因此客戶和服務也可以使用Repository中維護的資訊例如,Repository可用於:管理介面定義的安裝和分佈提供CASE環(huán)境的構件(例如,介面流覽器)提供語言綁定的介面資訊(例如編譯器)提供最終用戶環(huán)境的構件(例如,菜單欄構造器)介面池123(2)IR的範圍

介面對象作為一組對象在介面池中維護 可以通過一組特定於OMGIDL介面定義訪問它們介面定義包含它支持的操作描述,包括參數(shù)類型、例外和它可以使用的環(huán)境資訊此外,介面池還存儲常量值它可以用在其他介面定義中或者僅僅為方便程式員而定義介面池還存儲typecode,這是以結構化術語描述類型的值介面池124

介面池使用模組作為組織介面的方式 並且根據(jù)名稱查找這些組織模組可以包含常量、類型定義、例外情況、介面定義和其他模組例如,模組可以對應於OMGIDL定義的組織它們也可以用於代表為管理和其他用途定義的組織介面池是代表其中資訊的一組對象 它們是在該透明對象結構上運作的操作具體實現(xiàn)可以選擇這些對象是否永久存在 或者在repository上的操作引用時創(chuàng)建也可以有有效提取資訊的操作 獲得描述整個介面或整個操作的資訊塊介面池125ORB可以訪問多個介面池原因:

兩個ORB對接口池的實現(xiàn)有不同的要求 對象實現(xiàn)(例如OODB)希望提供它自己的類型資訊 或者它希望將不同的附加資訊 存儲在不同的repository中使用typecode和repository識別字的目的是 允許不同的repository保持它們自己的資訊一致介面池126介面池127介面池資訊的一個關鍵用途是 將ORB連接在一起當對象在請求中從一個ORB傳到另一個ORB時 可能有必要創(chuàng)建新對象代表接收ORB中的傳送對象這可能需要在接收ORB的介面池中找到介面資訊通過從發(fā)送ORB的repository中獲取repository識別字 可以在接收ORB的repository中查找介面為成功操作,該對象的介面必須同時安裝在兩個repository中並且有相同的repository識別字介面池128(3)實現(xiàn)相關性

介面池中的實現(xiàn)需要某些形式的永久對象存儲通常永久對象存儲類型用於 決定介面定義如何分佈和/或在網(wǎng)路域中複製如果使用檔系統(tǒng)提供對象存儲 那麼在單個機器上可能只有一組介面的唯一副本如果使用OODB提供對象存儲 那麼可以維護介面定義的多個副本 每個副本都分佈在幾臺機器上 以提供高可用性和負載平衡介面池129介面池包含 允許程式在運行時確定和處理類型資訊的資訊程式可以嘗試在任何時候通過對象引用上的

get_interface訪問介面池一旦資訊已經(jīng)安裝在repositor

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論