避免OOP的形式,POP的思想 - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- 避免OOP的形式,POP的思想 (http://www.webasp.net/article/17/16931.htm) |
| -- 作者:未知 -- 發佈日期: 2005-03-10 |
| 避免OOP的形式,POP的思想
好久沒發技術性文章了,今天在21PHP裡看到有位兄弟發了這貼子,轉了過來.對加強OOP的學習有些用 ---------------------------------------------------------- 避免OOP的形式,POP的思想 隨著PHP對OOP(面向對像編程)支持的增強以及程序設計思想的發展,越來越多的PHP程序員走進了OOP的世界.通過簡單的學習,大多數程序員都能 快速的掌握OOP編程的基本技能.程序員們所寫的代碼裡class,new等字符串也越來越多.但是作為程序員的你,是否陷入了一種OO形式,PO思想的 編程陷阱呢? 作為POP時代的程序員,為了實現計算一件房子的所有門的價格,他們會寫這樣一個函數. 代碼: /****************************************** 函數:priceOfHouseDoor($num,$price) 功能:計算所有的門的價格總和 參數:$num 門的數量,$price 每扇門的價格 備註:surfchen @ http://www.yubeinet.com/ ******************************************/ function priceHouseDoor($num,$price) { return $num*$price; } echo priceHouseDoor(2,5);//輸出價格 或者乾脆來個更過程的: 代碼: $doors=2;//門數量 $price=5;//每扇門的價格 echo $doors*$price;//輸出價格 這是典型的POP.當瞭解了OOP後,很多人可能會改變實現這個功能的代碼.或許,程序員們會這麼寫: 代碼: class house { /****************************************** 函數:getDoorPrice($num,$price) 功能:計算所有的門的價格總和 參數:$num 門的數量,$price 每扇門的價格 備註:surfchen @ http://www.yubeinet.com/ ******************************************/ function getDoorPrice($num,$price) { return $num*$price; } } $house=new house; echo $house->getDoorPrice(2,5);//輸出價格 我們一下子就看出來,這段代碼用到了OOP的代表 -- 類和實例化.那麼,這就是面向對像編程了嗎? 我再仔細一看,發現這個類其實只不過是上面的priceOfHouseDoor($num,$price)函數的面向對像形式. 嗯,現在我們先探討一下到底什麼才叫面向對像編程.我的理解是:面向對像編程有兩個核心內容.一是類,二是實例.類是對一類事物的抽像,而實 例是這一類事物中的個體.而實例的屬性(值)和方法(函數),則分別是這個個體的具體內容和動作. 我們再來看看上面的這個house類.它有一個方法,getDoorPrice($num,$price),引入了兩個參數.一個是房子的門的數量,一個是房子門價.我們 發現,當我們使用這個方法時,這兩個值是臨時構建的,並沒有與房子形成任何的聯繫.在實際生活中,一個房子裡的門與房子無任何聯繫,這是不 可以理解的...正如我們所知道的,OOP其實是我們真實世界的一個縮影.所以,OOP中的房子和房子的門無任何聯繫,也是不可理解的,是非OO的思 維. 那麼,我們應該如何使用真正的OO來實現以上功能呢?請看以下代碼: 代碼: class house { var $doors;//門的數量 var $pricePerDoors;//每扇門的價格 function setNumOfDoors($num){$this->doors=$num;}//設定門數量 function setPricePerDoor($price){$this->pricePerDoors=$price;}//設定每扇門的價格 /*************\ *獲得門的價格 * \*************/ function getDoorPrice() { return ($this->doors)*($this->pricePerDoors); } } $house=new house; $house->setNumOfDoors(2);//設定門數量 $house->setPricePerDoor(5);//設定每扇門的價格 echo $house->getDoorPrice();//輸出 我們很明顯地看到,以上代碼的門的數量和價格房子已經結合在了一起.這才是真正的面向對像. 你不覺得嗎?^_^ |
| webasp.net |