分清設計的簡單性與靈活性有時並不容易,讓我們從一個簡單的例子開始這一話題。假設我們需要編寫一個函數,實現將“home.example.net!{sm=1}[email protected]”這樣格式的字符串變為“[email protected]”,即去除其中花括號部分的內容。注意,花括號之前的網址可能會有多個。圖1示例了第一種實現方法。
圖1 在該實現方法中,通過運用sscanf()函數,並在函數中使用正則表達式的方式分離出花括號前後的字符串,最後通過sprintf()函數將花括號的前後字符串拼接在一起放入傳入參數_user_name中。盡管這一實現能達到目的,但作者在審查這一函數實現時指出:它的實現過於復雜。當作者提出這一觀點時,有人主張:這樣的實現具有更好的靈活性。
- void decoration_remove (char _user_name[])
- {
- char realm [NAME_MAX];
- char user [NAME_MAX];
- sscanf (_user_name, "%[^{]", realm);
- sscanf (_user_name, "%*[^}]%s", user);
- sprintf (_user_name, "%s%s", realm, &user[1]);
- return 0;
- }
圖2 在新的實現中,它通過遍歷字符串的形式找到前後的花括號,並通過將花括號後面的字符向前移的方法將花括號部分的內容從原始字符串中刪除。這一實現,不論是從時間冗余度或是空間冗余度都優於上一實現,且並沒有使用正則表達式這一知識點。 盡管這裡只以一個函數的實現為例解釋簡單性與靈活性,與軟件的設計似乎存在很大的差距,但它並不影響我們思考簡單性和靈活性。請別忘了,軟件設計最終將在函數的實現上有所體現。
- void decoration_remove (char _user_name[])
- {
- char *p_char = _user_name, *p_from, *p_to;
- while (*p_char != 0) {
- if (*p_char == '{') {
- p_from = p_char;
- }
- else if (*p_char == '}') {
- p_to = p_char ++;
- goto found;
- }
- p_char ++;
- }
- return;
- found:
- while (*p_to ++ != 0) {
- *p_from ++ = *p_to;
- }
- }
本文出自 “至簡李雲” 博客,請務必保留此出處http://yunli.blog.51cto.com/831344/475400