欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP 雜談《重構(gòu)-改善既有代碼的設(shè)計(jì)》之五 簡化函數(shù)調(diào)用

 更新時間:2012年05月07日 21:57:50   作者:  
前幾篇系列文章,我比較關(guān)注的是 PHP 雜談《重構(gòu)-改善既有代碼的設(shè)計(jì)》之一 重新組織你的函數(shù) 但是我覺得我還是沒有說清楚,我自己也有很多不理解的地方,而且這篇是我的第一篇這方面的文章,有很多的紕漏,所以我會經(jīng)常性的去做修改,如果大家有好的意見不妨告知一、二
思維導(dǎo)圖


介紹

  前幾篇系列文章,我比較關(guān)注的是<PHP 雜談《重構(gòu)-改善既有代碼的設(shè)計(jì)》之一 重新組織你的函數(shù)>,但是我覺得我還是沒有說清楚,我自己也有很多不理解的地方,而且這篇是我的第一篇這方面的文章,有很多的紕漏,所以我會經(jīng)常性的去做修改,如果大家有好的意見不妨告知一、二。

  今天談得是“接口”,此接口非“Interface”,而是一個統(tǒng)稱。我們一般可以把供別人使用的函數(shù)或者url(一般是用于提供數(shù)據(jù))叫接口?!赡苓€有別的意思,畢竟我現(xiàn)在還屬于“菜鳥”,如果有理解上的錯誤,請指正。

  我們知道“容易被理解和被使用的接口”,是開發(fā)良好面向?qū)ο筌浖年P(guān)鍵?!疚膶⒔榻B“使接口變得更簡潔易用”的重構(gòu)手法。

題外話:
  如果大家覺得我這篇文章太長,看起來麻煩的話,建議大家”就看圖片和粗體的文字“。
  昨天,“old“博友給我留言,我以前也沒仔細(xì)考慮過,這次我也想了想。留言內(nèi)容是:

我個人覺得,很多事情只有我們?nèi)リP(guān)注過,才能知道它的價值。
  至于簡單,重構(gòu)的目地也是為了簡單和易理解性。
  至于執(zhí)著,我覺得在技術(shù)上,我們很多時候需要這種執(zhí)著,即使你過后覺得你錯了,但是我們在這之間還是會有所收獲。我們只有經(jīng)歷過很多次的磨合(這種磨合有正確的也有錯誤的),我們才能知道它的價值,我們才能收獲到我們需要的東西。
  至于利益,”O(jiān)ld“是不是指公司利益,恩,確實(shí)是,很多時候我們在編碼的過程中,需要趕進(jìn)度,還有我們在重構(gòu)中也會有一些錯誤出來,所以我的建議是,在開發(fā)之初,你就要在設(shè)計(jì)和重構(gòu)中,不斷進(jìn)行磨合,不要覺得浪費(fèi)時間,很多時候,好的結(jié)構(gòu)能加速你的開發(fā)。

專業(yè)術(shù)語
 

 

 

 

 

 

 

Rename Method

狀況:如果函數(shù)的名稱未能揭示函數(shù)的用途,那么修改函數(shù)名稱。

動機(jī):
  我極力提倡的一種編程風(fēng)格就是將復(fù)雜的處理過程分解成小函數(shù)。但是如果小函數(shù)的命名不好,這會使你費(fèi)勁周折卻弄不清楚這些小函數(shù)各自的用途。

  給函數(shù)命名的一個好辦法:考慮應(yīng)該給這個函數(shù)寫上一句怎樣的注釋 -——> 想辦法將注釋變成函數(shù)的名稱。

  起一個好名稱并不容易,需要經(jīng)驗(yàn)?!氤蔀橐粋€真正的編程高手,“起名稱”的水平至關(guān)重要。

  如果你看到一個函數(shù)名稱不能很好的表達(dá)它的用途,應(yīng)該馬上加以修改。

Example:

 

 

 

Add Parameter

狀況:某個函數(shù)需要從調(diào)用端得到更多的信息,那么為此函數(shù)添加一個參數(shù),讓該參數(shù)帶進(jìn)函數(shù)所需信息。

動機(jī):
  1、Add Parameter 是一個很常用的重構(gòu)手法。
  2、修改過的函數(shù)需要一些過去沒有的信息,因此你需要給函數(shù)添加一個參數(shù)。
  3、除了Add Parameter外,只要有可能,其他選擇都比“Add Parameter”要好,因?yàn)橛锌赡芷渌x擇不會增加參數(shù)列的長度?!^長的參數(shù)列會使程序員記不住那么多參數(shù)。

Remove Parameter

狀況:函數(shù)本體不再需要某個參數(shù),那么將該參數(shù)去除。
動機(jī):
  1、參數(shù)指出函數(shù)信息,不同參數(shù)代表不同意義。函數(shù)調(diào)用這必須為每一個參數(shù)操心該傳什么東西進(jìn)去?!绻蝗サ魠?shù),那就為每一次調(diào)用多費(fèi)一份心。
  2、如果你發(fā)現(xiàn)有很多調(diào)用者,那么為了不讓調(diào)用者操心,你可以這樣做,把要移除的參數(shù)設(shè)置為某個默認(rèn)值(如null),這樣調(diào)用者只傳那些沒有默認(rèn)值的參數(shù)。

Separate Query from Modifier
 
狀況:如果某個函數(shù)既返回對象的狀態(tài)值,又修改(副作用)對象狀態(tài)(state),那么建立兩個不同的函數(shù),其中一個負(fù)責(zé)查詢,另一個負(fù)責(zé)修改。

 

 Example:

 
 Parameterize Method
 
狀況:如果若干函數(shù)做了類似的工作,但在函數(shù)本體中包含了不同的值,那么建立單一函數(shù),以參數(shù)表達(dá)那些不同的值。
動機(jī):
  1、一般是因?yàn)橛猩贁?shù)幾個值不同,所以建立了幾個相似的函數(shù)。
  2、分離的函數(shù)替換為一個統(tǒng)一的函數(shù),通過參數(shù)來處理那些變化情況,以簡化問題。
  3、去除重復(fù)的代碼,提高靈活性?!梢允褂眠@個參數(shù)處理其他變化情況。

 
Example:

 
 Replace Parameter with Explicit Methods
 
狀況:你有一個函數(shù),其內(nèi)完全取決于參數(shù)值而采取不同的反應(yīng),那么針對該參數(shù)的每個值,建立一個獨(dú)立的函數(shù)。
動機(jī):
  1、如果某個參數(shù)有離散值,而函數(shù)內(nèi)又以條件式檢查這些參數(shù)值,并根據(jù)不同的參數(shù)值做出不同的反應(yīng),那么就應(yīng)該使用本次重構(gòu)。
  2、可以獲得好處:“編譯期代碼檢查”,“接口更清楚”(如果用參數(shù)值決定函數(shù)行為,那么函數(shù)用戶不但需要觀察該函數(shù),而且還要判斷參數(shù)是否“合法化”。——而合法的參數(shù),很少在文檔中提到,必須通過上下文,才能判斷)
  3、不考慮“編譯期檢驗(yàn)”的好處,為了獲取一個清晰的接口,我們也值得這么做。

 

Example:

 

 
 Preserve Whole Object
 
狀況:如果你從某個對象中取出若干值,將它們作為某一次函數(shù)調(diào)用中的參數(shù),那么改使用(傳遞)整個對象。
 動機(jī):
  1、參數(shù)列更穩(wěn)固;
  2、提高代碼的可讀性;——過長的參數(shù)列很難使用,因?yàn)檎{(diào)用者和被調(diào)用者都必須記住這些參數(shù)的用途。

Example:

 
 Replace Parameter with Methods
 
狀況:如果對象調(diào)用某個函數(shù),并將所得結(jié)果做為參數(shù),傳遞給另一個函數(shù)(接受參數(shù)的函數(shù)也有調(diào)用前一個函數(shù)的能力),那么讓參數(shù)接受者去除該項(xiàng)參數(shù),并直接調(diào)用前一個函數(shù)。
 
動機(jī):
  1、如果函數(shù)通過其他途徑獲得參數(shù)值,那么它就不應(yīng)該通過參數(shù)取得該值。
  2、過長的參數(shù)列會增加程序閱讀者的理解難度,因此我們應(yīng)該盡可能的縮短參數(shù)列的長度。
  3、方法:看看“參數(shù)接受端”是否可以通過“與調(diào)用端相同的計(jì)算”來取得參數(shù)攜帶值。
  4、如果函數(shù)調(diào)用端通過對象內(nèi)部的另一個函數(shù)來計(jì)算參數(shù),并在計(jì)算過程中“未曾引用調(diào)用端的其他參數(shù)”,那么就可以將這個計(jì)算過程轉(zhuǎn)移到被調(diào)用端內(nèi),從而去除該項(xiàng)參數(shù)。
 
Example:

 
 Introduce Parameter Object
 
狀況:某些參數(shù)總是很自然地同時出現(xiàn),那么以一個對象取代這些參數(shù)
 
動機(jī):


  1、一組參數(shù)可能有幾個函數(shù)同時使用,這些函數(shù)可能隸屬于同一個class,也可能隸屬于不同的classes?!@樣的一組參數(shù)就是所謂的Data Clump(數(shù)據(jù)泥團(tuán))。
  2、我們可以運(yùn)用一個對象包裝所有這些數(shù)據(jù),再以對象取代Data Clump?!康兀耗呐轮皇菫榱税堰@些數(shù)據(jù)組織在一起,這樣做也是值得的。
  3、本項(xiàng)重構(gòu)的價值在于“縮短了參數(shù)列的長度”。此外,新對象所定義的訪問函數(shù)(accessors)還可以使代碼更具一致性。——這又進(jìn)一步降低了代碼的理解難度和修改難度。
  4、本項(xiàng)重構(gòu)還可以帶給你更多好處?!?dāng)你把這些參數(shù)組織到一起之后,往往很快可以發(fā)現(xiàn)“可被移植新建class“的行為?!獪p少重復(fù)代碼。
 
Example:
 

 
 Remove Setting Method
 
狀況:你的class中的某個值域,應(yīng)該在對象初創(chuàng)時被設(shè)置,然后就不再改變,那么去掉該值域的所有設(shè)置函數(shù)(setter)。

動機(jī):
  1、如果你為某個值域提供了設(shè)置函數(shù)(setter),這就暗示了這個值域可以被改變。
  2、如果你不希望在對象初創(chuàng)之后,此值域還有機(jī)會改變,那就不要為它提供設(shè)置函數(shù)。——這樣你的意圖會更加清晰,并且可以排除其值被修改的可能性。
Example:

 
 Hide Method
 
狀況:如有有一個函數(shù),從來沒有被其他class用到,那么將這個函數(shù)設(shè)置為private。
 
動機(jī):


  1、重構(gòu)往往促使你修改“函數(shù)的可見度“。——時刻檢查可被隱藏的函數(shù)。
    2、經(jīng)常檢查有沒有可能降低某個函數(shù)的可見度(使它私有化)。
    ——>當(dāng)你在另一個class中移除對某個函數(shù)的調(diào)用時,就應(yīng)該檢查。
    ——>特別對setter函數(shù)進(jìn)行上述的檢查。
 
  
 Replace Constructor with Factory Method
 
狀況:如果你希望在創(chuàng)建對象時不僅僅是對它做簡單的構(gòu)件動作,那么將__construct(構(gòu)造函數(shù))替換為factory method。
動機(jī):
  在subclass過程中以factory method取代type code?!憧赡艹3P枰猼ype code創(chuàng)建相應(yīng)的對象。
 Example:

            

            

接著來:

 

 
 Replace Error Code with Exception
 
狀況:如果某個函數(shù)返回一個特定的代碼(special code),用以表示某種錯誤情況,那么改用異常(Exception)。
 
動機(jī):
  清楚的將”普通程序“和”錯誤處理“分開,這使的程序更容易”理解“。

Example:

 
 conclusion
 
把我每一次的收獲與大家分享,如果大家有那么一丁點(diǎn)的收獲,也讓我高興不已。還有如在文章中有錯誤,望請指點(diǎn)一、二。
 
我不知道是不是找錯地方了,有博友留言說“博客園里主要盛行C#”,看得人是不是主要以PHP程序員為主?還有很少有人給我留言,也很少有人指出我文章中的錯誤(難道我的文章中真的沒有錯誤嗎?),昨天”@四眼蒙面?zhèn)b“給我留了言,我在與他的交談中收獲甚多,也感謝的他的批評指正,也希望能跟大家多交流。

相關(guān)文章

  • PHP5.5安裝PHPRedis擴(kuò)展及連接測試方法

    PHP5.5安裝PHPRedis擴(kuò)展及連接測試方法

    這篇文章主要介紹了PHP5.5安裝PHPRedis擴(kuò)展及連接測試方法,較為詳細(xì)的介紹了針對php5.5安裝PHPRedis擴(kuò)展的具體步驟與相關(guān)操作技巧,并給出了安裝后的連接測試示例,需要的朋友可以參考下
    2017-01-01
  • php生成shtml類用法實(shí)例

    php生成shtml類用法實(shí)例

    這篇文章主要介紹了php生成shtml類用法,較為詳細(xì)的講述了生成shtml的類文件以及與之對應(yīng)的用法實(shí)例,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • PHP高級編程實(shí)例:編寫守護(hù)進(jìn)程

    PHP高級編程實(shí)例:編寫守護(hù)進(jìn)程

    這篇文章主要介紹了PHP高級編程實(shí)例:編寫守護(hù)進(jìn)程,守護(hù)進(jìn)程是脫離于終端并且在后臺運(yùn)行的進(jìn)程,本文講解使用PHP編寫守護(hù)進(jìn)程,并給出了代碼實(shí)例,需要的朋友可以參考下
    2014-09-09
  • 關(guān)于PHP開發(fā)的9條建議

    關(guān)于PHP開發(fā)的9條建議

    這篇文章主要介紹了關(guān)于PHP開發(fā)的9條建議,都是個人的一些經(jīng)驗(yàn)總結(jié),有需要的小伙伴可以參考下。
    2015-07-07
  • php+ajax實(shí)現(xiàn)無刷新分頁

    php+ajax實(shí)現(xiàn)無刷新分頁

    這篇文章主要介紹了php+ajax實(shí)現(xiàn)無刷新分頁的方法,詳細(xì)講述了Ajax文件的實(shí)現(xiàn)及PHP調(diào)用方法,需要的朋友可以參考下
    2015-11-11
  • php利用ffmpeg提取視頻中音頻與視頻畫面的方法詳解

    php利用ffmpeg提取視頻中音頻與視頻畫面的方法詳解

    想要提取視頻中的音頻信息,首選的技術(shù)是ffmpeg,ffmpeg是一個非常有用的命令行程序,它可以用來轉(zhuǎn)碼媒體文件。這篇文章主要給大家介紹了PHP利用ffmpeg提取視頻中音頻與視頻畫面的相關(guān)資料,需要的朋友可以參考下。
    2017-06-06
  • php7中停止php-fpm服務(wù)的方法詳解

    php7中停止php-fpm服務(wù)的方法詳解

    這篇文章主要給大家介紹了關(guān)于php7中如何停止php-fpm服務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Yii2使用駝峰命名的形式訪問控制器(實(shí)例講解)

    Yii2使用駝峰命名的形式訪問控制器(實(shí)例講解)

    下面小編就為大家?guī)硪黄猋ii2使用駝峰命名的形式訪問控制器(實(shí)例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • PHP封裝PDO實(shí)現(xiàn)操作MySql數(shù)據(jù)庫

    PHP封裝PDO實(shí)現(xiàn)操作MySql數(shù)據(jù)庫

    數(shù)據(jù)庫操作類可以封裝數(shù)據(jù)庫連接和操作,使代碼更易于維護(hù)和擴(kuò)展,這篇文章主要為大家詳細(xì)介紹了PHP如何封裝操作類PDO從而實(shí)現(xiàn)操作MySql數(shù)據(jù)庫的功能,需要的可以了解下
    2023-10-10
  • php輕松實(shí)現(xiàn)文件上傳功能

    php輕松實(shí)現(xiàn)文件上傳功能

    這篇文章主要介紹了php輕松實(shí)現(xiàn)文件上傳功能的全部代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-03-03

最新評論