縱橫碼教學輔助軟體新版本的設計與實現
蘇州大學縱橫漢字信息技術研究所
楊季文 、邵榮、李培峰
一、設計思想
縱橫碼是一種規範、易學、快速、優秀的漢字輸入編碼方法,經過了幾年的推廣,縱橫漢字輸入法得到社會的承認和使用者的認可。越來越多的使用者已經喜歡上了縱橫碼。在縱橫漢字輸入法的推廣過程中,縱橫碼教學輔助軟體,發揮了重要的作用。本文介紹了怎樣用面向對象的程式設計方法及事件驅動的概念來實現新版本的軟體系統。
1.以DOS為基礎
雖然當今電腦科技日新月異,PC平台上主流作業系統從DOS轉移到了WINDOWS,相應的應用程式也逐步轉移到了WINDOWS上。但是,目前的很多地區,尤其是許多的中小學中,電腦的檔次仍停留於286、386,其主流作業系統平台仍是DOS平台,而縱橫漢字輸入法推廣與普及的重要對象是廣大中小學生,因此,DOS平台上的縱橫碼教學輔助軟體的開發仍十分必要。
2.採用面向對象的程式設計方法
不採用傳統的編程方法,而採用面向對象的程度設計方法,是因為傳統的編程方法在進行較大系統的設計時,存在著種種的缺陷,安全性與易維護性得不到保證。例如,用傳統結構化方法所組織的軟體耦合性很強,當程度代碼膨脹到一定程度時,局部改動將引起“牽一髮而動全身”的全局修改,維護、修改使程式員視之為畏途。
追求安全、高效率、易維護性是我們開發新版本縱橫碼教學輔助軟體的一個主要目的,而使用面向對象的程式設計方法可以在很大程度上改善傳統程式設計方法的種種不足,因此我們使用了這種設計方法。
3.新舊版本結構的不同
舊版本縱橫碼教學輔助軟體許多模塊的架構是相似的,所不同的只是它們所含的內容不同而已。許多的函數的資訊交換是透過全局變量來實現的,程式顯得很凌亂。另外,原來版本的軟體在許多的函數中自己控制鍵盤的讀入,程式走向由函數自己進行控制,程式結構十分繁雜,而在許多的函數等待讀鍵過程中,CPU資源就白白浪費掉了。
新版本的縱橫碼教學輔助軟體設計過程中引入“繼承”的概念來避免相似模塊的重複編寫,引入“事件驅動”的概念簡化程式結構,提高CPU的利用效率。在程式中,一個核心的中心控制機制用於監控所有的事件,並派送到每一個事件處理程式中,而不是讓程式的某一子模塊,來等待事件的發生並發送到其他模塊。事件驅動的實質是由事件來觸發相應的一組操作。
4.特點
新版本軟體的主要特點如下:
● 設置配置檔案,可以根據環境的變動而重新設置
● 訓練,測試內容可變換
● 教學,訓練速度可調
● 全程支援滑鼠
● 全程圖示化介面
● 對話方塊,文字方塊使用WINDOWS風格介面
● 在線幫助功能,針對操作,縱橫碼輸入進行提示
● 測試輸入速度後,可以生成成績結果檔案
● 支援在無碟工作站上使用
● 640*480分辨率下16色顯示以適應256K顯示存儲器的機器
● 由事件驅動程式的各種操作
● 內嵌漢字系統,無須外掛中文環境
● 記憶體的自動三級管理,按常規記憶體,XMS,硬碟三級優先遞減進行利用
● 使用多種技術實現圖文的高速顯示
二、模塊與結構組織
1.功能模塊
新版本功能上劃分為三大主模塊:演示、訓練和測試。
演示模塊中又分四個子模塊:
字身取碼規則
字身補碼規則
補充說明規則
詞組取碼規則
訓練模塊中分十個子模塊:
筆形代碼訓練
主部首代碼訓練
副部首代碼訓練
字身取碼識別
字身取碼輸入
字身補碼識別
字身補碼輸入
常用字輸入訓練
隨機字輸入訓練
詞組輸入訓練
測試模塊中分四個子模塊:
測試方式1
測試方式2
測試方式3
測試方式4
2.類的層次關係
新版本系統是由類為單位逐層進行組織實現的,這裡給出三個最基本類層次:
最底層由三個基本類組成:
滑鼠類:負責滑鼠的狀態的獲取,滑鼠指針的移動、隱藏、開啟;記憶體管理類:負責記憶體的申請、分配、釋放、資料的存放,它使用記憶體的三級管理模式;基本顯示類:高速的寫點、畫線、畫框等基本顯示作業。
中間層的幾個類是:
事件類:處理程式中的三類事件——滑鼠事件,鍵盤事件,程式本身產生的事件(即消息),它維持一個消息隊列,存放多個事件;漢字類:負責漢字、ASCII字元的顯示;CKC類:負責將機內碼與縱橫碼相互轉換;視窗類:實現文字方塊、對話方塊、編輯方塊的顯示;圖形類:負責圖片的顯示、擦除。
高層的幾個類是:演示類,訓練類,測試類。
此外 ,還有一些輔助類。
三、系統實現
下面使用兩個例子進行說明面向對象的程式設計方法,事件驅動及記憶體自動管理在縱橫碼教學輔助軟體中的體現。
1.滑鼠事件
程式中的事件分為三類:滑鼠事件,鍵盤事件,以及由程式本身生成的事件即消息。下面舉例說明滑鼠事件的處理。
假設在演示縱橫碼的編碼原理時,滑鼠按下了介面上的幫助按鈕。這時,主模塊的事件接收機構接到了滑鼠單按事件,它把滑鼠事件放入消息隊列,然後一個專門的消息派送函數將把消息傳入內部。
由於當前演示模塊處於激活狀態,它將接收並消化掉這個消息。演示模塊接到這個消息後,它又將這個消息分別傳給有處理能力的子模塊。此時,幫助按鈕的消息處理模塊接收到消息後判斷是自己處理範圍的消息,它將取得消息,返回一個申請幫助視窗的消息,其中包含了縱橫碼當前演示的進度狀態標識。
申請信號將返回到主事件循環,此時,主事件循環上的幫助模塊判斷消息隊列頂層有幫助申請消息時,將處理這個消息。它根據消息中的狀態標識查幫助的索引表,找到對應的幫助內容,實例化一個閱讀視窗對象,並彈出這個視窗,顯示出縱橫碼的對應章節的幫助內容。
現在不妨再深入一步,看看視窗對象內部的工作方式。閱讀視窗含有一個滾動條,滾動條上有一個定位鈕,一個上滾按鈕,一個下滾按鈕。滑鼠點選上滾按鈕時,視窗中幫助內容會上滾一行。
當滑鼠點選上滾按鈕時,滑鼠事件將被層層傳入到視窗對象中,視窗對象將消息傳給內部的滾動條,滾動條判斷是否在自己的處理範圍內,如果發現是在上滾按鈕上,將改變視窗對象中的顯示行的範圍(改變對象中的行狀態變量),同時給出一個刷新請求,返回到外層時,視窗對象接到請求,刷新視窗內的內容。
在此需要強調的是,視窗對象處理的消息內傳、判斷、改變行列號和刷新視窗等的操作及相關資料均是被封裝在對象內部,對外部而言是透明的。這樣,即使有幾個視窗同時彈出也互不干擾。採用這種方式,實現了資料及功能的抽象。這對簡化程式結構有很大的幫助作用,又因為代碼共用,降低了代碼的冗餘。
可以看到,事件驅動給縱橫碼教學輔助的維護也帶來了便利。如果要加入新的事件處理功能,只要在主循環上掛入處理事件的模塊就行了。
2.存儲管理
縱橫碼教學輔助軟體涉及大量記憶體、緩衝作業,例如字元字模庫、測試的臨時試卷、需要儲存的螢幕、圖示等等。有效的記憶體管理是縱橫碼教學輔助軟體安全高效的關鍵。在新版本中,充分考慮了速度與空間的協調。
一般情況下,常規記憶體、XMS、硬碟的空間依次遞增,而速度卻逐級遞減。從速度與環境的適應性上考慮,我們採用了這三級空間優先級遞減的方法進行管理。也就是說,當需要申請一塊記憶體空間時,記憶體管理機構將判斷是否有足夠的常規記憶體空間供分配;沒有,將轉向下一級XMS,再判斷是否有足夠的XMS空間供分配;還沒有,轉向硬碟,利用虛擬記憶體(硬碟上生成一個臨時檔案)進行分配。
仍以演示模塊來舉例說明。假設演示時,滑鼠事件觸發了幫助消息後,彈出視窗前,必須進行視窗區域的螢幕儲存。此時,視窗對象的構造函數將申請一塊記憶體進行畫面的儲存。記憶體的申請、交換、資料傳遞和釋放等一系列操作都封裝在一個記憶體管理類中,當申請一塊記憶體時,由記憶體管理類生成一個記憶體對象,它負責生成記憶體,並進行這塊記憶體的操作,它對外的接口是一個記憶體句柄及一個記憶體指針。它在記憶體申請中將自動判定當前的記憶體模式下記憶體是否夠用,是否要降級申請。常規記憶體方式時,返回兩個遠指針,頭指針及當前地址指針;XMS方式時,返回一個記憶體柄及一個記憶體指針;硬碟虛擬記憶體方式時,返回一個檔案柄及一個檔案指針。不管在哪種記憶體方式下,記憶體的兩個指針或句柄都封存於對象中。
視窗對象申請記憶體後,儲存資料。在退出視窗前,從記憶體取資料恢復螢幕區域,這一系列的記憶體操作均由記憶體對象內部處理,不需外部進行干預。
很關鍵的一點是怎樣實現統一的記憶體接口,使外部的使用者感覺不到是使用的常規記憶體還是硬碟上的虛擬記憶體。我們使用了一個結構,其中包含了所使用的存儲區域類型以及一個作為記憶體句柄的聯合,聯合中有三個指針,常規記憶體的指針類指針,XMS的指針類指針,檔案名串的指針。對記憶體塊的操作就使用這個結構指針。並且,實現了一組接口函數進行存儲區域的自動轉換。
就這樣,縱橫碼教學輔助軟體中的記憶體的緩衝作業與具體功能代碼內部的應用操作實現了分離。從記憶體管理的方面使系統達到了安全高效的目標,並且易維護。
四、結束語
新版本軟體中所實現的新思路是一種大膽的嘗試,其中一定有很多不成熟的地方,但希望本軟體的實現能推動縱橫碼其他外圍軟體的設計,對縱橫碼的推廣起到積極的作用!
新版本軟體中所使用了事件驅動概念與面向對象的程式設計方法,它們不僅僅適合縱橫碼教學輔助軟體,在其他的應用軟體的設計中,也有極高的應用價值,有利於系統的高效、安全、易維護性的實現。
返回上頁 |