1. 程式人生 > >應用程式框架設計(一)

應用程式框架設計(一)

應用程式框架設計<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

許式偉

一、摘要

隨著面向物件技術的發展成熟,已經出現了許多著名的應用程式框架,如在Windows平臺下有MFCVCLOWL等;在舊的DOS系統下有Turbo Vision。在這裡我希望通過我設計的“SW系統”來闡述我對設計應用程式框架一些想法。其中涉及的內容主要有:

1、應用程式框架設計的基本內容

這一部分主要是討論應用程式框架的必要性、可行性,以及設計應用程式框架的基本思路。

2、SW系統的總體內容與實現

這一部分主要討論作為一個應用程式框架,

SW系統的總體結構和內容,並對SW系統一些重要的實現細節做出說明。其中主要有:SW系統中的視窗模型、屬性、SW系統的RuntimeClass支援和序列化等。在最後,我們要分析經典應用程式框架的缺陷。同時也說明由SW系統向COM轉變的必然。

3、SW系統的新方向:基於COM(元件)思想的應用程式框架

這一部分主要介紹元件思想的基本內容。SW系統的對元件思想的實現。

二、應用程式框架設計的基本內容

一個應用程式到底有多少“骨頭”,多少“肉”?這裡所說的“肉”是指程式中用於解決問題的那一部分,而“骨頭”是指“肉”所依附的程式框架部分,它們是為了實現與使用者互動、使介面友好必需做的事情。

對於解決問題的邏輯,我們很難能夠找到一個一般做法來簡化這件事。只有在具體定位到某一具體的方向時,才有可能做到這一點。例如你要進行數值計算,可能會需要一個功能完善的數學包;你要進行圖象處理,可能需要一個圖象處理庫;等等。嚴格的說,這些東西說不上是一個框架,只是一個個工具包(

Utilities)。因為它們一般沒有複雜的呼叫規則,函式之間相當獨立。

對於應用程式與使用者的互動,在DOS時代程式設計的人一定對此感觸很深。DOS時期基本上程式與使用者互動的動作都是自己完成的。這樣做的結果往往不是覺得在介面設計上浪費了太多時間,就是覺得介面設計得不盡人意。各個程式的框架程式碼有大量的反覆,但由於程式設計方法的侷限,程式程式碼的重用效率往往比較低。

面向物件思想的成熟促使了種種應用程式框架的誕生。面嚮物件語言中,類的繼存可以完成對大量現成程式碼重用的重用;動態束定(即虛擬函式機制)技術有效地將具體的實現程式碼延遲到設計階段。而一種稱為“事件驅動模式”的應用程式結構使程式的框架程式碼與實現細節徹底發生了分離。儘管現在的應用程式框架種類挺多,但它們在實現思想上相當一致:所有的這些應用程式框架都是“事件驅動模式”的一個應用。這也包括本文要介紹的

SW系統。

“事件驅動”的核心自然是事件。從事件角度說,事件驅動程式的基本結構是由一個事件收集器、一個事件傳送器和一個事件處理器組成。事件收集器專門負責收集所有事件,包括來自使用者的(如滑鼠、鍵盤事件等)、來自硬體的(如時鐘事件等)和來自軟體的(如作業系統、應用程式本身等)。事件傳送器負責將收集器收集到的事件分發到目標物件中。事件處理器做具體的事件響應工作,它往往要到實現階段才完全確定,因而需要運用虛擬函式機制(函式名往往取為類似於HandleMsg的一個名字)。對於框架的使用者來說,他們唯一能夠看到的是事件處理器。這也是他們所關心的內容。

檢視(即我們通常所說的“視窗”)是“事件驅動”應用程式的另一個要元。它是我們所說的事件傳送器的目標物件。檢視接受事件並能夠對其進行處理。當我們將事件傳送到具體的檢視時,實際上我們完成了一個根本性的變化:從傳統的流線型程式結構到事件觸發方式的轉變。這樣應用程式具備相當的柔性,可以應付種種離散的、隨機的事件。


由於Windows本身是基於“事件驅動”模型的。因而在Windows作業系統下實現應用程式框架有相當的便利。在事件驅動程式的基本單元中,事件收集器已經由Windows系統完成;事件傳送器也已經由Windows完成了部分內容。之所以是部分而非完全是因為Windows是用C語言實現的,而不是C++。由於沒有物件,Windows將事件傳送到所謂的“視窗函式”中(儘管不是傳送到具體的物件,但應該說這是面向物件方式實現的一個變體)。要感謝Windows做了這件事。確定事件的目標所要做的工作的複雜可能要超出我們的想象。我們要對此進行定性的討論。

根據事件的傳送路線,事件可以分為以下幾種:

1)位置事件(滑鼠事件)

它的目標比較明確,即包含滑鼠所在點的檢視。不過這也有不適用的時候。在拖動時,往往希望滑鼠訊息的接收者是滑鼠剛開始拖動時的檢視,而非真正包含滑鼠點位置的那個檢視。正是考慮到這一點,Windows提出了“捕獲滑鼠訊息”的概念。

2)焦點事件(鍵盤事件、命令事件等)

對於焦點事件訊息,情形就比較複雜。為了說明白這一點,需要引入模態檢視、焦點檢視等概念。

一個應用程式的檢視結構通常由一個樹型結構維護。在某個時刻,總存在一個檢視,它的所有祖先檢視不再接受事件,而它及其所有子檢視仍然處理事件。這個檢視被稱為模態檢視。它稱得上是“活動著的根檢視”。模態檢視的一個典型例子是對話方塊。在它執行時是應用程式的其他部分都失去了響應。

什麼是焦點檢視?模態檢視首先是一個焦點檢視。模態檢視的子檢視中,有一個檢視是被啟用的(或者稱,它獲得了“焦點”),它也是一個焦點檢視。如果它也是複合檢視(存在子檢視的檢視),它也可以有一個子焦點檢視。這個邏輯一直到一個被啟用的簡單檢視(對於它,還有一個名稱,叫“熱點檢視”)。“熱點檢視”的所有父檢視、父檢視的父檢視等等,直到模態檢視,構成一個“焦點檢視”鏈。

總的說來,焦點事件首先發送給獲當前的模態檢視。在它不知道如何處理時,可能將事件順著焦點檢視鏈往下傳。很多人在程式設計時往往發現某個事件處理函式總是不能夠被執行。這種情況總是發生在焦點事件。其原因是由於祖先檢視已經截獲了該事件。如果能夠對事件傳遞的過程理解了,應該怎樣改寫程式碼也就明確了。

然而在焦點事件上有太多例外。有些檢視沒有獲得焦點是也希望能夠處理鍵盤訊息。典型例子是選單,對話方塊中的一些按鈕等。針對這些Windows中已經有一些操作慣例,同時Windows也是不可能完全確定目標檢視的。

3)廣播事件

廣播事件並不知道自己的目標,它的處理方式很簡單,它將事件傳送給所有檢視。Windows並不支援廣播訊息。SW系統實現廣播訊息主要是為了邏輯的簡化,例如關閉所有視窗、儲存所有檔案等,應用廣播的概念是方便的。

相關推薦

應用程式框架設計

應用程式框架設計<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 許式偉 一、摘要 隨著面向物件技術的發展成熟,已經出現了許多著名的應用程式框架,如在Windo

客戶端websocketC#長連線及簡易RPC框架設計

0. 背景 最近有個需求:與Web伺服器保持長連線,接收服務端發來的訊息,並通過某RPC協議invoke客戶端某些回撥函式。故有了本文的客戶端websocket(C#)長連線及簡易RPC框架設計內容,

selenium + python自動化測試unittest框架學習selenium原理及應用

自動化 網上 下載安裝 src .cn 基礎 client cnblogs pytho unittest框架的學習得益於蟲師的《selenium+python自動化實踐》這一書,該書講得很詳細,大家可以去看下,我也只學到一點點用於工作中,閑暇時記錄下自己所學才能更加印象深刻

微信小程式開發框架——WXSS

    WXSS語言決定了小程式頁面的各個元素在視覺上的展示,WXSS與CSS即為相試的、為了適合微信小程式開發WXSS對CSS進行相應的修改。     width:用來設定元素'寬度' / height:用來設定元素'高度 '/

微信小程式學習筆記框架及工具

文章目錄 一、app.json的配置 1. 決定頁面檔案路徑 2. 配置視窗表現 3. 配置tab標籤導航 4. 設定網路超時時間 5. 配置debug模式 二、App()函式使用

開發款開源爬蟲框架系列:分析nutch,scrapy的爬蟲設計

1、Scrapy Engine(Scrapy引擎) Scrapy引擎是用來控制整個系統的資料處理流程,並進行事務處理的觸發。更多的詳細內容可以看下面的資料處理流程。 2、Scheduler(排程) 排程程式從Scrapy引擎接受請求並排序列入佇列,並在Scrapy引擎發出請求後返還給他們。 3、D

wepy-小程式開發框架學習

一、安裝npm由於新版的NodeJS已經集成了npm,我們可以安裝NodeJS來實現安裝npm。首先去nodejs官網(https://nodejs.org/en/)上下載最新版的nodejs,如下圖,點選下載下載完成以後,一路next即可安裝,如需更改安裝目錄,請自行配置。

UNIX管道應用及Shell實現-主體框架

作業系統的第一個大作業是做一個簡單的Shell,實現重定向、管道等功能。奮戰了好幾天終於基本搞定了= = 基本要求 Shell能夠解析的命令列法如下: 帶引數的程式執行功能。 program arg1 arg2 … argN 重

種分散式框架設計

我們設計的分散式系統,在正常工作時呈現出網狀。服務有層次性,客戶的請求會逐步經歷各層服務進行處理,當遍歷完所有服務後才會完成一次請求。每層服務會有若干臺機器,上游節點的機器可以把輸出結果傳遞到下游節點的任意一臺機器上。 當服務所依賴的資料需要更新時,我們需要做好同步工作,

基於RTP的h.264視頻傳輸系統設計

-i 感謝 項目 頻率 算術 處理 rop sel 決定 一、H.264 的層次介紹 H.264 定義三個層次,每一個層次支持一組特定的編碼功能。而且按照各個層次指定所指定的功能。基礎層次(baselineprofile)支持 I 幀和 P 幀【1】的幀內和幀間

linux驅動開發之framebuffer應用編程實踐

linux驅動開發之framebuffer驅動 1、framebuffer應用編程 (1)打開設備文件 (2)獲取設備信息 宏定義的命令在/linux/fb.h中 不可變信息FSCREENINFO,使用ioctl參數有FBIOGET_FSCREENINFO宏名,表示用ioctl從

深入淺出說CUDA程序設計

離線下載 vertex it領域 硬件 體系結構 占用 oid 過大 crc 第一章 為什麽需要並行程序 CUDA,全稱是Compute Unified Device Architecture,一般翻譯成中文為計算統一設備架構。筆者以為這樣的名字會讓人對CUDA感到很迷惑,

聖熙女鞋API設計

mar detail result arch eid api 個人 ext sum 女鞋API 數據結構定義 //Product //產品數據對象解構 { id:101, name:‘產品名‘, summary:‘產品簡介‘, image:

Node.js ORM框架Sequelize搭建服務

服務 l數據庫 數據 需要 log alt mysq 執行 準備 需要準備的環境:node.js mysql 1、在本地創建一個文件夾 2、執行npm init 創建成一個Node包,執行成功後文件夾裏會有一個json文件 3、安裝Sequelize 4、在

Java集合框架學習List

collect 有序集合 original package images 遍歷 容量 exp 子類 先附一張Java集合框架圖。 從上面的集合框架圖可以看到,Java集合框架主要包括兩種類型的容器,一種是集合(Collection),存儲一個元素集合,另一種是圖(M

分布式服務框架 Zookeeper介紹

出現 編寫 擁有 不同的 順序 高性能 場景 設計 分發 一、概述ZooKeeper(動物園管理員),顧名思義,是用來管理Hadoop(大象)、Hive(蜜蜂)、Pig(小豬)的管理員,同時Apache Hbase、Apache Solr、LinkedIn Sensei等眾

Spring框架初識

持久層 容器 med int reat set map 要求 enter 新的 1. Spring框架概述 1.1 簡介 Spring是分層的Java SE/EE應用 full-stack輕量級開源框架,以IoC(Inverse Of Control

基於容器微服務的PaaS雲平臺設計 實現容器微服務和持續集成

顯示 一次 target 全部 ext neu openshift svn客戶端 enc 版權聲明:本文為博主原創文章,歡迎轉載,轉載請註明作者、原文超鏈接 ,博主地址:http://www.cnblogs.com/SuperXJ/ 前言:關於什麽是容器微服務Paa

對賬系統產品設計

例如 產品經理 表模塊 放心 比較 div 第一篇 訂單 系列 我是做技術的,為什麽會要寫產品設計呢?就像一句俗話“久病成醫”,當你負責一個系統足夠久了,可能你就懂的比較多了。我想把自己遇見的聽見的做一個系列,算是對自己過去工作的總結。 本文的基調是,少專業術語,全用大白話

Hive框架基礎

type hist 沒有 dfs gem java view 在線的 history * Hive框架基礎(一) 一句話:學習Hive有毛用? 那麽解釋一下 毛用: * 操作接口采用類SQL語法,提供快速開發的能力(不會Java也可以玩運算) * 避免了去寫MapRed