|

介紹
前幾篇系列文章,我比較關(guān)注的是<php 雜談《重構(gòu)-改善既有代碼的設(shè)計(jì)》之一 重新組織你的函數(shù)>,但是我覺得我還是沒有說清楚,我自己也有很多不理解的地方,而且這篇是我的第一篇這方面的文章,有很多的紕漏,所以我會(huì)經(jīng)常性的去做修改,如果大家有好的意見不妨告知一、二。
今天談得是“接口”,此接口非“Interface”,而是一個(gè)統(tǒng)稱。我們一般可以把供別人使用的函數(shù)或者url(一般是用于提供數(shù)據(jù))叫接口。――可能還有別的意思,畢竟我現(xiàn)在還屬于“菜鳥”,如果有理解上的錯(cuò)誤,請(qǐng)指正。
我們知道“容易被理解和被使用的接口”,是開發(fā)良好面向?qū)ο筌浖年P(guān)鍵。――本文將介紹“使接口變得更簡(jiǎn)潔易用”的重構(gòu)手法。
題外話:
如果大家覺得我這篇文章太長(zhǎng),看起來麻煩的話,建議大家”就看圖片和粗體的文字“。
昨天,“old“博友給我留言,我以前也沒仔細(xì)考慮過,這次我也想了想。留言內(nèi)容是:
至于簡(jiǎn)單,重構(gòu)的目地也是為了簡(jiǎn)單和易理解性。
至于執(zhí)著,我覺得在技術(shù)上,我們很多時(shí)候需要這種執(zhí)著,即使你過后覺得你錯(cuò)了,但是我們?cè)谶@之間還是會(huì)有所收獲。我們只有經(jīng)歷過很多次的磨合(這種磨合有正確的也有錯(cuò)誤的),我們才能知道它的價(jià)值,我們才能收獲到我們需要的東西。
至于利益,”O(jiān)ld“是不是指公司利益,恩,確實(shí)是,很多時(shí)候我們?cè)诰幋a的過程中,需要趕進(jìn)度,還有我們?cè)谥貥?gòu)中也會(huì)有一些錯(cuò)誤出來,所以我的建議是,在開發(fā)之初,你就要在設(shè)計(jì)和重構(gòu)中,不斷進(jìn)行磨合,不要覺得浪費(fèi)時(shí)間,很多時(shí)候,好的結(jié)構(gòu)能加速你的開發(fā)。
專業(yè)術(shù)語
狀況:如果函數(shù)的名稱未能揭示函數(shù)的用途,那么修改函數(shù)名稱。
我極力提倡的一種編程風(fēng)格就是將復(fù)雜的處理過程分解成小函數(shù)。但是如果小函數(shù)的命名不好,這會(huì)使你費(fèi)勁周折卻弄不清楚這些小函數(shù)各自的用途。
給函數(shù)命名的一個(gè)好辦法:考慮應(yīng)該給這個(gè)函數(shù)寫上一句怎樣的注釋 -――> 想辦法將注釋變成函數(shù)的名稱。
起一個(gè)好名稱并不容易,需要經(jīng)驗(yàn)。――要想成為一個(gè)真正的編程高手,“起名稱”的水平至關(guān)重要。
如果你看到一個(gè)函數(shù)名稱不能很好的表達(dá)它的用途,應(yīng)該馬上加以修改。
Example:
狀況:某個(gè)函數(shù)需要從調(diào)用端得到更多的信息,那么為此函數(shù)添加一個(gè)參數(shù),讓該參數(shù)帶進(jìn)函數(shù)所需信息。
動(dòng)機(jī):
1、Add Parameter 是一個(gè)很常用的重構(gòu)手法。
2、修改過的函數(shù)需要一些過去沒有的信息,因此你需要給函數(shù)添加一個(gè)參數(shù)。
3、除了Add Parameter外,只要有可能,其他選擇都比“Add Parameter”要好,因?yàn)橛锌赡芷渌x擇不會(huì)增加參數(shù)列的長(zhǎng)度。――過長(zhǎng)的參數(shù)列會(huì)使程序員記不住那么多參數(shù)。
狀況:函數(shù)本體不再需要某個(gè)參數(shù),那么將該參數(shù)去除。
動(dòng)機(jī):
1、參數(shù)指出函數(shù)信息,不同參數(shù)代表不同意義。函數(shù)調(diào)用這必須為每一個(gè)參數(shù)操心該傳什么東西進(jìn)去。――如果不去掉參數(shù),那就為每一次調(diào)用多費(fèi)一份心。
2、如果你發(fā)現(xiàn)有很多調(diào)用者,那么為了不讓調(diào)用者操心,你可以這樣做,把要移除的參數(shù)設(shè)置為某個(gè)默認(rèn)值(如null),這樣調(diào)用者只傳那些沒有默認(rèn)值的參數(shù)。
Example:
Example:
Preserve Whole Object 狀況:如果你從某個(gè)對(duì)象中取出若干值,將它們作為某一次函數(shù)調(diào)用中的參數(shù),那么改使用(傳遞)整個(gè)對(duì)象。 動(dòng)機(jī): 1、參數(shù)列更穩(wěn)固; 2、提高代碼的可讀性;――過長(zhǎng)的參數(shù)列很難使用,因?yàn)檎{(diào)用者和被調(diào)用者都必須記住這些參數(shù)的用途。
1、一組參數(shù)可能有幾個(gè)函數(shù)同時(shí)使用,這些函數(shù)可能隸屬于同一個(gè)class,也可能隸屬于不同的classes。――這樣的一組參數(shù)就是所謂的Data Clump(數(shù)據(jù)泥團(tuán))。 2、我們可以運(yùn)用一個(gè)對(duì)象包裝所有這些數(shù)據(jù),再以對(duì)象取代Data Clump。――目地:哪怕只是為了把這些數(shù)據(jù)組織在一起,這樣做也是值得的。 3、本項(xiàng)重構(gòu)的價(jià)值在于“縮短了參數(shù)列的長(zhǎng)度”。此外,新對(duì)象所定義的訪問函數(shù)(accessors)還可以使代碼更具一致性。――這又進(jìn)一步降低了代碼的理解難度和修改難度。 4、本項(xiàng)重構(gòu)還可以帶給你更多好處。――當(dāng)你把這些參數(shù)組織到一起之后,往往很快可以發(fā)現(xiàn)“可被移植新建class“的行為。――減少重復(fù)代碼。 Example:
1、重構(gòu)往往促使你修改“函數(shù)的可見度“。――時(shí)刻檢查可被隱藏的函數(shù)。 2、經(jīng)常檢查有沒有可能降低某個(gè)函數(shù)的可見度(使它私有化)。 ――>當(dāng)你在另一個(gè)class中移除對(duì)某個(gè)函數(shù)的調(diào)用時(shí),就應(yīng)該檢查。 ――>特別對(duì)setter函數(shù)進(jìn)行上述的檢查。 Replace Constructor with Factory Method 狀況:如果你希望在創(chuàng)建對(duì)象時(shí)不僅僅是對(duì)它做簡(jiǎn)單的構(gòu)件動(dòng)作,那么將__construct(構(gòu)造函數(shù))替換為factory method。
動(dòng)機(jī):
在subclass過程中以factory method取代type code。――你可能常常需要type code創(chuàng)建相應(yīng)的對(duì)象。
Example:
接著來:
php技術(shù):PHP 雜談《重構(gòu)-改善既有代碼的設(shè)計(jì)》之五 簡(jiǎn)化函數(shù)調(diào)用,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。