【正文】
據(jù)第二章的論述,我們必須要知道每個(gè)用戶當(dāng)前的光標(biāo)位置,以便確定其將要操作的字符位置。因此,本文在原型實(shí)現(xiàn)中就沒(méi)有實(shí)現(xiàn)單元格內(nèi)部字符級(jí)別的數(shù)據(jù)一致性。而第三層中則是每個(gè)行對(duì)象中的單元格序列。由前兩章所述,我們希望采用操作轉(zhuǎn)換技術(shù)進(jìn)行一致性的控制,那么我們首先需要解決的以下問(wèn)題:? 如何截獲用戶對(duì)應(yīng)用程序的操作,并用面向?qū)ο蟮男问綄⑵浞庋b起來(lái);? 如何將攜攜帶數(shù)據(jù)的對(duì)象廣播到每個(gè)參與協(xié)同的客戶端;? 如何利用操作轉(zhuǎn)換技術(shù)對(duì)這些對(duì)象進(jìn)行一致性控制;? 如何將接受到的對(duì)象還原成用戶操作,并在本地程序中重現(xiàn)出來(lái)。但是截獲到的這些事件并不適合于直接廣播到各個(gè)協(xié)同客戶端。另外,由于采用操作轉(zhuǎn)換技術(shù)來(lái)保證數(shù)據(jù)一致性,這些底層的,離散的操作必須要被解析成能被操作轉(zhuǎn)換技術(shù)識(shí)別的上層操作,而這也決定了我們將所有用戶操作進(jìn)行廣播是不切實(shí)際的。例如在 Excel 中,用戶為一個(gè)工作簿添加一個(gè)工作表,修改一個(gè)單元格中的文字,插入一個(gè)圖形等就是有效操作;而諸如改變表格的寬度高度,更改工具欄顯示狀態(tài)等操作極為非有效操作。那么接下來(lái)我們要首先解決的就是如何利用有效操作和操作轉(zhuǎn)換技術(shù)實(shí)現(xiàn)數(shù)據(jù)的一致性控制。這也就意味著這種應(yīng)用程序級(jí)別的一?致性控制方法的復(fù)雜程度是令人無(wú)法接受的。元操作只有三種:Insert,Delete 和 Update。這種定義和實(shí)現(xiàn)方式就為我們將數(shù)據(jù)一致性操作和特定應(yīng)用程序進(jìn)行解耦提供了可能?;谕该鬟m配方法的互聯(lián)網(wǎng)協(xié)同軟件第 23 頁(yè) 共 65 頁(yè)┊┊┊┊┊┊┊┊┊┊┊┊┊裝┊┊┊┊┊訂┊┊┊┊┊線┊┊┊┊┊┊┊┊┊┊┊┊┊ 截獲用戶對(duì)特定應(yīng)用程序的輸入 概述由上文所述,我們通過(guò)定義有效操作來(lái)封裝和過(guò)濾用戶與應(yīng)用程序的交互事件,那么如何截獲用戶對(duì)應(yīng)用程序的輸入就成了我們首先要解決的問(wèn)題。 應(yīng)用程序級(jí)截獲Excel 所提供的可相應(yīng)的事件大致可以分為以下 3 組:? Application 事件;? Workbook 事件;? Worksheet 事件。WorkbookEvents::SheetChange 事件:當(dāng)一個(gè)工作表中的某個(gè)單元格內(nèi)容被更改時(shí),該事件被觸發(fā)。該事件本身并不對(duì)文檔數(shù)據(jù)進(jìn)行變化,即并不會(huì)由該事件生成一個(gè)有效操作,但該事件為我們標(biāo)明了當(dāng)前被選中單元格這一重要信息,對(duì)于我們更改單元格屬性等操作有。WorkbookEvents::SheetSelectionChange 事件:當(dāng)工作表中被選中單元格發(fā)生改變是,該事件被觸發(fā)。從事件內(nèi)容上看,我們所感興趣的主要是Workbook 事件和 Worksheet 事件,它們提供了對(duì)工作表操作的直接響應(yīng),即直接針對(duì)數(shù)據(jù)的變化。本文選用 Microsoft Excel 作為研究載體,經(jīng)過(guò)對(duì) Excel 文檔對(duì)象模型的研究,我們發(fā)現(xiàn),Exce 對(duì)于截獲用戶輸入提供了一系列的事件供開(kāi)發(fā)者響應(yīng),但距離截獲所有用戶輸入還有一段距離。至此,我們對(duì)用戶的操作進(jìn)行了封裝和過(guò)濾,并進(jìn)一步對(duì)其進(jìn)行抽象以實(shí)現(xiàn)模塊間的松耦合,接下來(lái)我們要解決的問(wèn)題有以下幾個(gè):? 為特定應(yīng)用程序定義有效操作;? 將上述有效操作轉(zhuǎn)化為元操作;? 對(duì)元操作進(jìn)行操作轉(zhuǎn)換;? 將經(jīng)過(guò)一致性控制的操作在用戶處重現(xiàn)。eonl需要說(shuō)明的是,在操作轉(zhuǎn)換技術(shù)中,數(shù)據(jù)一致性控制并不依賴于某種特定的對(duì)象類型,因而上述三種元操作是通用的和一般的,即他們與所操作對(duì)象的類別無(wú)關(guān)。為了解決這一問(wèn)題,我們需要對(duì)有效操作進(jìn)行合理的抽象和提升。有效操作作為帶有強(qiáng)烈語(yǔ)義信息的對(duì)象,其數(shù)量是相當(dāng)巨大的。有效操作的引入為我們?cè)谟脩艚换ズ鸵恢滦钥刂浦g架起了一座橋梁。這里,我們引入一個(gè)概念: 有效操作 。與此同時(shí),我們并沒(méi)有必要將某個(gè)客戶端的所有用戶交互事件都廣播到每個(gè)站點(diǎn)。 有效操作在當(dāng)代主流應(yīng)用程序中,用戶對(duì)于應(yīng)用程序的交互主要集中在輸入設(shè)備上,即鼠標(biāo),鍵盤等外設(shè)。結(jié)合圖 和第二章所論述的尋址方式,我們發(fā)現(xiàn):? 要訪問(wèn)一個(gè)工作表(Worksheet)對(duì)象,只需要提供一個(gè)含有域名稱和索引的地址對(duì),即形如(“Worksheet” ,1)形式的地址對(duì)即可;? 要訪問(wèn)一個(gè)圖形(Shape)對(duì)象,需要提供兩個(gè)地址對(duì),分別為(“Worksheet” ,1)和(“Shapes” ,1) ,前者表明圖形對(duì)象所在的工作表,后者表明它在 Shapes 序列中的索引;? 要訪問(wèn)一個(gè)單元格(Cell)對(duì)象,則需要提供三個(gè)地址對(duì),分別為(“Worksheet” ,1) , (“Row” ,1)和(“Column” ,1) ,分別表示單元格所在的工作表,行號(hào)和列號(hào)。與此類似的,一個(gè)圖形對(duì)象以及圖表對(duì)象等,在本文中均認(rèn)為是用戶的最小操作單元。假若我們一定要實(shí)現(xiàn)單元格內(nèi)部字符級(jí)別的數(shù)據(jù)一致性,則需要做如下的工作:1. 單元格編輯狀態(tài)下監(jiān)視用戶對(duì)左右方向鍵的使用,因?yàn)榉较蜴I會(huì)改變光標(biāo)位置;2. 在每個(gè)客戶端維護(hù)一張表,這張表記錄了所有編輯這一單元格用戶的光標(biāo)位置;3. 任一用戶每一次光標(biāo)的改變均要對(duì)所有用戶廣播;4. 任一用戶進(jìn)入編輯狀態(tài)(如雙擊鼠標(biāo),按下 F2 鍵)和離開(kāi)編輯狀態(tài)(如選中其他單元格) 均要廣播;5. 一旦用戶在編輯狀態(tài)按下 Esc 鍵,則要撤銷所有的操作,并清空所有用戶處關(guān)于該用戶此次編輯信息和光標(biāo)位置的緩存。在 Excel 應(yīng)用程序中,單元格的狀態(tài)有兩種:常規(guī)狀態(tài)和編輯狀態(tài)。我們以最簡(jiǎn)單的單元格對(duì)象為例。這就決定了我們?cè)趯?duì)圖形序列進(jìn)行一致性控制實(shí)際上就是對(duì)圖形疊放次序進(jìn)行一致性控制,這樣的話,當(dāng)用戶手動(dòng)更改圖形疊放次序時(shí)(如點(diǎn)擊右鍵菜單中的“疊放次序”一欄)就相當(dāng)于更改圖形對(duì)象的索引,就會(huì)同樣會(huì)出現(xiàn)一致性控制的問(wèn)題,而這也為圖形對(duì)象的一致性控制增加了復(fù)雜性。在本文范圍中,我們認(rèn)為,這些繪圖去的對(duì)象分屬于不同的對(duì)象序列,如圖形對(duì)象的集合為 Shapes,圖表對(duì)象的集合為 Notes 等等,這種理解方式既能屏蔽底層實(shí)現(xiàn)細(xì)節(jié),又不影響對(duì)于 Excel 文檔結(jié)構(gòu)的準(zhǔn)確把握。Microsoft Excel 2022 至 2022版本中,表格區(qū)有 65536 行,256 列;而在 Microsoft Excel 2022 中,這一數(shù)據(jù)則被擴(kuò)展為1048576 行和 256 列。綜上所述,在一個(gè) Excel 文檔中,工作表對(duì)象序列呈一個(gè)一維線性結(jié)構(gòu),而這正好滿足了操作轉(zhuǎn)換技術(shù)的要求,可以使用操作轉(zhuǎn)換技術(shù)來(lái)保證數(shù)據(jù)的一致性。值得一提的是,在這里我們不采用按照名字索引對(duì)象的方式。經(jīng)過(guò)對(duì) Excel 組件對(duì)象模型中 Workbook 對(duì)象中的 Worksheets 屬性進(jìn)行考察,我們發(fā)現(xiàn),有兩種方式可以引用一個(gè)工作表對(duì)象。仿照第二章圖 的形式,我們將 Excel文檔中各種對(duì)象之間的關(guān)系表示為如下示意圖:W o r k b o o k :W o r k s h e e t s :0S h e e t 11S h e e t 22S h e e t 30S h a p e 11S h a p e 22. . .nS h a p e N0C h a r t 11C h a r t 22. . .nC h a r t NS h a p e s :C h a r t s :0R o w 11R o w 22. . .nR o w NR a n g e :0C e l l 11C e l l 22. . .nC e l l NC e l l s :圖 Excel 文檔中對(duì)象關(guān)系示意圖由上圖我們可以看到,左側(cè)表示的是從用戶角度看到的 Excel 文檔,而右側(cè)表示的則是從應(yīng)用程序接口所描述的 Excel 文檔結(jié)構(gòu),兩者之間的關(guān)系可以由圖中的虛線表示。當(dāng)然,Worksheet 對(duì)象中還含有其他的復(fù)雜對(duì)象,例如表示標(biāo)注的Comm 對(duì)象等等,限于本文篇幅,不一一贅述。每一個(gè) Worksheet 對(duì)象中仍具有比較復(fù)雜的結(jié)構(gòu)。在一個(gè) Workbook 對(duì)象中,同樣有一組Worksheet 對(duì)象,組成一個(gè)被稱為 Worksheets 的集合。我們可以通過(guò) GetWorkbook 方法來(lái)取到某一個(gè)工作簿的引用,也可以利用這個(gè)集合來(lái)創(chuàng)建、打開(kāi)、關(guān)閉一個(gè)工作簿。 從編程接口角度看 Excel 工作表Microsoft Excel 組件對(duì)象模型(COM)提供了一系列復(fù)雜多樣的編程接口(API)和對(duì)象,利用這些接口和對(duì)象,我們可以用 COM 自動(dòng)化(Automation)的方式來(lái)控制 Microsoft Excel應(yīng)用程序,并操縱 Excel 文檔數(shù)據(jù)。根據(jù)第二章的論述,操作轉(zhuǎn)換技術(shù)必須最終作用在一個(gè)線性地址空間上,而這種復(fù)雜的數(shù)據(jù)結(jié)構(gòu)似乎與操作轉(zhuǎn)換技術(shù)的要求并不匹配。從用戶的角度看,一個(gè)Excel 工作簿(Workbook)內(nèi)含有多個(gè)工作表(Worksheet) ,每一個(gè)工作表內(nèi)又具有復(fù)雜多樣的數(shù)據(jù)對(duì)象。綜上,通過(guò)圖 中所示的兩個(gè)函數(shù),我們能利用兩操作的地址對(duì),清晰地確定出兩操作目標(biāo)域間的關(guān)系,以確定是否需要對(duì)后發(fā)操作實(shí)行操作轉(zhuǎn)換。在函數(shù) IsDomainDependent 中,若操做 的域路徑長(zhǎng)度小于操作 ,說(shuō)明操作 的目標(biāo)域nxn位于操作 的的上級(jí)節(jié)點(diǎn)中,那么返回 true;反之,則遍歷操作 的整個(gè)目標(biāo)路徑,若有任何x一個(gè)節(jié)點(diǎn)與操做 的不重合,也返回 true。nnx 根據(jù)地址對(duì)判斷操作間的關(guān)系在 節(jié)中,本文提到在樹(shù)狀線性結(jié)構(gòu)中,用一組形如 的地址對(duì)來(lái)描述對(duì)象的地(,)np址,并將這一組地址對(duì)存放在一個(gè) vector 中。3. 若 =3,即操作 3 先于操作 發(fā)生,由于操作 3 與操作 既不具有同一個(gè)目標(biāo)域,也n基于透明適配方法的互聯(lián)網(wǎng)協(xié)同軟件第 12 頁(yè) 共 65 頁(yè)┊┊┊┊┊┊┊┊┊┊┊┊┊裝┊┊┊┊┊訂┊┊┊┊┊線┊┊┊┊┊┊┊┊┊┊┊┊┊不在操作 的父域中,操作 3 不可能影響到操作 所在域的地址,因此不需要對(duì)操作 做轉(zhuǎn)換。為了方便,我們總假設(shè)操作 先于操作 發(fā)生。當(dāng)兩個(gè)操作并發(fā)進(jìn)行時(shí),某些情況下需要對(duì)其中的操作做轉(zhuǎn)換,而某些情況下卻不用。在擴(kuò)展后的操作轉(zhuǎn)換技術(shù)中,確定兩個(gè)操作目標(biāo)域之間的關(guān)系對(duì)于正確進(jìn)行操作轉(zhuǎn)換具有重大的意義。依照這樣的方式,自根節(jié)點(diǎn)開(kāi)始尋址,[](,)ivik?遍歷整個(gè) vector,總能找到目標(biāo)對(duì)象。更進(jìn)一步說(shuō),兩個(gè)對(duì)象被認(rèn)為是臨近的,并不一定意味著這兩個(gè)對(duì)象實(shí)際的位置關(guān)系臨近或是在內(nèi)存中的位置臨近,而是僅僅說(shuō)明對(duì)于操作而言,這兩者的地址是接近的。這樣類似于 XML 文件的結(jié)構(gòu)讓我們能方便有效地找到整個(gè)數(shù)據(jù)模型中的任何一個(gè)對(duì)象。經(jīng)擴(kuò)展后的操作轉(zhuǎn)換技術(shù),原本的一維線性地址空間被擴(kuò)展成了一組具有相互關(guān)聯(lián)的線性地址空間。數(shù)據(jù)模型定義了協(xié)同系統(tǒng)中共享數(shù)據(jù)的尋址方式,即數(shù)據(jù)是如何被排列和組織起來(lái)的;操作模型則定義了一系列基本的操作,這些操作是一切復(fù)雜操作的基礎(chǔ),因此也被稱為元操作。在此我們假設(shè)用戶 1 的操作先于用戶 2 的操作,那么當(dāng)用戶 2 的操作被傳送到用戶 1 處的時(shí)候,倘若我們?nèi)院?jiǎn)單地認(rèn)為用戶 2 在“2”這個(gè)位置刪除了字符“c” ,那么由于文件內(nèi)容已經(jīng)變?yōu)椤皒abc” ,我們就會(huì)錯(cuò)誤地把字符“b”刪除,這就造成了數(shù)據(jù)的不一致性。操作轉(zhuǎn)換技術(shù)可以用以下例子來(lái)解釋:在一個(gè)復(fù)制結(jié)構(gòu)的協(xié)同應(yīng)用程序中,兩個(gè)用戶(用戶 1 和用戶 2)同時(shí)操作一份文本文件,該文本文件中只有“abc”這樣一個(gè)字符串。基于透明適配方法的互聯(lián)網(wǎng)協(xié)同軟件第 9 頁(yè) 共 65 頁(yè)┊┊┊┊┊┊┊┊┊┊┊┊┊裝┊┊┊┊┊訂┊┊┊┊┊線┊┊┊┊┊┊┊┊┊┊┊┊┊2 數(shù)據(jù)層面的適配技術(shù) 基本的操作轉(zhuǎn)換技術(shù)在任何一種多用戶協(xié)同系統(tǒng)的實(shí)現(xiàn)中,數(shù)據(jù)一致性控制都是一項(xiàng)核心的技術(shù)。對(duì)于軟件的消費(fèi)方,這意味著他們不僅能夠進(jìn)行合作,而且可以使用他們所熟悉的應(yīng)用軟件。尤其是在基于信息共享的復(fù)雜 CSCW 應(yīng)用領(lǐng)域,相關(guān)理論、模型和關(guān)鍵技術(shù)等還幾乎是一片空白。 研究?jī)r(jià)值與應(yīng)用價(jià)值CSCW 的研究具有重大現(xiàn)實(shí)意義:通過(guò)建立計(jì)算機(jī)支持的協(xié)同工作環(huán)境,改善人們進(jìn)行信息交流和共享的方式,消除或減少人們?cè)跁r(shí)間和空間上的分隔和障礙,提高群體工作質(zhì)量和效率,從而提高企業(yè)、機(jī)關(guān)、團(tuán)體乃至整個(gè)社會(huì)的整體效益和人們的生活質(zhì)量。但這一方法仍面臨一些問(wèn)題和局限,需要進(jìn)一步檢驗(yàn)和完善。因此,這一方法既不是在操作系統(tǒng)級(jí)別上對(duì)所有應(yīng)用程序進(jìn)行協(xié)同(例如 NetMeeting) ,也不是專門針對(duì)一個(gè)接口庫(kù)進(jìn)行的組件替換(例如 JAMM) ,它是在單用戶應(yīng)用程序與協(xié)同控制之間加入了一個(gè)恰當(dāng)?shù)倪m配層,使單用戶應(yīng)用程序能透明地轉(zhuǎn)化為多用戶協(xié)同應(yīng)用程序。但是遺憾的是,能滿足松散式 JAMM 要求的單用戶應(yīng)用程序數(shù)目不多而且不夠流行。有研究者提出了一種新的復(fù)制式體系結(jié)構(gòu):松散式 JAMM(Java Applets Made Multiuser) 。該結(jié)構(gòu)有助于實(shí)現(xiàn)好的響應(yīng)性、不嚴(yán)格的 WYSIWIS 和有效的網(wǎng)絡(luò)使用,并且支持并發(fā)協(xié)作。該架構(gòu)的優(yōu)點(diǎn)在于系統(tǒng)結(jié)構(gòu)簡(jiǎn)單,并發(fā)控制的實(shí)現(xiàn)較為容易。 已有成果使用現(xiàn)有的單用戶軟件來(lái)實(shí)現(xiàn)多用戶實(shí)時(shí)協(xié)同的想法在很早之前就被