php中物件導向開發探討

來源:互聯網
上載者:User
最近要對以前的一個項目改版,以前寫的類基本上都是對一些方法的堆積,一個類都有上百k的大小,根本談不上是物件導向,或者稱之為偽對象吧。以以前寫的一個User類為例,對有些疑問的幾個地方進行討論下。
一、我在User裡要用到$db這個變數,用來查詢資料庫的,$db是通過db類執行個體化出來的,那我這個$db是不是在User類的__construct()裡就進行執行個體化呢?這樣做的好處就是User類的其他方法可以直接用$db變數了,不好的地方就是我的User類裡其他一些方法可能根本不需要用到$db變數,不僅僅是$db變數,還有一些cache對象、webservice對象,都可能有這種情況,也就是說在方法用到的時候去執行個體化對象,還是__construct()裡就進行執行個體化?或者是不是有什麼設計模式來處理這種情況?
二、對類的劃分問題。在User類我這裡可能有給使用者添加物品、刪除物品、顯示使用者物品列表,同樣不僅僅只有物品,還有積分、金錢等等,大部分都是增加、刪除、顯示列表的,這些都放User類裡看起來是沒有什麼問題的,都和使用者相關。但是個人總感覺User類純粹是一些方法的堆積了(尤其是顯示列表的那些方法),是不是可以改成這樣,比如以積分為例,有一個UserScoreMgr類,繼承自User類,然後對積分的操作都放在這個類中,這樣是不是好一些?或者同樣有什麼樣的設計模式來處理這個問題?


回複討論(解決方案)

1, DB類我一直用單例模式,調用靜態方法getInstance()取對象,而我習慣於在__construct()中執行個體化所有程式需要的類。至於該在何處執行個體化,我是覺得無所謂影響(可能對記憶體佔用有點影響吧),在__construct()中統一處理反倒方便管理。
2, 我也許會這麼劃分:
添加物品,刪除物品,顯示使用者物品列表
增加積分,減少積分,顯示積分
增加金錢,減少金錢,顯示餘額
這些都可以寫成獨立的類,因為它們本身互不影響。也不需要繼承User,如果你覺的會亂的話,指定這些類實現一個統一的介面。
而User類的工作,只是負責調用,即向這些類傳遞一些參數

這個沒有嚴格接的界限。如果商務邏輯比較多就要分層了。在資料和資料邏輯,商務邏輯之間分多層。
user是實體嚴格意義上就是儲存使用者的資訊,然後在建立user相關的商務邏輯。
使用者相關的附屬的積分,物品,金錢等等和使用者相關連的也主要集中在業務了邏輯上。
當然沒有完美的設計方式,適合就是最好的。
php的物件導向,“我覺得沒幾個人敢用”,你很大膽。呵呵,當然任何東西都是喜憂參半的

我不懂什麼單例模式也罷,原廠模式也罷,只知道那是php的底層實現模式,如果你們要用底層開發的話,那麼像array函數,字串函數之類的都別用,直接用最原始的php 迭代器吧。

看<重構>吧, 當然其它一些有關設計模式和oo設計的書也可以

其實php的模式結構類似於jsp。如果對jsp的架構理解不錯的話。其實道理都是一樣的。

php能將類作為參數傳遞嗎?

我不懂什麼單例模式也罷,原廠模式也罷,只知道那是php的底層實現模式,如果你們要用底層開發的話,那麼像array函數,字串函數之類的都別用,直接用最原始的php 迭代器吧。
現在看重構來不及了,需要就提出的問題有個解決方案。

你提出的問題就是 重構
重構(Refactoring)就是在不改變軟體現有功能的基礎上,通過調整程式碼改善軟體的品質、效能,使其程式的設計模式和架構更趨合理,提高軟體的擴充性和維護性。

拆分你先有的類,形成一個個單一對象,有如你的 UserScoreMgr類
需要注意的是:繼承的層次不要太多,一般以不超過二個層此為宜

其實呢,就算現在看還沒有什麼來不及的,粗看只要一兩個晚上,領會精神.
書裡有很多具體解決方案,你完全可以跳到你需要的章節細看.

重構的具體做法,和你的現有代碼,你的需求細節,你的軟體架構,包括你的個人喜好習慣,都有關係,
所以,不認為別人在僅僅看到你文章裡寫的這麼點內容的情況下, 能給出多具體的方案.
還是要你自己去做.



引用 3 樓 xjl756425616 的回複:
我不懂什麼單例模式也罷,原廠模式也罷,只知道那是php的底層實現模式,如果你們要用底層開發的話,那麼像array函數,字串函數之類的都別用,直接用最原始的php 迭代器吧。

現在看重構來不及了,需要就提出的問題有個解決方案。

無所謂,只要代碼維護方便,條理清晰,不一定非要較真兒的用啥oop

其實oop和設計模式的書也一直在看,只是以前畢竟沒有做過這方面,希望能夠站在你們巨人的肩膀上,少走點彎路而已,最終都得靠自己去做。在做之前多聽聽大俠們的意見,終究是好的。
其實呢,就算現在看還沒有什麼來不及的,粗看只要一兩個晚上,領會精神.
書裡有很多具體解決方案,你完全可以跳到你需要的章節細看.

重構的具體做法,和你的現有代碼,你的需求細節,你的軟體架構,包括你的個人喜好習慣,都有關係,
所以,不認為別人在僅僅看到你文章裡寫的這麼點內容的情況下, 能給出多具體的方案.
還是要你自己去做.

php做物件導向,那不是搞笑嗎?玩java的飄過.

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.