放之四海皆適用的設計原則(一)
一種設計適合某一專案但未必適用於另乙個專案,要掌握每乙個專案所適用的各種設計是不現實的。經驗告訴我們,通過使用規則有助於讓我們的大腦掌控更多的東西。同樣地,借助設計原則將使得我們能更好地掌控軟體設計。一旦掌握一定的設計原則,無論做怎樣的專案,通過運用它們將有助於做出(更
)好的設計。
由於設計原則帶有一定的抽象性,因此它在設計中所起到的作用仍是指導性的。同乙個設計原則在不同的專案中所起的效果也可能不同,恰當地運用各原則需要不斷地思考和練習。有了槍就一定能打到獵物嗎?沒有槍法的練習,槍只是槍而不是真正的狩獵工具。
下面將介紹作者在工作中常使用的部分設計原則,並通過提供設計例項幫助讀者理解。由於在創作本書期間,對一致性原則和完整性原則沒有碰到合適的素材,所以沒有將它們寫入本書。在以後碰到合適的素材時,作者將通過部落格與大家分享。
以人為本
在13.1
節闡述什麼是軟體設計時指出,軟體設計是乙個塑造模型的過程。塑造模型時,應以現實世界為參照,這就是以人為本設計原則的具體含義。
設計出來的軟體除了達到它所應滿足的需求外,另乙個很重要的功能是它能向他人傳達設計意圖。乙個設計不可能永遠由乙個人去維護,這就存在設計者與後繼者的溝通問題。溝通的形式有多種,比如寫文件、口授等,但最有效的溝通方式是讓設計自身具有「自說明」的能力。
我們在現實生活中積累了大量的生活經驗,這些經驗為溝通帶來了極大的效率。比如,一說到刀大家就能立即明白刀是什麼,而不需要解釋為「是一種由鐵做成的用於切割東西的工具」。既然生活經驗對於溝通效率是如此的重要,那設計時在軟體世界所創造的模型就應當迎合人們的生活經驗。如果在軟體世界裡將刀設計成一種用於擰螺絲的工具,那多少顯得有點怪異,因為這與我們的生活常識完全不符。
《資料結構》這類書籍所傳授的內容主要立足於軟體世界,它們是軟體世界的基石,對於軟體開發工程師之間的溝通也很有效,但卻不夠生動,表達力也不夠。設計應當盡可能在軟體世界中反映現實世界,只有這樣才會更生動,更容易讓人理解。通過以人為本設計原則所設計的軟體能讓涉眾知其一後根據自己的經驗推測出二,這顯然將大大地提高被設計軟體的「自說明」能力。
下面以乙個在
vxworks
作業系統上採用記憶體管理單元保護任務記憶體池的設計為例,來幫助讀者進一步理解「以人為本」這一設計原則。
假設在乙個執行
vxworks
作業系統的嵌入式裝置上存在多個任務,且所有的任務是以共享系統記憶體的方式執行的,也就是說,即使是任務
a所專有的記憶體池任務
b也可以因為出錯而意外訪問。通過採用記憶體管理單元(參見
1.10節)
實現記憶體池保護功能,將有助於防止程式中因為未初始化指標等因素所造成的非法記憶體池訪問問題。在**設計方案之前,需要先了解設計用例
(use case)。圖
13.3
示例說明了三個任務和三個記憶體池,在每乙個記憶體池中也標識出它可以被哪個(些
)任務讀寫。當任務
a處於活動狀態時
(注意:每一時刻只能有乙個任務是處於活動狀態的
),記憶體池1和
2可被讀寫,而記憶體池
3不可以;同理,當任務
b處於活動狀態時,記憶體池2和
3將變為可被讀寫但記憶體池
1不可以;最後,當任務
c處於活動狀態時,三個記憶體池都不可被讀寫。
根據「以人為本」設計原則,我們需要在生活中找到能表達這一設計用例的相似場景,並將之引入到軟體世界中。很多公司都有員工牌且員工牌與公司的門禁系統是關聯在一起的,每個人能進入公司哪些辦公區或實驗室都是通過員工牌來進行許可權管理的。如果將員工牌的這種現實模型搬到軟體世界中就能讓最終的設計結果具備良好的「自說明」能力。
本文選自《專業嵌入式軟體開發——全面走向高質高效程式設計(含
***光碟1張
)》一書
圖書詳細資訊
:
放之四海皆適用的設計原則(一)
放之四海皆適用的設計原則 一 一種設計適合某一專案但未必適用於另乙個專案,要掌握每乙個專案所適用的各種設計是不現實的。經驗告訴我們,通過使用規則有助於讓我們的大腦掌控更多的東西。同樣地,借助設計原則將使得我們能更好地掌控軟體設計。一旦掌握一定的設計原則,無論做怎樣的專案,通過運用它們將有助於做出 更...
放之四海皆適用的設計原則(二)
在軟體行業,模組化設計早已深入人心,因為通過模組化這種 分而治之 的方法能有效地降低設計的複雜度。如何獲得更好的模組化設計不是這裡要討論的重點,本書只關注模組的初始化與終止化這兩個關鍵點。在大多的嵌入式系統中,模組的執行是從呼叫它的初始化函式開始的。與模組大多有初始化函式相比,忽視為模組設計終止化函...
放之四海皆適用的設計原則(二)
在軟體行業,模組化設計早已深入人心,因為通過模組化這種 分而治之 的方法能有效地降低設計的複雜度。如何獲得更好的模組化設計不是這裡要討論的重點,本書只關注模組的初始化與終止化這兩個關鍵點。在大多的嵌入式系統中,模組的執行是從呼叫它的初始化函式開始的。與模組大多有初始化函式相比,忽視為模組設計終止化函...