程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> [設計原則] 平衡簡單性與靈活性

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

編輯:關於C語言

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

  1. void decoration_remove (char _user_name[]) 
  2.     char realm [NAME_MAX]; 
  3.     char user [NAME_MAX]; 
  4.  
  5.     sscanf (_user_name, "%[^{]", realm); 
  6.     sscanf (_user_name, "%*[^}]%s", user); 
  7.     sprintf (_user_name, "%s%s", realm, &user[1]); 
  8.     return 0; 
圖1   在該實現方法中,通過運用sscanf()函數,並在函數中使用正則表達式的方式分離出花括號前後的字符串,最後通過sprintf()函數將花括號的前後字符串拼接在一起放入傳入參數_user_name中。盡管這一實現能達到目的,但作者在審查這一函數實現時指出:它的實現過於復雜。當作者提出這一觀點時,有人主張:這樣的實現具有更好的靈活性。
在作者看來,設計的簡單性不只是體現在代碼少,還包含概念的易理解性、知識點的使用盡可能少、程序執行效率更高等。上面的設計在代碼行數上是簡單,但它使用了沒有必要的正則表達式知識點,且兩個sscanf()函數的使用需要更多的處理器時間。
要明白一個實現是否真的具有靈活性,我們需要問自己“采用靈活性設計的依據是什麼?”
靈活性不能全以自我感覺為依據,而是需要我們找到支撐靈活性的需求,如果需求不存在,那說明所謂的靈活性極有可能毫無意義,甚至會為我們的將來帶來更大的不確定性。在上一實現中,使用正則表達式其實根本無法帶來靈活性,如果將來有一天輸入字符串的格式改變了,並不能因為使用了正則表達式而使得我們不需更改函數的實現。一旦實現的靈活性站不住腳,取而代之的是我們應當追求簡單性,圖2 示例了另一種實現。
  1. void decoration_remove (char _user_name[]) 
  2.     char *p_char = _user_name, *p_from, *p_to; 
  3.  
  4.     while (*p_char != 0) { 
  5.         if (*p_char == '{') { 
  6.             p_from = p_char; 
  7.         } 
  8.         else if (*p_char == '}') { 
  9.             p_to = p_char ++; 
  10.             goto found; 
  11.         } 
  12.         p_char ++; 
  13.     } 
  14.     return; 
  15.  
  16. found: 
  17.     while (*p_to ++ != 0) { 
  18.         *p_from ++ = *p_to; 
  19.     } 
圖2   在新的實現中,它通過遍歷字符串的形式找到前後的花括號,並通過將花括號後面的字符向前移的方法將花括號部分的內容從原始字符串中刪除。這一實現,不論是從時間冗余度或是空間冗余度都優於上一實現,且並沒有使用正則表達式這一知識點。   盡管這裡只以一個函數的實現為例解釋簡單性與靈活性,與軟件的設計似乎存在很大的差距,但它並不影響我們思考簡單性和靈活性。請別忘了,軟件設計最終將在函數的實現上有所體現。
如果靈活性設計帶來了簡單性,那就不存在平衡問題。但是,當簡單性與靈活性之間存在取捨時,如何在簡單性與靈活性之間做出選擇?可以通過問自己幾個問題來幫助選擇:
1) 靈活性設計的依據是否是來源於現有需求?不少采納靈活性的設計者聲稱“如果將來變成了……的話,這種設計將更加的靈活”,出現這種陳述,往往意味著現有需求並沒有要求這樣的靈活性。在這種情形下,如果“那個如果”根本就不可能發生,那意味著我們並不需要所謂的靈活性。但是,當“那個如果”成立時,我們還得問第二個問題。
2) 靈活性設計的采納與否,對於現在和將來的工作量是否會產生大的差異?如果現在和將來的工作量並不會因為靈活性設計的運用而產生大的差異,那我們還應選擇簡單性。反之應當選擇靈活性。   讀者或許意會到了,平衡簡單性與靈活性的重點是為了盡可能做到簡單性。具有簡單性的設計除了更容易被理解和維護外,還意味著我們不致於過度設計。當出現過度設計時,它可能意味著浪費,也可能無意中又創造了更大的復雜度。   一個出色的設計,除非設計者已經具備了相同或相似的經驗,否則很難一步到位。請不要相信每一次選擇靈活性設計將使我們最終構建出一個出色的軟件架構。相反,作者所持的觀點是,高質量的設計是在追求簡單性的過程中,在需求需要的情形下通過逐步的靈活性演進而創造的。
靈活性設計在不少情形下是一個優美的陷阱,要避免踏入這一陷阱,需要我們抵擋住“靈活性”的誘惑,而方法就是通過問自己前面提到的兩個問題。另外,我們不應為了“顯擺”而追求沒有必要的靈活性,用直截了當的方式解決問題並不等同於“做事不夠專業”。

本文出自 “至簡李雲” 博客,請務必保留此出處http://yunli.blog.51cto.com/831344/475400

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved