這篇文章講述的是,我們在程式設計的過程中以一種什麼樣的價值觀作為導向,遵守一些什麼樣的規則。就能編寫出比較優秀的**。
先說一下三個概念
模式:也就是我們通常所說的解決方案,比如要寫乙個迴圈遍歷有很多實現方案。模式表達的是我們要做什麼和怎麼做出來。
價值觀:也就是我們程式設計應該實現的目的,統一支配我們程式設計的過程。比如我們實現的模式要很靈活。
原則:實現解決方案的準則。價值觀為我們實現解決方案提供了方向,原則就是告訴我們在實現這種解決方案的過程中應該遵守怎麼樣的規則。
他們三者之間的關係是:模式描述了要做什麼,價值觀提供了動機,原則把動機轉變成了實際行動。
也就是我們在編寫一種解決方案的時候,應該有一種價值觀導向(我們要編寫出什麼樣的程式),在編寫的過程中應該遵守一定的規則來實現這種價值觀。(比如變數命名要規範之類)
價值觀
有3個價值觀與優秀的程式設計血脈相連。它們分別是:溝通,簡單與靈活。
1.溝通
在程式設計的時候,我們很容易從計算機的角度進行思考,但只有一面程式設計一面考慮其他人的感受,才能編寫出好的**。也就是我們在編寫**的時候,想想別人看到這段**會怎麼想?knuth提出過一種文學程式設計理論:程式應該讀起來像一本優秀的**,它需要有情節與韻律,句子之間應該有優雅的小小跌宕起伏。
2. 簡單
盡量使程式的邏輯簡單。去掉多餘的複雜性可以讓那些閱讀,使用與修改**的人更容易理解。有些複雜性是內在的,它們準確地反映出所有解決問題的複雜性。但有些複雜性的產生完全是因為我們忙著讓程式跑起來,在擺弄過程中留下來的「指甲印」沒有擦乾淨。所以回顧自己做過的事情,把麥子和糠分開,是程式設計不可或缺的一部分。
其實這個目的與溝通是相輔相成的,程式邏輯越簡單,與讀者溝通也就越方便。
3. 靈活
在三個價值觀中,靈活是衡量那些低效編碼與設計實踐的一把標尺。程式越靈活,後面維護起來也就越方便。但是靈活性的提高是以複雜性提高為代價的,這就需要我們好好權衡一下利弊了。不要盲目追求程式的靈活性而增加程式的複雜度。
原則 我們在程式設計的過程中應該遵守的一些準則。
1. 區域性化影響
組織**結構的時候,要保證變化只會產生區域性化影響。如果這裡的乙個變化引起那裡的乙個問題,那麼變化的代價就會急劇上公升了。把影響範圍縮到最小,**就會有極佳的溝通效果。它可以被逐步深入理解,而不必一開始就要鳥瞰全圖。
2. 最小化重複
如果相同的**出現在多個地方,那麼改動一處副本的時候,就不得不考慮是否需要修改其他的副本。這樣變動不在發生在區域性了,**重複的越多,變化的代價就越高。所以我們要把重複的**抽出來形成一小段**或者方法,保證變化只會帶來區域性化影響。
3. 將邏輯與資料**
把邏輯與邏輯所處理的資料放在一起,在發生變化的時候,資料和邏輯可能同時需要改動。如果把他們放在一起,那麼修改它們所造成的影響只會停留在區域性。
4. 對稱性
程式中處處充滿了對稱性,比如add()方法總是伴著remove()方法。識別出對稱性,把它清晰表達出來,**將更加容易閱讀。一但閱讀者理解了對稱性所涵蓋的某一半,它們就會很快理解另外一半。程式中的對稱性指的是概念上的對稱性,無論在什麼地方,同樣的概念都以同樣的形式呈現。
比如: 缺少對稱性的例子:
void process()
第二條語句更加具體。應該跟第一條與第三條語句一樣使用方法的形式展示。
void process()
但是這個方法依然違反了對稱性。第乙個方法和第三個方法都是以方法意圖來命名的,而第二個方法是以實現方式來命名的。我們應該想到我count++是為了幹什麼,於是就像如下的結果:(tally: 記賬)
void process()
5. 宣告式表達
實現模式背後另一條原則是盡可能宣告式地表達出你的意圖。(這個地方沒看得很明白,不詳述了,今後補充!)
6. 變化率
把具有相同變化率的邏輯,資料放在一起,把具有不同變化率的邏輯與資料分離。乙個物件中所有成員變數的變化率應該差不多相同。兩個同時變化但又和其他成員的變化步調不一致的變數應該屬於某乙個輔助物件。比如金融票據的數值和幣種會同時變化,那麼這兩個變數最好放到乙個輔助物件裡面:
setamount(int value, string currency) {
this.value = value;
this.currency = currency;
調整為:
setamount(money money) {
this.money = money;
變化率原則也是對稱性的乙個應用,不過是時間上的對稱。在上面的例子中value與currency是對稱的,它們會同時變化。但它們與其他欄位不對稱,把它們放到屬於自己的物件中,讓新的物件向閱讀者傳遞它們的對稱關係,這樣就更可以在將來消除重複,進一步達到影響的區域性化。
Gentle 簡單配置方法之一種
2.在vs中新建 website1 3.website1加入引用 瀏覽位置e tddownload gentle 1.2.9 output release 加入檔案 gentle.common.dll gentle.framework.dll gentle.provider.sqlserver.dl...
WPF程式設計,羅盤時鐘一種實現方式。
如果所示,是最終效果。此實現 參考了分享的方法。直接複製的源 直接執行有問題,在此基礎上稍加更改到現在的效果。新建wpf專案,直接複製後,更改一下命名空間就可以直接執行了。注意.net環境是4.5 namespace clock temp x軸的中心位置 private double centerp...
程式設計是一種藝術
感言 作為一名技術黨,我們要熱愛我們的技術,並願意把它當作一生事業去做。我一直有一句格言 程式設計是一種藝術 不管什麼專案,我都會在效能 風格 解題思路上下足功夫。每天我都會對今天所遇到問題進行歸納總結,並儲存到自己構建的知識庫中。如果有意思的問題,同樣也會發布到部落格上去,讓同行的戰友不再為此煩惱...