Once And Only Once(一次並且只有一次),生活中有這麼多的一次並且只有一次。出生只有一次,20歲只有一次,對大多數人來說結婚只有一次,這是自然的規律。
但是對於軟體而言,到處都是Once And More Once(一次並且再一次)。
我覺得,可靠的開發軟體、讓我們從開發軟體的體力勞動中解脫出來,是要遵循DRY原則的 RRY-Don’t Repeat Yourself!不要重複你自己。
在兩個或兩個以上的地方表達同一事物,這就是重複。你改變其中的一個地方,必須記得改變其他相同的地方。如果你不這麼做,你會陷入一種境地,你的軟體自相矛盾,呵呵,這就又上升到一個高度,不是你能否記住這個問題,而是你何時應該把它忘記,因為對我們來說,自相矛盾的軟體簡直是粗魯的是噩夢,噩夢不應該把它忘記嗎。
《The Pragmatic Programmer》定義重複的4種 類型。
Imposed duplication (強加的重複):開發人員覺得他們無可選擇—環境似乎要求重複。
Inadvertent duplication(無意的重複):開發人員沒有意識到他們在重複資訊。
Impatient duplication(無耐性的重複):開發人員偷懶,他們重複,因為那樣似乎更容易。
Inter-developer duplication(開發人員之間的重複):同一團隊(或不同團隊)的幾個人重複了相同的資訊。
強加的重複:就是強加給我們的重複,比如我們代碼中常常需要注釋標頭檔,注釋方法等等,為瞭解決這個問題,於是一些Addin誕生了比如VBCommenter、CodeTemplateNET。
無意的重複:比如我們設計的資料庫中不知不覺會有資訊冗餘,這是無意的重複,還可能和設計中的錯誤有關。解決方案:改進設計,適時重構。
無耐性的重複:需要寫一個與你以前寫過的一個相似的方法,有時迫於時間壓力,你會受到誘惑,去copy原來的代碼,並做出一些改動。而不是去修改原來的方法,使它更通用。好了,如果業務變了,記住你就得修改兩個地方,你又怎麼能記得住呢,即使你記得住,你要你的繼任者怎麼能記得住?解決方案:記住欲速則不達,不要偷懶。
開發人員之間的重複:比如我們有一個項目有三個模組需要根據你選擇的模版初始化計算對象以便計算工資,照道理業務方法都是一樣的,但是卻寫了三套方法,整個功能集無意中被重複,這些重複在幾個月或幾年終不會被發現,從而導致維護問題(不知道現在維護問題是不是已經出來了)。解決方案:鼓勵開發人員之間的主動交流,代碼複查。
一次並且只有一次實現策略:只在一個地方實現一條規則,如果你的程式中有一條做某件事的規則,只實現它一次。通常這使得程式中方法數量大大增加,但只會造成極小的額外開銷,卻消除了重複(模組中方法的數量或許可以從側面反映出這個程式員的水平噢!)。
重複是有害的,使我覺得軟體開發就像是體力勞動。體力勞動可以減肥,我一個同學也是做軟體開發,我不知道他是否是做軟體開發這種“體力勞動”,兩年下來,居然從原先的170斤下降到120斤,而且身材特好,令人羨慕,但是體力勞動的維護成本是很高的。腦力勞動可以讓我們覺得因為設計所以出色。不重複,從體力勞動的噩夢中解放出來,這也是《Design Pattern》隱含的思想之一。
參考文獻《The Progmatic Programmer》、《Design Pattern Explained》