最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php設(shè)計(jì)模式介紹之編程慣用法第2/3頁(yè)

 更新時(shí)間:2008年04月13日 22:07:20   作者:  
《PHP設(shè)計(jì)模式介紹》第一章 編程慣用法 學(xué)習(xí)一門(mén)新的語(yǔ)言意味著要采用新的慣用法。這章將介紹或者可能重新強(qiáng)調(diào)一些慣用法。你會(huì)發(fā)現(xiàn)這些慣用法在你要在代碼中實(shí)現(xiàn)設(shè)計(jì)模式時(shí)候是非常有用的。

重構(gòu)

即使最有思想性且最熟練的程序員也不能預(yù)見(jiàn)一個(gè)軟件項(xiàng)目中的任何細(xì)微之處。問(wèn)題總是出乎意外的出現(xiàn),需求也可能在變化,結(jié)果是代碼被優(yōu)化,共享然后代替。

重構(gòu)是一個(gè)慣用的方法:檢查你所有的代碼,找出其中能統(tǒng)一化和簡(jiǎn)單化的共同或者類(lèi)似之處,使得你的代碼更加容易維護(hù)和擴(kuò)展。重構(gòu)也包括探索一個(gè)設(shè)計(jì)模式是否能夠應(yīng)用到這個(gè)具體的問(wèn)題上——這也能使解決方案簡(jiǎn)單化。

重構(gòu),簡(jiǎn)單點(diǎn)說(shuō)是重命名一個(gè)屬性或者方法,復(fù)雜點(diǎn)說(shuō)是壓縮一個(gè)已有的類(lèi)。改變你的代碼使得它符合一個(gè)或者更多的設(shè)計(jì)模式是另外一種重構(gòu)——讀完這本書(shū)后,你可能會(huì)去實(shí)現(xiàn)的。

沒(méi)有什么能比例子來(lái)更好的解釋重構(gòu)了!

讓我們考慮兩個(gè)簡(jiǎn)單的類(lèi):CartLine和Cart。CartLine記錄了購(gòu)物車(chē)?yán)锩婷總€(gè)項(xiàng)目的單件價(jià)格和數(shù)量。比如CartLine可能記錄著“四見(jiàn)紅色的polo襯衣,每件19.99$”。Cart 是一個(gè)容器,用來(lái)裝載一個(gè)或者更多的CartLine對(duì)象并執(zhí)行一些相關(guān)的計(jì)算工作,比如購(gòu)物車(chē)?yán)锩娴乃猩唐返目偦ㄙM(fèi)。

下面是CartLine和Cart的簡(jiǎn)單實(shí)現(xiàn):

// PHP5
class CartLine {
public $price = 0;
public $qty = 0;
}
class Cart {
protected $lines = array();
public function addLine($line) {
$this->lines[] = $line;
}
public function calcTotal() {
$total = 0;
// add totals for each line
foreach($this->lines as $line) {
$total += $line->price * $line->qty;
}
// add sales tax
$total *= 1.07;
return $total;
}
}
重構(gòu)的第一步必須有足夠的測(cè)試來(lái)覆蓋你所有的代碼。這樣才能保證你修改的代碼不能產(chǎn)生和你原來(lái)代碼不同的結(jié)果。順便提一下,除非你改變了需求(你代碼期望的結(jié)果)或者在測(cè)試實(shí)例中發(fā)現(xiàn)了錯(cuò)誤,你的測(cè)試代碼是是不能改變的。

下面是一個(gè)測(cè)試CartLine和Cart的例子,它在重構(gòu)的過(guò)程中是不會(huì)改變的。

function TestCart() {
$line1 = new CartLine;
$line1->price = 12; $line1->qty = 2;
$line2 = new CartLine;
$line2->price = 7.5; $line2->qty = 3;
$line3 = new CartLine;
$line3->price = 8.25; $line3->qty = 1;
$cart = new Cart;
$cart->addLine($line1);
$cart->addLine($line2);
$cart->addLine($line3);
$this->assertEqual(
(12*2 + 7.5*3 + 8.25) * 1.07,
$cart->calcTotal());
}
看著上面的代碼,你可能會(huì)發(fā)現(xiàn)它們有一些“code smells”(代碼臭味)——有著古怪的樣子而且看起來(lái)好像是有問(wèn)題的代碼——它們就像重構(gòu)的候選項(xiàng)。(更多關(guān)于code smells的資料請(qǐng)看http://c2.com/cgi/wiki?codesmell)。兩個(gè)最直接的重構(gòu)候選者是注釋和計(jì)算(與銷(xiāo)售稅等相關(guān)的計(jì)算)。重構(gòu)的一種形式:析取函數(shù)(Extract Method)將把這些難看的代碼從cart::calcTotal()中提取出來(lái),然后用一個(gè)合適的方法來(lái)替代它,從而使得代碼更加簡(jiǎn)潔。

比如,你可以增加兩個(gè)計(jì)算方法:lineTotal()和calcSalesTax():

protected function lineTotal($line) {
return $line->price * $line->qty;
}
protected function calcSalesTax($amount) {
return $amount * 0.07;
}
現(xiàn)在你可以重寫(xiě)calcTotal()函數(shù):

public function calcTotal() {
$total = 0;
foreach($this->lines as $line) {
$total += $this->lineTotal($line);
}
$total += $this->calcSalesTax($total);
return $total;
}
到目前為止的改動(dòng)都是有意義的(至少在這個(gè)例子的上下文中),它對(duì)于再次暫停和運(yùn)行這些代碼來(lái)驗(yàn)證結(jié)果依然正確是很有幫助的。記得,一個(gè)綠色的成功條的顯示出來(lái)了?。ㄗg者注:本章開(kāi)始時(shí),作者提及到:綠色的條意味著測(cè)試都通過(guò)了。)

然而,目前的代碼依然有一些可以挑剔的地方。其中一個(gè)就是在新方法lineTotal()中存取公共屬性。很明顯計(jì)算每行的之和的責(zé)任不應(yīng)該屬于Cart類(lèi),而應(yīng)該在類(lèi)CartLine里面實(shí)現(xiàn)。

再次重構(gòu),在CartLine中增加一個(gè)新的方法total()用來(lái)計(jì)算訂單里面的每個(gè)項(xiàng)目的長(zhǎng)期價(jià)錢(qián)。

public function total() {
return $this->price * $this->qty;
}
然后從類(lèi)Cart中移除方法lineTotal(),并改變calcTotal()方法來(lái)使用新的cartLine::Total()方法。重新運(yùn)行這個(gè)測(cè)試,你依然會(huì)發(fā)現(xiàn)結(jié)果是綠色條。

全新重構(gòu)后的代碼就是這樣:

class CartLine {
public $price = 0;
public $qty = 0;
public function total() {
return $this->price * $this->qty;
}
}
class Cart {
protected $lines = array();
public function addLine($line) {
$this->lines[] = $line;
}
public function calcTotal() {
$total = 0;
foreach($this->lines as $line) {
$total += $line->total();
}
$total += $this->calcSalesTax($total);
return $total;
}
protected function calcSalesTax($amount) {
return $amount * 0.07;
}
}
現(xiàn)在這代碼不再需要每行注釋了,因?yàn)榇a本身更好的說(shuō)明了每行的功能。這些新的方法,更好的封裝了計(jì)算這個(gè)功能,也更加容易適應(yīng)將來(lái)的變化。(比如說(shuō),考慮不同大的銷(xiāo)售稅率)。另外,這些類(lèi)也更加平衡,更容易維護(hù)。

這個(gè)例子顯然是微不足道的,但是希望你能從中推斷并預(yù)想出如何重構(gòu)你自己的代碼。

在編碼的時(shí)候,你應(yīng)該有出于兩種模式中的一種:增加新的特征或者重構(gòu)代碼。當(dāng)在增加特征的時(shí)候,你要寫(xiě)測(cè)試和增加代碼。在重構(gòu)的時(shí)候,你要改變你原有的代碼,并確保所有相關(guān)的測(cè)試依然能正確運(yùn)行。

關(guān)于重構(gòu)的主要參考資料有Martin Fowler著作的《重構(gòu):改進(jìn)原有代碼的設(shè)計(jì)》(Refactoring:Improving the Design of Existing Code)。用一些精簡(jiǎn)點(diǎn)來(lái)總結(jié)Fowler的書(shū),重構(gòu)的步驟如下所示:

定義需要重構(gòu)的代碼
有覆蓋所有代碼的測(cè)試
小步驟的工作
每步之后都運(yùn)行你的測(cè)試。編碼和測(cè)試都是相當(dāng)重復(fù)的——和編譯型語(yǔ)言相比,解釋型語(yǔ)言,比如PHP是容易很多的。
使用重構(gòu)來(lái)使你的代碼有更好的可讀性和可修改性。

相關(guān)文章

  • PHP中的Session對(duì)象如何使用

    PHP中的Session對(duì)象如何使用

    本文詳細(xì)介紹了PHP中的Session對(duì)象,從概念到如何創(chuàng)建,再到一般結(jié)構(gòu)。希望對(duì)你有幫助,一起來(lái)看。
    2015-09-09
  • 搭建自己的PHP MVC框架詳解

    搭建自己的PHP MVC框架詳解

    這篇文章主要介紹了搭建自己的PHP MVC框架的方法,詳細(xì)分析了php構(gòu)建MVC框架的具體步驟、相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2017-08-08
  • PHP實(shí)現(xiàn)獲取客戶(hù)端IP并獲取IP信息

    PHP實(shí)現(xiàn)獲取客戶(hù)端IP并獲取IP信息

    這篇文章主要介紹了PHP實(shí)現(xiàn)獲取客戶(hù)端IP并獲取IP信息的方法示例,非常實(shí)用,有需要的小伙伴快來(lái)參考下吧。
    2015-03-03
  • php短域名轉(zhuǎn)換為實(shí)際域名函數(shù)

    php短域名轉(zhuǎn)換為實(shí)際域名函數(shù)

    現(xiàn)在很多朋友需要將實(shí)際域名轉(zhuǎn)換為短域名,但也有朋友需要反轉(zhuǎn)查看下實(shí)際域名,那么就可以使用這個(gè)函數(shù)。
    2011-01-01
  • PHP 訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)配置通用方法(json)

    PHP 訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)配置通用方法(json)

    目的是通過(guò)通用類(lèi)訪(fǎng)問(wèn)配置文件的方式,提供對(duì)數(shù)據(jù)庫(kù)連接的動(dòng)態(tài)獲取和設(shè)置,使開(kāi)發(fā)時(shí)和生產(chǎn)應(yīng)用時(shí)都能夠提供靈活的、簡(jiǎn)化的、解耦的操作方式,需要的朋友可以參考下
    2018-05-05
  • PHP使用PDO訪(fǎng)問(wèn)oracle數(shù)據(jù)庫(kù)的步驟詳解

    PHP使用PDO訪(fǎng)問(wèn)oracle數(shù)據(jù)庫(kù)的步驟詳解

    POD擴(kuò)展是在PHP5中加入,該擴(kuò)展提供PHP內(nèi)置類(lèi) PDO來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪(fǎng)問(wèn),不同數(shù)據(jù)庫(kù)使用相同的方法名,解決數(shù)據(jù)庫(kù)連接不統(tǒng)一的問(wèn)題。下面這篇文章主要給大家介紹了關(guān)于PHP使用PDO訪(fǎng)問(wèn)oracle數(shù)據(jù)庫(kù)的步驟,需要的朋友可以參考下。
    2017-09-09
  • PHP 遠(yuǎn)程文件管理,可以給表格排序,遍歷目錄,時(shí)間排序

    PHP 遠(yuǎn)程文件管理,可以給表格排序,遍歷目錄,時(shí)間排序

    PHP 遠(yuǎn)程文件管理,可以給表格排序,遍歷目錄,時(shí)間排序 點(diǎn)擊表格第一行,頭部就可以排序了,這個(gè)列子是當(dāng)前目錄的
    2009-08-08
  • php中preg_replace_callback函數(shù)簡(jiǎn)單用法示例

    php中preg_replace_callback函數(shù)簡(jiǎn)單用法示例

    這篇文章主要介紹了php中preg_replace_callback函數(shù)簡(jiǎn)單用法,分析了preg_replace_callback函數(shù)的功能及簡(jiǎn)單使用方法,需要的朋友可以參考下
    2016-07-07
  • 修改了一個(gè)很不錯(cuò)的php驗(yàn)證碼(支持中文)

    修改了一個(gè)很不錯(cuò)的php驗(yàn)證碼(支持中文)

    很早前在PHP喜悅國(guó)際村看到的一個(gè)驗(yàn)證碼類(lèi),寫(xiě)的很強(qiáng)。但有些邏輯方面感覺(jué)處理的不好,然后我不喜歡完全用session來(lái)處理驗(yàn)證碼。這在大型系統(tǒng)中是很不好的
    2007-02-02
  • php繼承中方法重載(覆蓋)的應(yīng)用場(chǎng)合

    php繼承中方法重載(覆蓋)的應(yīng)用場(chǎng)合

    這篇文章主要介紹了php繼承中方法重載(覆蓋)的應(yīng)用場(chǎng)合,以實(shí)例形式較為詳細(xì)的分析了重載的用法與對(duì)應(yīng)的適用情況及使用技巧,需要的朋友可以參考下
    2015-02-02

最新評(píng)論

陈巴尔虎旗| 凉城县| 大关县| 车致| 彭山县| 嘉荫县| 梨树县| 长汀县| 江油市| 哈尔滨市| 文昌市| 资兴市| 武陟县| 凤翔县| 始兴县| 黑山县| 嘉祥县| 遂昌县| 泽州县| 伽师县| 静安区| 普宁市| 寿阳县| 东山县| 芷江| 绥棱县| 台东县| 卫辉市| 夏河县| 始兴县| 麻栗坡县| 西安市| 梁河县| 航空| 晋州市| 谢通门县| 龙口市| 永川市| 墨竹工卡县| 荥阳市| 鄱阳县|