張德明
(中國鐵道科學研究院通信信號研究所,北京100081)
模塊化是軟件設計中需要達到的主要目標之一。相對于傳統的面向過程的語言將數據結構與算法分開的方式,面向對象的設計方法將相關的數據結構與算法作為一個對象進行封裝,形成一個擁有自己狀態以及行為的整體。在設計對象時,通過有效地將相互關聯的數據結構與行為進行封裝,而向外只提供必要的接口,從而達到強內聚松藕合的效果,也就達到了模塊化的目標。
在單線程環境下,采用對象的方式確實能夠實現有效的封裝。然而,當軟件在多線程環境中運行時,對象在封裝上則會遇到并發范圍的問題。

圖1 對象交互的圖示
圖1展示了一個簡單多線程環境。其中,有A,B,C3個以面向對象方法進行封裝的對象,另外有兩個環境線程。系統期望兩個線程能夠在3個對象的并發運行中,完成系統的功能。我們可以看到,對象B雖然作為一個獨立的對象,封裝了自己的結構和行為。但是,由于它同時被兩個線程訪問,這樣,在對象C和A與B進行交互時,必須要考慮許多線程同步的因素,造成對象間訪問時接口復雜,也就是增強了對象間的耦合性。當系統的對象更多,并發線程更多時,對象間的耦合將會成倍增加,軟件的模塊化目標將遇到嚴重的挑戰。
車次追蹤系統是調度監督以及調度集中系統中一個重要的組成部分,車次追蹤系統根據現場采集的站場表示信息,無線車次號信息,行調臺下達的計劃信息,以及人工車次修改等信息,通過綜合運算,對追蹤區段的列車進行識別、跟蹤和校核,并在此基礎上提供自動報點,列車位置報告等信息。
在實際設計中,車次追蹤系統作為調度系統應用服務器中的一個模塊。作為整體的應用服務器,除了提供車次信息相關運算和服務外,還要提供通信信息轉發、表示信息處理和進路信息處理等功能。
當把應用服務器作為系統的環境,而將通信轉發、車次追蹤和進路控制分別作為一個重量級的對象時,將得到一個類似圖1的系統結構環境,見圖2。

圖2 車次追蹤的應用服務器環境框圖
在圖2的應用服務環境中,系統要求應用服務器所提供的各個功能,包括車次追蹤,通信轉發,以及進路控制等都能夠并行運行,因此,系統中必須引入多個線程。 同時,由于各個服務模塊之間需要交互,以傳統面向對象模式進行設計,必然將多個線程引入對象中,造成同步的困難,增強了系統的藕合性。如何保證車次追蹤系統設計的模塊化,同時又保證模塊的并行性,如前面引用中提到的,是對系統設計方法的一個挑戰。
我們以圖3來說明主動對象模型。

圖3 主動對象模型
圖3中的對象分為兩種,其中A,B,C同以前的對象一樣,只能被別的線程被動調用,稱之為被動對象。另外一種對象,作為A,B,C3個對象的運行環境,它將系統的線程進行了封裝,并提供了對外接口的郵箱,稱之為主動對象。
系統的運轉過程如下:當外界有任務或者指令要主動對象來完成時,外界系統將任務以消息形式發送到主動對象的郵箱隊列中,主動對象的封裝線程則一直對其郵箱隊列進行監視,一旦發覺郵箱中有消息,將取出消息進行處理。當任務比較復雜時,主動對象將消息分發給相關的被動對象,讓其進行相應處理。
可以看出,在主動對象模型中,因為引入了主動對象,對任務線程進行了封裝,這樣就給其它被動對象提供了一個單線程的環境。在對A,B,C等各個被動對象進行算法設計時,只需要考慮基本的業務邏輯,而不需要考慮系統的并發性問題,有效地降低了系統的耦合性,增強了系統的模塊化。
圖4給出基于主動對象模型車次追蹤模塊的主框架結構。其中主要包含4個部分:接口,隊列,線程以及處理。

圖4 車次追蹤主框架結構
接口部分將所有輸入輸出進行封裝,其中CallIn供其它系統進行調用,將表示信息,計劃信息等輸入到車次追蹤系統,CallIn的處理就是將這些調用以消息的形式存放到消息隊列中。
CallOut封裝了車次追蹤模塊的輸出部分,外界系統通過重載CallOut方法,從而實現對車次號和報點等信息的獲取。
隊列部分完成主動對象模型中的郵箱功能。所有外界的信息要傳遞到車次追蹤系統,均需要以消息形式壓入隊列。同時,封裝線程部分對隊列進行不間斷監視,一旦發現隊列中有數據,將以先進現出的方式從中取出。
由于隊列部分同時要被外部線程和模塊內部線程訪問,因此,在隊列訪問時設置同步機制。
系統通過將操作系統提供的線程進行封裝,從而形成只在車次追蹤模塊內部運行的線程,當對象生成時,生成并啟動線程,當對象消亡時,終止并結束線程。
系統線程在對象生存期不間斷地運轉,給車次追蹤的業務邏輯處理對象提供運行環境,同時從消息隊列中獲取消息,并將這些消息分發給實現部分進行具體處理。
處理部分是車次追蹤算法的核心,包含大量站場相關的數據結構和處理類。這些處理類由封裝線程進行調用,對接收到的表示信息、無線車次號信息以及計劃信息等進行綜合分析,運算得出列車車次號位置信息以及報點等信息,將這些信息通過CallBack函數回調輸出。
本文引入主動對象模型,將車次追蹤的具體實現與并發處理分開,允許在進行算法設計時不用考慮系統的并行性,有效地降低了系統設計的復雜度。在滿足系統實時性特征的情況下,保證了系統的獨立性和模塊化。
[1] 朱冰,梅宏,楊芙清. 基于事件驅動的主動對象模型[J] . 軟件學報,1996(3).
[2] F.Buschmann, K.Henney, D.C.Schmidt. Patten-Oriented Software Architecture, Volume 4: A Pattern Language for Distributed Computing[M] . John Wiley & Sons, 2007: 365-367.