一個好的設計應當具備哪些要素

  對於一個好的設計,我們往往會說其應當具備可維護性,這是最爲基本的要求。其它的要求,比如性能、資源的佔用等都應當在滿足可維護性的情況下再去考慮的。但可維護性是一個非常籠統的詞,可以說一個詞包含了很多的東西,比如,可讀性、可擴展性等等,都可以當作是可維護性的內容。我在日常工作中,對於一個好的設計,有一些自己的想法,主要是體現在“四性一痛”。

 
    第一,一個好的設計應當具有“一致性”。一致性就是對於相類似的問題採用同樣的方法去處理,而不是對於類似的情況,在case1中採用的是設計A,而在case2中採用的是設計B。對於這種設計,其往往很難維護。需要說明的一點是,一致性可以包括設計方法的一致性、函數命名的一致性、註釋書寫格式的一致性等等。在一致性上一個好的例子是:UNIX/LINUX中對於文件和設備的處理都是採用open()/close()/ioctl()/read()/write()這五個函數來實現的,當我們在UNIX/LINUX上編程時,只要說到打開設備或是文件,我們就知道應當如何做了。再來看看一致性不好的一個例子:比如CLIB中的malloc()/free(),這是一對用於分配和釋放內存(Heap)的函數,在函數的命名上應當說其一致性並不好,在我看來malloc()/mfree()就要比它好些,不同之處就是在free()函數名的前面加了一個m。一致性好的軟件,不論是維護或是閱讀都讓人覺得舒服和自然,這一點是非常重要的!
 
    第二,一個好的設計應當具有“完整性”。打一個比方,比如我們的程序需要寫一個模塊用於管理某種類型的資源,因此,我們寫了一個allocate()函數用於對這一資源進行分配。從完整性的角度來看有allocate()就應當有free()或是release()。因此,我們的設計應當包含free()或是release()。完整性好的設計往往給模塊的使用者帶來某種程度的靈活性和便利性。
 
    第三,模塊之間的“正交性”。正交性體現在模塊之間不應當存在功能重疊的部分,對於模塊之間存在重疊的部分,往往表明我們需要抽象出另一個模塊,從而將重疊的部分轉移到這一新模塊中。
 
    第四,設計的“簡單性”。簡單性包括代碼邏輯的簡單性和代碼語句的簡單性,簡單意味着容易維護、理解。簡單本身也是一種美。
 
    最後,我想對於一個好的設計,作者可以問問自己:我在設計這個模塊時“痛苦”過了嗎?如果沒有,那存在兩種可能;一是問題很簡單或是我們自己的水平很高,所以不需要更多的思考去實現它;另一種可能就是這一設計有可能是一個“頭痛治頭,腳痛治腳”的設計。好的設計,我們往往需要在很多方面進行權衡,在設計初期是非常痛苦的一件事,但隨着設計的完善,我們會發現“這一設計就是我想要的、就應當是這個樣子的”,到時自己會覺得這個設計很舒服,真的體現了“苦盡甘來”。
 
    對於上面所提到的一些好的設計的特點,在我們的工作中可能不是一次性設計到位的,但是我們必須將這些特點記在心中,並隨着工作的進展最後實現它們。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章