[設計原則] 以人爲本

     在《 什麼是軟件設計 》一文中指出,軟件設計應當是一個創造模型的過程。那軟件世界中的模型其原型源於何處呢?來源於現實世界!這與「以人爲本」設計原則又有什麼關係呢?
     設計出來的軟件除了達到其所應知足的需求外,其很重要的另外一個功能是它能向他人傳達設計者的設計意圖,畢竟一個設計不可能永遠地由一我的去維護。在絕大多數的情形下須要多人合做,而合做不可避免地須要涉及溝通。溝通的形式有多種,好比寫文檔、口授等等,但最好的設計應當是設計自身是「自說明」的。那如何讓設計能更好地「自說明」呢?人們在現實生活中積累了大量的生活經驗,而大量的生活經驗爲溝通帶來了及大的效率。好比,一說到刀,涉衆就能當即明白刀是什麼,而不須要解釋爲「一般是一種由鐵作成的用於切割其它東西的工具」。既然生活經驗對於溝通效率是如此的重要,那設計時 在軟件世界所創造的模型就應當迎合人們的生活經驗,這就是以人爲本! 若是在軟件世界裏將刀設計成了是一種用於擰螺絲的工具,那多少顯得有點「不厚道」,由於它與人們的生活常識徹底不符。取而代之,將其設計成螺絲刀就能很好地體現「以人爲本」。
     《數據結構》這類書籍所傳授的內容更多地立足於軟件世界,能夠說數據結構是軟件世界的基石。這些基石對於軟件開發工程師之間的溝通仍是頗有效的,但卻不夠生動。 軟件世界內的設計應當更多地反映現實世界,只有這樣才更加的生動、更容易讓人理解,由於經過這樣設計出來的軟件能讓用戶知其一後根據經驗推測出二,而進一步軟件的設計又能迎合用戶的推測,這顯然將大大地提升被設計軟件的「自說明」能力。 接下來以一個在VxWorks操做系統上採用MMU保護任務內存池的設計爲例,來幫助讀者進一步理解「以人爲本」這一設計原則。
     如今假設在一個運行VxWorks操做系統的嵌入式設備上存在多個任務,且全部的任務是共享系統內存的方式運行的,也就是說對於任務A專有的內容池,若是任務B也想去訪問那也是能夠的,其上並不存在象Windows桌面系統那的進程保護機制(其實它也是用MMU實現的)。經過採用MMU進行內存池的保護將有助於發現程序由於未初始化指針等因素所形成的內存訪問錯誤的根源。如何經過恰當地運用MMU來保護和任務的內存池呢?在探討設計以前,須要瞭解被設計模塊的用例(use case)。
     圖1示例了三個任務和三個內存池,在每個內存池中也標識了其能夠被哪一個(些)任務讀寫。從圖中能夠看出任務C不能訪問圖中列出的三個內存池。當任務A處於活動狀態時(注意每一時刻只能有一個任務是處於活動狀態的),內存池1和2應當可被讀寫,而內存池3應當是不能被讀寫的;同理,當任務B處於活動狀態時,內存池2和3變爲可被讀寫且內存池1不可被讀寫;最後,當任務C處於活動狀態時,三個內存池都不可被讀寫。
圖1
     那如何經過設計來展現前面講到的用例呢?顯然,每個任務都須要必定的數據結構來表達它對每個內存池的訪問權限,生活中存在這種相似的例子嗎?想一想不少大型的公司都有員工牌,且不少情形下員工牌是與門禁系統聯繫在一塊兒的,每一個人能進入公司哪些辦公區或實驗室,都是經過員工牌來進行權限管理的。若是將員工牌的這種現實模型搬到軟件世界中去,是否是能取得很好的「自說明」效果呢?這就是做者設計內存池保護模塊時,所採用的設計思想。
     圖2是引入了員工牌的概念後的示意圖,其中的mbadge是「memory badge」的簡寫,badge有「徽章」的意思,而運用到公司內部就是指員工牌了(摩托羅拉內部就稱員工牌爲badge的)。有了mbadge的概念之後,很天然地會問這類問題 —— 好比,任務A對於每個內存池的訪問權限是記錄在哪兒的呢?想信,不用解釋讀者也會想到應當是記錄在mbadge中的。這裏與現實世界可能有一點點不一樣,現實世界的數據信息有多是記錄在中央數據庫中的,但這裏因爲沒有數據庫因此將存取權限記錄在每一個任務的mbadge上,仍是很直觀的。從圖中也很容易想到,因爲任務C沒有mbadge,所以它不具備對三個內存池進行讀寫的權限。
圖2
     有了mbadge的概念之後,也很容易向用戶(多是其它的程序員)解釋,若是要使用內存池保護這一功能,第一步須要作的是讓任務擁有一個mbadge(固然,這可能須要經過調用相應的函數去得到),接着對mbadge設置所對應的任務處於活動狀態時所能讀寫的內存池。並且,這些解釋顯得是那麼的天然和易懂。接下來並不打算對內存池的具體實現是如何作的進行進一步的闡述,由於對於理解「以人爲本」設計原則來講,具體的實現細節並不重要。
     以人爲本的設計原則集中體現於在軟件世界中構造與現實類似的模型,或者說重點在於創造概念。當概念有了之後,後面怎麼設計就有了很好的方向性,由於現實世界就是一個參照,也不容易作出一個什麼都不象的設計來。概念的存在才能讓軟件具備生命,而不僅是一堆死板的數據結構和代碼。另外,也由於有了模型或概念,如何給數據結構或函數命名也會更加的容易。某種程度上,「以人爲本」的設計原則與《 好命名勝於任何註釋 》這一設計原則是分不開的。
相關文章
相關標籤/搜索