當前位置:縱橫輸入法首頁>>教學經驗交流>>第二屆縱橫碼教學經驗交流會論文集

縱橫碼教學輔助軟件新版本的設計與實現
蘇州大學縱橫漢字信息技術研究所 楊季文 邵榮 李培峰

一、設計思想

  縱橫碼是一種規範、易學、快速、優秀的漢字輸入編碼方法,經過了幾年的推廣,縱橫漢字輸入法得到社會的承認和用戶的認可。越來越多的用戶已經喜歡上了縱橫碼。在縱橫漢字輸入法的推廣過程中,縱橫碼教學輔助軟件,發揮了重要的作用。本文介紹了怎樣用面向對象的程序設計方法及事件驅動的概念來實現新版本的軟件系統。

1. 以DOS為基礎

  雖然當今計算機科技日新月異,微機平台上主流操作系統從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的指針類指針,文件名串的指針。對內存塊的操作就使用這個結構指針。並且,實現了一組成因函數進行存儲區域的自動轉換。

  就這樣,縱橫碼教學輔助軟件中的內存的緩衝操作與具體功能代碼內部的應用操作實現了分離。從內存管理的方面使系統達到了安全高效的目標,並且易維護。

四、結束語

  新版本軟件中所實現的新思路是一種大膽的嘗試,其中一定有很多不成熟的地方,但希望本軟件的實現能推動縱橫碼其他外圍軟件的設計,對縱橫碼的推廣起到積極的作用!

  新版本軟件中所使用了事件驅動概念與面向對象的程序設計方法,它們不僅僅適合縱橫碼教學輔助軟件,在其他的應用軟件的設計中,也有極高的應用價值,有利於系統的高效、安全、易維護性的實現。