高質量設計的特徵

2021-04-17 16:50:35 字數 3103 閱讀 8194

高質量的設計具有很多常見的特徵。如果你能實現所有這些目標,你的設計就真的非常好了。這些目標之間有時會相互牴觸,但這也正是設計中的挑戰所在——在一系列相互競爭的目標之中做出一套最好的折中方案。有些高質量設計的特徵也同樣是

高質量程式的特徵,如可靠性和效能等。而有些則只是設計範疇內的特徵。

下面就列出一些設計範疇內的特徵:

最小的複雜度(

minimal complexity

)正如剛剛說過的,設計的首要目標就是要讓複雜度最小。要避免做出「聰明的」設計,因為「聰明的」設計常常都是難以理解的。應該做出簡單且易於理解的設計。如果你的設計方案不能讓你在專注於程式的一部分時安心地忽視其他部分的話,這一設計就沒有什麼作用了。

易於維護

(ease of maintenance

)易於維護意味著在設計時為做維護工作的程式設計師著想。請時刻想著這些維護程式設計師可能會就你寫的**而提出的問題。把這些程式設計師當成你的聽眾,進而設計出能自明的(

self-explanatory

)系統來。

鬆散耦合(

loose coupling

)鬆散耦合意味著在設計時讓程式的各個組成部分之間關聯最小。通過應用類介面中的合理抽象、封裝性及資訊隱藏等原則,設計出相互關聯盡可能最少的類。減少關聯也就減少了整合、測試與維護時的工作量。

可擴充套件性(

extensibility

)可擴充套件性是說你能增強系統的功能而無須破壞其底層結構。你可以改動系統的某一部分而不會影響到其他部分。越是可能發生的改動,越不會給系統造成什麼破壞。

可重用性(

reusability

)可重用性意味著所設計的系統的組成部分能在其他系統中重複使用。

高扇入(high fan-in

)高扇入就是說讓大量的類使用某個給定的類。這意味著設計出的系統很好地利用了在

較低層次上的工具類(

utility classes)。

低扇出(

low fan-out

)低扇出就是說讓乙個類裡少量或適中地使用其他的類。高扇出(超過約

7個)說明乙個類使用了大量其他的類,因此可能變得過於複雜。研究發現,無論考慮某個子程式呼叫其他子程式的量,還是考慮某個類使用其他類的量,低扇出的原則都是有益的(

card and glass 1990; basili, briand, and melo 1996)。

可移植性

(portability

)可移植性是說應該這樣設計系統,使它能很方便地移植到其他環境中。

精簡性(

leanness

)精簡性意味著設計出的系統沒有多餘的部分(

wirth 1995, mcconnell 1997

)。伏爾泰曾說,一本書的完成,不在它不能再加入任何內容的時候,而在不能再刪去任何

內容的時候。在軟體領域中,這一觀點就更正確,因為任何多餘的**也需要開發、複審和測試,並且當修改了其他**之後還要重新考慮它們。軟體的後續版本也要和這些多餘**保持向後相容。要問這個關鍵的問題:「這雖然簡單,但把它加進來之後會損害什麼呢?」

層次性(

stratification

)層次性意味著盡量保持系統各個分解層的層次性,使你能在任意的層面上觀察系統,並得到某種具有一致性的看法。設計出來的系統應該能在任意層次上觀察而不需要進入其他層次。

舉例來說,假設你正在編寫乙個新系統,其中用到很多設計不佳的舊**,這時你就應該為新系統編寫乙個負責同舊**互動的層。在設計這一層時,要讓它能隱藏舊**的低劣質量,同時為新的層次提供一組一致的服務。這樣,你的系統的其他部分就只需與這一層進行互動,而無須直接同舊**打交道了。在這個例子中,層次化設計的益處有:(

1)它把低劣**的爛泥潭禁閉起來;(

2)如果你最終能拋棄或者重構舊**,那時就不必修改除互動層之外的任何新**。

標準技術

(standard techniques

)乙個系統所依賴的外來的、古怪的東西越多,別人在第一次想要理解它的時候就越是頭疼。要盡量用標準化的、常用的方法,讓整個系統給人一種熟悉的感覺。

checklist: high-quality routines

核對表:高質量的子程式

大局事項 q

建立子程式的理由充分嗎? q

乙個子程式中所有適於單獨提出的部分是不是已經被提出到單獨的子程式中了? q

過程的名字中是否用了強烈、清晰的「動詞+賓語」片語?函式的名字是否描述了其返回值? q

子程式的名字是否描述了它所做的全部事情? q

是否給常用的操作建立了命名規則? q

子程式是否具有強烈的功能上的內聚性?即它是否做且只做一件事,並且把它做得很好? q

子程式之間是否有較鬆的耦合?子程式與其他子程式之間的連線是否是小的(

**all

)、明確(

intimate

)、可見(

viaible

)且靈活(

flexible

)的?

q子程式的長度是否是由其功能和邏輯自然確定,而非遵循任何人為的編碼標準?

引數傳遞事宜 q

整體來看,子程式的參數列是否表現出一種具有整體性且一致的介面抽象? q

子程式引數的排列順序是否合理?是否與類似的子程式的引數排列順序相符? q

介面假定是否已在文件中說明? q

子程式的引數個數是否沒超過7個?

q是否用到了每乙個輸入引數? q

是否用到了每乙個輸出引數? q

子程式是否避免了把輸入引數用為工作變數? q

如果子程式是乙個函式,那麼它是否在所有可能的情況下都能返回乙個合法的值?

健壯性(robustness)

是指「系統在檢測到錯誤後繼續執行」的能力。通常架構詳細描述的系統會比需求詳細描述的系統更健壯。理由之一是,如果組成系統的各個部分都只能在最低限度上滿足健壯性要求,那麼系統整體上是達不到所要求的健壯程度的。在軟體中,鏈條的強度不是取決於最薄弱的一環,而是等於所有薄弱環節的乘積。架構應該清楚地指出程式設計師應該「為了謹慎起見寧可進行過度工程

(overengineering)

」,還是應該做出最簡單的能工作的東西。

詳細定義一種過度工程(裕度工程)的方法尤其重要,因為許多程式設計師會出於專業自豪感,對自己編寫的類做過度工程。通過在架構中明確地設立期望目標,就能避免出現「某些類異常健壯,而其他類勉強夠健壯」的現象。

React 設計高質量的React元件

react應用將圍繞著元件的設計展開,所以關於元件的設計至關重要。任何乙個複雜的應用,都是由乙個簡單的應用發展而來。軟體設計的通則 高內聚,低耦合。在前端開發中,html負責頁面顯示,互動放在js,樣式放在css檔案,從功能角度來說,模組劃分明確,但是不滿足高內聚的原則。react則是天生高內聚,展...

高質量程式設計 筆記

1.高質量軟體開發之道 1.提高軟體質量的基本方法 2.軟體質量屬性 3.質量 生成率和成本 4.軟體過程改進 5.高質量軟體開發的基本方法 2.程式的基本概念 1.程式語言 一套規範的集合,主要包括語言使用字符集 資料型別集合 運算子集合 關鍵字集合 指令集合 語法規則 對特定構造的支援 函式 繼...

高質量程式設計C C

一 請填寫bool float,指標變數與 零值 比較的 if 語句。10 分 請寫出 bool flag 與 零值 比較的 if 語句。3 分 標準答案 if flag if flag 如下寫法均屬不良風格,不得分。if flag true if flag 1 if flag false if f...