設計原則 平衡簡單性與靈活性

2021-09-03 03:49:24 字數 1774 閱讀 9139

分清設計的簡單性與靈活性有時並不容易,讓我們從乙個簡單的例子開始這一話題。假設我們需要編寫乙個函式,實現將「[email protected]」這樣格式的字串變為「[email protected]」,即去除其中花括號部分的內容。注意,花括號之前的**可能會有多個。圖1示例了第一種實現方法。

void decoration_remove (char _user_name) 

]%s", user); 

sprintf (_user_name, "%s%s", realm, &user[1]); 

return 0; } 

圖1 在該實現方法中,通過運用sscanf()函式,並在函式中使用正規表示式的方式分離出花括號前後的字串,最後通過sprintf()函式將花括號的前後字串拼接在一起放入傳入引數_user_name中。儘管這一實現能達到目的,但作者在審查這一函式實現時指出:它的實現過於複雜。當作者提出這一觀點時,有人主張:這樣的實現具有更好的靈活性。

在作者看來,設計的簡單性不只是體現在**少,還包含概念的易理解性、知識點的使用盡可能少、程式執行效率更高等。上面的設計在**行數上是簡單,但它使用了沒有必要的正規表示式知識點,且兩個sscanf()函式的使用需要更多的處理器時間。

要明白乙個實現是否真的具有靈活性,我們需要問自己「採用靈活性設計的依據是什麼?」

靈活性不能全以自我感覺為依據,而是需要我們找到支撐靈活性的需求,如果需求不存在,那說明所謂的靈活性極有可能毫無意義,甚至會為我們的將來帶來更大的不確定性。在上一實現中,使用正規表示式其實根本無法帶來靈活性,如果將來有一天輸入字串的格式改變了,並不能因為使用了正規表示式而使得我們不需更改函式的實現。一旦實現的靈活性站不住腳,取而代之的是我們應當追求簡單性,圖2

示例了另一種實現。

void decoration_remove (char _user_name) 

else

if (*p_char == '}')  

p_char ++; 

} return; 

found: 

while (*p_to ++ != 0)  } 

圖2在新的實現中,它通過遍歷字串的形式找到前後的花括號,並通過將花括號後面的字元向前移的方法將花括號部分的內容從原始字串中刪除。這一實現,不論是從時間冗餘度或是空間冗餘度都優於上一實現,且並沒有使用正規表示式這一知識點。

儘管這裡只以乙個函式的實現為例解釋簡單性與靈活性,與軟體的設計似乎存在很大的差距,但它並不影響我們思考簡單性和靈活性。請別忘了,軟體設計最終將在函式的實現上有所體現。

如果靈活性設計帶來了簡單性,那就不存在平衡問題。但是,當簡單性與靈活性之間存在取捨時,如何在簡單性與靈活性之間做出選擇?可以通過問自己幾個問題來幫助選擇:

讀者或許意會到了,平衡簡單性與靈活性的重點是為了盡可能做到簡單性。具有簡單性的設計除了更容易被理解和維護外,還意味著我們不致於過度設計。當出現過度設計時,它可能意味著浪費,也可能無意中又創造了更大的複雜度。

乙個出色的設計,除非設計者已經具備了相同或相似的經驗,否則很難一步到位。請不要相信每一次選擇靈活性設計將使我們最終構建出乙個出色的軟體架構。相反,作者所持的觀點是,高質量的設計是在追求簡單性的過程中,在需求需要的情形下通過逐步的靈活性演進而創造的。

靈活性設計在不少情形下是乙個優美的陷阱,要避免踏入這一陷阱,需要我們抵擋住「靈活性」的**,而方法就是通過問自己前面提到的兩個問題。另外,我們不應為了「顯擺」而追求沒有必要的靈活性,用直截了當的方式解決問題並不等同於「做事不夠專業」。

設計原則 平衡簡單性與靈活性

分清設計的簡單性與靈活性有時並不容易,讓我們從乙個簡單的例子開始這一話題。假設我們需要編寫乙個函式,實現將 home.example.net user other.example.net 這樣格式的字串變為 home.example.net user other.example.net 即去除其中花...

靈活性設計是定製軟體的最高境界

隨著企業管理個性化 差別化的發展趨勢,管理軟體的定製化是乙個不可阻擋的趨勢。但對於軟體公司來說,定製軟體是成本最高 開發難度最大的軟體生產形式。一方面是客戶的需求,一方面是公司的成本,軟體企業如何兼顧這兩個方面呢?定製軟體最容易採取的方法就是客戶怎麼說,我就怎麼做,不思考 不分析,依樣畫葫蘆。但是當...

c 模板與泛型程式設計5 模板的靈活性

這篇文章中c primer 用兩種智慧型指標舉例子 shared ptr和unique ptr如何指定刪除器的差異實際上就是這兩個類功能的差異。我們先看一下如何定義shared ptr的刪除器 學習自csdn的 在建構函式的時候傳入函式的指標 include include include temp...