? ? ? ? 程序員擁有一個較好的編程原則能使他的編程能力有大幅的提升,可以使其開發(fā)出維護性高、缺陷更少的代碼。以下內(nèi)容梳理自StactOverflow的一個問題:編程時你最先考慮的準則是什么?? ?
KISS(Keep It Simple Stupid)
? KISS原則是英語 Keep It Simple, Stupid 的首字母縮略字,是一種歸納過的經(jīng)驗原則。KISS 原則是指在設(shè)計當(dāng)中應(yīng)當(dāng)注重簡約的原則??偨Y(jié)工程專業(yè)人員在設(shè)計過程中的經(jīng)驗,大多數(shù)系統(tǒng)的設(shè)計應(yīng)保持簡潔和單純,而不摻入非必要的復(fù)雜性,這樣的系統(tǒng)運作成效會取得最優(yōu);因此簡單性應(yīng)該是設(shè)計中的關(guān)鍵目標(biāo),盡量回避免不必要的復(fù)雜性。 ?
這個首字母縮略詞根據(jù)報導(dǎo),是由洛克希德公司的首席工程師凱利·約翰遜(U-2 、SR-71等的設(shè)計者)所創(chuàng)造的。雖然長久以來,它一直是被寫為 “Keep it simple, stupid”,但約翰遜將其轉(zhuǎn)化成 “Keep it simple stupid”(無逗號),而且這種寫法仍然被許多作者使用。詞句中最后的 S并沒有任何隱涵工程師是愚蠢的含義,而是恰好相反的要求設(shè)計是易使人理解的。
說明這個原則最好的實例,是約翰遜向一群設(shè)計噴射引擎飛機工程師提供了一些工具,他們所設(shè)計的機具,必須可由一名普通機械師只用這些工具修理。因此,“愚蠢”是指被設(shè)計的物品在損壞與修復(fù)的關(guān)聯(lián)之間,它們的難易程度。這個縮寫詞已被美國軍方,以及軟件開發(fā)領(lǐng)域的許多人所使用。 另外相類似的概念也可作 KISS原則的起源。例如“奧卡姆剃刀”,愛因斯坦的“一切盡可能簡單”、達芬奇的“簡單是最終的復(fù)雜性” 、安德魯·圣艾修伯里的“完美不是當(dāng)它不能再添加時,它似乎是在它不能被進一步刮除時實現(xiàn)的”。
有兩種軟件設(shè)計方法,一種是盡可能的簡單并保證沒有什么缺陷。另外一種方式是盡可能的復(fù)雜并保障沒有什么缺陷。而第一種方式相比第二種更加困難。 保持簡單(避免復(fù)雜)永遠是你應(yīng)該做的第一件事,簡單的代碼不僅寫起來簡單、不容易出Bug,還易于維護。簡單規(guī)則下,還包括:
Don’t Make Me Think:如果一段程序?qū)τ陂喿x者來說需要花費太多的努力才能理解,那它很可能需要進一步簡化。
最少意外原則:程序代碼應(yīng)盡可能的不要讓閱讀者感到意外。也就是說應(yīng)該遵循編碼規(guī)范和常見習(xí)慣,按照公認的習(xí)慣方式進行組織和命名,不符常規(guī)的編程動作應(yīng)該盡可能的避免。
如何把Kiss原則應(yīng)用到工作中?
要謙虛,不要認為自己是個天才,這是你第一個誤解。只有謙虛了,你才能真正達到超級天才的水平,即使不行,who cares!你的代碼那么stupid simple,所以你不需要是個天才!
將你的任務(wù)分解為4-12小時的子任務(wù)。
把你的問題拆分成多個小問題。每個問題用一個或者很少的幾個類來解決掉。
保持你的方法足夠小,每個方法永遠不要超過30-40行代碼。每個方法都應(yīng)該只處理一個小小的問題,不要搞太多uses case進去。如果你的方法中有多個分支,嘗試把他們拆分成多個小的方法。這樣不僅容易閱讀和維護,找bug也更快。慢慢的你將學(xué)會愛。
讓你的類也小點,原則和上面的方法是一樣的。
先解決問題,然后開始編碼。不要一邊編碼,一邊解決問題。這樣做也沒什么錯,但你有能力提前把事情切分成多個小的塊,然后開始編碼可能是比較好的。但也請你不要害怕一遍遍重構(gòu)你的代碼。另外行數(shù)還不是為了衡量質(zhì)量的標(biāo)準,只是有個基本的尺子而已。
不要害怕干掉代碼。重構(gòu)和重做是兩個非常重要的方面。如果你遵循上面的建議,重寫代碼的數(shù)量將會最小化,如果你不遵循,那么代碼很可能會被重寫。
其他的任何場景,都請你嘗試盡可能的簡單,simple,這也是最難的一步,但一旦你擁有了它,你再回頭看,就會說,之前的事情就是一坨屎。
參考鏈接: Do The Simplest Thing That Could Possibly Work: http://c2.com/xp/DoTheSimplestThingThatCouldPossiblyWork.html
DRY(Don’t Repeat Yourself)
? ? DRY即Don’t repeat ourself(不要重復(fù)你自己,簡稱DRY),或一個規(guī)則,實現(xiàn)一次(One rule, one place)是面向?qū)ο缶幊讨械幕驹瓌t,程序員的行事準則。旨在軟件開發(fā)中,減少重復(fù)的信息。DRY的原則是“系統(tǒng)中的每一部分,都必須有一個單一的、明確的、權(quán)威的代表”,指的是(由人編寫而非機器生成的)代碼和測試所構(gòu)成的系統(tǒng),必須能夠表達所應(yīng)表達的內(nèi)容,但是不能含有任何重復(fù)代碼。當(dāng)DRY原則被成功應(yīng)用時,一個系統(tǒng)中任何單個元素的修改都不需要與其邏輯無關(guān)的其他元素發(fā)生改變。此外,與之邏輯上相關(guān)的其他元素的變化均為可預(yù)見的、均勻的,并如此保持同步。 我對DRY的理解:
盡可能的減少重復(fù),如代碼重復(fù)、文檔重復(fù)、數(shù)據(jù)重復(fù)、表征重復(fù)、開發(fā)人員重復(fù)(相同的功能不能的開發(fā)人員的優(yōu)自己的實現(xiàn))
不重復(fù)造輪子,能夠使用開源的解決方案的情況下沒有必要再實現(xiàn)一遍。
重復(fù)的事項,盡可能的使用自動化程序解決。
不要過于優(yōu)化,過度追求DRY,破壞了程序的內(nèi)聚性。
相關(guān)規(guī)則有:? 代碼復(fù)用:http://en.wikipedia.org/wiki/Code_reuse
YAGNI – You ain’t gonna need it
? ? YAGNI 是You Ain’t Gonna Need It(你不會需要它)的簡寫,是極限編程的關(guān)鍵原則。YAGNI意思非常簡單:僅在您真正需要它們時才去做,而不是在您認為或預(yù)見將來可能需要它們時就提前做了!
您可以將YAGNI視為即時制造的擁護者。在這種情況下,制造業(yè)正在編寫代碼并交付功能。只有當(dāng)有人真的需求功能存在時,您才可以開始工作并創(chuàng)建它。否則,您將保持自己的懶惰! 它為什么如此重要?沒有編寫的每一行代碼都是時間,因此可以節(jié)省金錢。但是,甚至更多!它是:
更少的代碼維護
更少的代碼測試
事情發(fā)生變化時更少的代碼可重構(gòu)
更多時間用于更重要的功能
更多時間用于文檔編制
而且還包括:
節(jié)省了編譯/移植的時間
節(jié)省了測試運行的時間
生成時/運行時節(jié)省了資源
不必以某種方式保留的知識
它可以防止什么?如今,大多數(shù)軟件開發(fā)都是根據(jù)客戶的需求進行的。無論您是在產(chǎn)品公司,在提供開發(fā)服務(wù)的公司還是在其他地方工作。總是會在某處某人想要具有某個功能。是您的客戶要求具有某個需求的功能,還是產(chǎn)品經(jīng)理響應(yīng)客戶的反饋的功能。無論實際驅(qū)動者是誰,無論是早晚,這都是實際需求的體現(xiàn)。您正確預(yù)見未來功能請求的機會非常低。因此,您很有可能實現(xiàn)某些功能,而不是您的實際利益相關(guān)者想要的功能。過早地執(zhí)行某些操作很可能會導(dǎo)致一切都被丟棄。這是一個沒人真正喜歡的場景!然后,有時會發(fā)生另一種情況:沒有人真正需要該功能!? ?
Code For The Maintainer
? 為維護者編寫程序。比如讓代碼有自解釋的功能。在你編寫代碼的時候永遠記得將來需要維護他。
參考鏈接:
Code For The Maintainer:http://wiki.c2.com/?CodeForTheMaintainer
Be as lazy as possible.
? 人類因“偷懶”而進步。懶惰只是創(chuàng)造了需求。需求本身并不算進步。滿足需求形成了進步。 偷懶還包括:
不要重復(fù)發(fā)明輪子
過度優(yōu)化是萬惡之源
參考鏈接: Do The Simplest Thing That Could Possibly Work: http://c2.com/xp/DoTheSimplestThingThatCouldPossiblyWork.html
Programming is only the road, not the way.
? 編碼只是一種實現(xiàn)方式,而不是解決方案。編碼只是告訴電腦應(yīng)該如何去做。要編寫高效、可靠的軟件需要精通算法、最佳實踐等其他與變成相關(guān)的內(nèi)容。 編程前需要先了解你要解決的問題是什么。編程只是手段并不是目的。能實現(xiàn)并不代表需要實現(xiàn)。知道什么時候不需要編程或沒有必須要去編程。 ?
If you are in a hurry, stroll along slowly.?
If you really are in a hurry, make a detour.
如果你很忙,那就放慢速度。如果你真的很忙,那就先放一放。這聽起來很愚蠢,但是千萬不要讓自己陷入會導(dǎo)致后期問題的妥協(xié)。如果你正在編寫程序的核心部分,盡可能保證精確。如果你在編寫離核心代碼較遠的方法,可以盡可能的加快速度。? ?
Know your path, Neo.
? ? 知道你的實現(xiàn)路徑,你需要了解你每天使用的環(huán)境、工具及其他依賴的內(nèi)容,并且把它調(diào)試到適合自己的配置。如果你的編程環(huán)境真的很好,那么你編程中的基本不需要關(guān)心他。如果你需要完成一項任務(wù),最好的方式是不要引進“新的內(nèi)容”,只有當(dāng)你完全掌握“新的內(nèi)容”的時候再去考慮引入。
If it wasn’t tested, it is broken.
? 如果沒有經(jīng)過測試的代碼都是不能運行的。
與程序溝通時分辨原因和結(jié)果,與人交流時要分辨事實和觀點
? 相關(guān)的準則,包括:
最小化耦合關(guān)系:代碼片段(代碼塊,函數(shù),類等)應(yīng)該最小化它對其它代碼的依賴。這個目標(biāo)通過盡可能少的使用共享變量來實現(xiàn)。
最大化內(nèi)聚性:具有相似功能的代碼應(yīng)該放在同一個代碼組件里。
開放/封閉原則:程序里的實體項(類,模塊,函數(shù)等)應(yīng)該對擴展行為開放,對修改行為關(guān)閉。換句話說,不要寫允許別人修改的類,應(yīng)該寫能讓人們擴展的類。
單一職責(zé)原則:一個代碼組件(例如類或函數(shù))應(yīng)該只執(zhí)行單一的預(yù)設(shè)的任務(wù)。
隱藏實現(xiàn)細節(jié):隱藏實現(xiàn)細節(jié)能最小化你在修改程序組件時產(chǎn)生的對那些使用這個組件的其它程序模塊的影響。
笛米特法則(Law of Demeter)— 程序組件應(yīng)該只跟它的直系親屬有關(guān)系(例如繼承類,內(nèi)包含的對象,通過參數(shù)入口傳入的對象等。)
原文鏈接:What do you consider the 1st principle(s) of programming?
http://programmers.stackexchange.com/questions/91527/what-do-you-consider-the-1st-principles-of-programming 參考鏈接:Programming Principles
https://github.com/webpro/programming-principles
編輯:黃飛
評論