摘要:在開(kāi)發(fā)設(shè)計(jì)中有一些常用原則或者潛規(guī)則,根據(jù)筆者的經(jīng)驗(yàn),這里稍微總結(jié)一下最最常用的,以饗讀者。是處理復(fù)雜性的一個(gè)原則。參考六大設(shè)計(jì)原則里氏替換原則奧卡姆剃刀如有問(wèn)題可以通過(guò)郵件微信聯(lián)系我。
在開(kāi)發(fā)設(shè)計(jì)中有一些常用原則或者潛規(guī)則,根據(jù)筆者的經(jīng)驗(yàn),這里稍微總結(jié)一下最最常用的,以饗讀者。
DRY這里的DRY是Do Not Repeat Yourself的縮寫(xiě)。具體解釋參見(jiàn) ,嚴(yán)謹(jǐn)?shù)亩x是 Every piece of knowledge must have a single, unambiguous, authoritative representation within a system,意思是:任何一部分知識(shí)在系統(tǒng)中必須只有單一的,清晰并且權(quán)威的展示。???這是啥意思,沒(méi)懂。簡(jiǎn)單說(shuō)就是不要重復(fù)自己任何一部分的工作。比如說(shuō),有一段代碼是用于清除字條串中的HTML符號(hào),在多個(gè)程序中會(huì)用到此功能,如果每個(gè)地方都使用如下代碼
html = html.replaceAll("<.*?>","") html = html.replaceAll("?",""); html = html.replaceAll("&"."");
如果是只有2,3個(gè)地方用到(Martin曾經(jīng)提到過(guò)Rule of three,意思是一段代碼如果被copy3次以上就應(yīng)該重構(gòu)到一個(gè)多帶帶的子方法中),你可能就直接復(fù)制過(guò)來(lái)用,但是想想是2,3百個(gè)地方用到呢?如果上面需要再做個(gè)修改(如下),你是不是要去這個(gè)2,3百個(gè)地方去改代碼。
html = html.replaceAll("<"."<"); html = html.replaceAll(">".">");
所以這個(gè)DRY的規(guī)則就是推薦使用 子方法 的方式,這樣只需要修改一次即可. 與之類(lèi)似的編程思想有 DIE(Duplication is Evil),SPoT(Single Point of Truth), SSOT (Singel Source of Truth) 。 題外話,和DRY對(duì)應(yīng)的是WET,意思是 "write everything twice"(任何東西都寫(xiě)兩遍)或者"we enjoy typing" (我們就是喜歡打字編碼)。 :-)
KISSKISS 是 Keep it simple, stupid (或者Keep it short and simple )的簡(jiǎn)稱(chēng)。意思是在設(shè)計(jì)時(shí)保持簡(jiǎn)約,通俗。這個(gè)很像是現(xiàn)在推暢的“極簡(jiǎn)風(fēng)”。
使用KISS有什么好處呢?如下是其中的一些:
你可以更快的解決更多的問(wèn)題
你可以使用更少的代碼來(lái)解決復(fù)雜的問(wèn)題
你可以寫(xiě)出更高質(zhì)量的代碼
你可以創(chuàng)建更大的系統(tǒng),更好的去運(yùn)維
你的代碼將更加靈活,當(dāng)有新需求時(shí)可以更好的支持?jǐn)U展,修改或者重構(gòu)
等等
在軟件設(shè)計(jì)領(lǐng)域, 有一些技術(shù)具體實(shí)現(xiàn)這個(gè)精髓,比如 DDD (Domain Driven Design),TDD (Test Driven Develop),這個(gè)使代碼集中在真正需要的功能上,而不需要其他額外的。另外一個(gè)建議是 不要試圖通過(guò)注釋來(lái)提高代碼的可讀性,而應(yīng)該從代碼本身提高。比如如下是不太好的變量定義
// i is for "counter" and j means total sum int i, j;
而如下是好的設(shè)計(jì)
// more intuitive one int counter,sum;
與此相呼應(yīng)的是稱(chēng)作 奧卡姆剃刀 或者 簡(jiǎn)約之法則:
Occam"s razor
The simplest (explanation|solution) is usually the best one.
往往最簡(jiǎn)單的解決方案是最好的解決方案
具體到以Java為例的程序設(shè)計(jì),如下有一些實(shí)踐KISS的建議
首先,認(rèn)清自己,不要認(rèn)為自己是個(gè)天才,這往往是你犯的第一個(gè)錯(cuò)。
把你的工作打散成幾個(gè)子工作,每個(gè)部分不會(huì)耗費(fèi)超過(guò)4-12個(gè)小時(shí)去完成
把一個(gè)問(wèn)題分成幾個(gè)小的子問(wèn)題,每個(gè)問(wèn)題可以通過(guò)1個(gè)或者只要幾個(gè)類(lèi)就能解決。
保持每個(gè)方法只做一件事,并且不要超過(guò)30-40行的代碼量
保持每個(gè)類(lèi)的體積不要太大。
不要害怕扔掉不用的代碼。就像家里用不到的東西就及時(shí)扔掉一樣。
New Jersey style (Worse is better)新澤西風(fēng)格,也叫做“Worse is better”。此原則指出,系統(tǒng)的質(zhì)量不會(huì)因?yàn)樾鹿δ艿脑龆喽岣?/b>。 比如一個(gè)軟件,只提供一些功能,但是用戶(hù)很方便使用,有可能比一些提供了非常多令人眼花繚亂功能的“大雜燴”似的軟件。比如像 Linux下面的 vi/vim, 瀏覽器中的Chrome.
SOLIDSOLID是幾個(gè)編程哲學(xué)的總稱(chēng),即 SOLID (Single responsibility, Open-closed, Liskov substitution, Interface segregation and Dependency inversion) ,下面我們分別解釋一下:
Single responsibility (SRP)單一功能原則。Robert描述這個(gè)為“A class should have only one reason to change.”,即修改一個(gè)類(lèi)(或者模塊)有(且只能有)一個(gè)理由。簡(jiǎn)單說(shuō)就是 一個(gè)類(lèi)或者模塊只能負(fù)責(zé)一個(gè)功能。舉個(gè)例子,有一個(gè)模塊負(fù)責(zé)生成一個(gè)報(bào)表,可以想像可能有兩個(gè)理由去修改此模塊,第一,報(bào)表的內(nèi)容要變,第二,報(bào)表的格式要改。這兩個(gè)改動(dòng)是出于不同的理由,一個(gè)是內(nèi)容的一個(gè)美化版面的。 而 “單一職責(zé)” 規(guī)則認(rèn)為這是兩個(gè)不同的職責(zé),因此應(yīng)該分成兩個(gè)不同的子模塊。如果把兩件事情放在一起,并且不同的改動(dòng)是出于不同的原因,這種設(shè)計(jì)是不好的。此規(guī)則方便系統(tǒng)各模塊間解耦合。
Open/closed principle (OCP)開(kāi)閉原則。Bertrand描述為“"software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification";”,也就是說(shuō)對(duì)于一個(gè)實(shí)體(類(lèi),模塊,方法等)允許在不修改源代碼的前提下擴(kuò)展它的功能行為。即,你可以把 新代碼放到新的類(lèi)或者方法中,新類(lèi)通過(guò)繼承來(lái)重用已有代碼及功能。而 已有的代碼只有在修bug時(shí)才去修改。 此原則主要用于降低在添加新加功能時(shí)引入新的bug的風(fēng)險(xiǎn)。
The Liskov Substitution Principle (LSP)里氏替換原則. 原文是 “Derived classes must be substitutable for their base classes.”,意思是,派生類(lèi)(子類(lèi))對(duì)象能夠替換其基類(lèi)(超類(lèi))對(duì)象被使用。 比如說(shuō),如果 S 是T 的子類(lèi), 那么任何T類(lèi)的具體實(shí)現(xiàn)對(duì)象都可以替換S的實(shí)現(xiàn)對(duì)象出現(xiàn)的地方,具體的調(diào)用者也不知道具體是父類(lèi)還是子類(lèi),還不會(huì)出現(xiàn)任何錯(cuò)誤。比如下圖,調(diào)用者可以2來(lái)替換1的地方 。
Interface segregation principle (ISP)接口隔離。原文是 many client-specific interfaces are better than one general-purpose interface. 意思是多個(gè)特定客戶(hù)端接口要好于一個(gè)寬泛用途的接口。Make fine grained interfaces that are client specific. 應(yīng)該定義粒度合適的一系列接口(像下圖),以便于每個(gè)客戶(hù)去實(shí)現(xiàn)具體的功能請(qǐng)求。換句話說(shuō)是,客戶(hù)(client)不應(yīng)該必須去依賴(lài)于它用不到的功能方法。此原則的目的是系統(tǒng)解開(kāi)耦合,從而容易重構(gòu),更改和重新部署。
Dependency inversion principle (DIP)依賴(lài)反轉(zhuǎn)原則. 原文是 One should “Depend upon Abstractions. Do not depend upon concretions.” 意思是 一個(gè)方法應(yīng)該遵從“依賴(lài)于抽象而不是一個(gè)實(shí)例”。該原則規(guī)定:
高層次的模塊不應(yīng)該依賴(lài)于低層次的模塊,兩者都應(yīng)該依賴(lài)于抽象接口。
抽象接口不應(yīng)該依賴(lài)于具體實(shí)現(xiàn)。而具體實(shí)現(xiàn)則應(yīng)該依賴(lài)于抽象接口。
這個(gè)就像是設(shè)計(jì)模式中的Adaptor適配器模式。下圖解釋了這個(gè)原理。
圖1中,高層對(duì)象A依賴(lài)于底層對(duì)象B的實(shí)現(xiàn);圖2中,把高層對(duì)象A對(duì)底層對(duì)象的需求抽象為一個(gè)接口A,底層對(duì)象B實(shí)現(xiàn)了接口A,這就是依賴(lài)反轉(zhuǎn)。
SOCSeparation of concerns,?即關(guān)注點(diǎn)分離。 是處理復(fù)雜性的一個(gè)原則。由于關(guān)注點(diǎn)混雜在一起會(huì)導(dǎo)致復(fù)雜性大大增加,所以能夠把不同的關(guān)注點(diǎn)分離開(kāi)來(lái),分別處理就是處理復(fù)雜性的一個(gè)原則,一種方法。這個(gè)與SOLID中的 SRP很類(lèi)似。
YANGI是"You aren"t gonna need it"的縮寫(xiě),直譯是“你將來(lái)用不到它的”。這個(gè)是極限編程的一個(gè)編程思想。意思是說(shuō),永遠(yuǎn)不要因?yàn)?預(yù)計(jì)你會(huì)用到某個(gè)功能就去寫(xiě)一段代碼去實(shí)現(xiàn),總是只有問(wèn)題出現(xiàn)了,真的需要這個(gè)功能時(shí)才去寫(xiě)。
參考DRY
六大設(shè)計(jì)原則--里氏替換原則【Liskov Substitution Principle】
SOLID)
how to keep code simple
奧卡姆剃刀
Apache KISS
Worse is better
如有問(wèn)題可以通過(guò)郵件phray@163.com/微信helloworld_2000聯(lián)系我。謝謝。
原文位于: http://cloudsdocker.github.io...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/65122.html
摘要:何為設(shè)計(jì)設(shè)計(jì)哲學(xué)中講到的一些設(shè)計(jì)準(zhǔn)則設(shè)計(jì)準(zhǔn)則小即是美讓每個(gè)程序只做好一件事快速建立原型先滿足基本需求,再后續(xù)升級(jí)舍棄高效率而采取可移植性采用純文本來(lái)存儲(chǔ)數(shù)據(jù)可讀性好充分利用軟件的杠桿效應(yīng)軟件復(fù)用使用腳本來(lái)提高杠桿效應(yīng)和可移植性避免強(qiáng)制性的用 何為設(shè)計(jì) 《Unix/Linux設(shè)計(jì)哲學(xué)》中講到的一些設(shè)計(jì)準(zhǔn)則: 設(shè)計(jì)準(zhǔn)則 小即是美 讓每個(gè)程序只做好一件事 快速建立原型(先滿足基本需求,再后...
摘要:開(kāi)篇金幣積分商城下稱(chēng)商城是眾多內(nèi)的一個(gè)產(chǎn)品,隨著使用的用戶(hù)越來(lái)越多,商城對(duì)于用戶(hù)留存的提升,扮演著重要的角色做為提高用戶(hù)黏性的核心產(chǎn)品,在擁有很好用戶(hù)體驗(yàn)的同時(shí),也必須存在著一個(gè)高效穩(wěn)定的系統(tǒng)。分析上述兩點(diǎn),得到結(jié)論按用戶(hù)進(jìn)行分庫(kù)分表。 開(kāi)篇 金幣(積分)商城(下稱(chēng)商城)是眾多App內(nèi)的一個(gè)產(chǎn)品,隨著App使用的用戶(hù)越來(lái)越多,商城對(duì)于用戶(hù)留存的提升,扮演著重要的角色;做為提高用戶(hù)黏性的...
摘要:何為設(shè)計(jì)即按照一種思路或者標(biāo)準(zhǔn)來(lái)實(shí)現(xiàn)功能結(jié)合設(shè)計(jì)哲學(xué)小即是美讓每個(gè)程序只做好一件事快速建立原型舍棄高效率而取可移植性采用純文本來(lái)存儲(chǔ)數(shù)據(jù)充分利用軟件的杠桿效應(yīng)復(fù)用,抽象使用腳本來(lái)提高杠桿效應(yīng)和可移植性避免強(qiáng)制性的用戶(hù)界面允許用戶(hù)定制環(huán)境盡量 何為設(shè)計(jì) 即按照一種思路或者標(biāo)準(zhǔn)來(lái)實(shí)現(xiàn)功能 結(jié)合《UNIX/LINUX設(shè)計(jì)哲學(xué) 小即是美 讓每個(gè)程序只做好一件事 快速建立原型 舍棄高效率而取可...
摘要:事件系統(tǒng)合成事件的綁定方式合成事件的實(shí)現(xiàn)機(jī)制事件委派和自動(dòng)綁定。高階組件如果已經(jīng)理解高階函數(shù),那么理解高階組件也很容易的。例如我們常見(jiàn)的方法等都是高階函數(shù)。對(duì)測(cè)試群眾來(lái)說(shuō),從質(zhì)量保證的角度出發(fā),單元測(cè)試覆蓋率是 事件系統(tǒng) 合成事件的綁定方式 `Test` 合成事件的實(shí)現(xiàn)機(jī)制:事件委派和自動(dòng)綁定。 React合成事件系統(tǒng)的委托機(jī)制,在合成事件內(nèi)部?jī)H僅是對(duì)最外層的容器進(jìn)行了綁定,并且依賴(lài)...
摘要:原型鏈只看構(gòu)造函數(shù)的原型對(duì)象和實(shí)例化出來(lái)的對(duì)象。既然構(gòu)造函數(shù)本身是函數(shù),那么和直接調(diào)用有什么區(qū)別答案揭曉只有通過(guò)調(diào)用構(gòu)造函數(shù)才會(huì)走第二步,也就是原型的委托操作。 原型 相信js開(kāi)發(fā)者都知道原型,原型鏈,但是很多人暈暈乎乎對(duì)此不知甚解。下面分享一下我的個(gè)人心得。 學(xué)習(xí)中的困惑 構(gòu)造函數(shù),原型,實(shí)例對(duì)象之間的關(guān)系是什么? 原型鏈?zhǔn)窃趺蠢^承的? 既然構(gòu)造函數(shù)本身是函數(shù),那么new和直接調(diào)用...
閱讀 2216·2021-10-08 10:15
閱讀 1260·2019-08-30 15:52
閱讀 583·2019-08-30 12:54
閱讀 1606·2019-08-29 15:10
閱讀 2747·2019-08-29 12:44
閱讀 3067·2019-08-29 12:28
閱讀 3417·2019-08-27 10:57
閱讀 2286·2019-08-26 12:24