2010-09-02 68 views
1

好的,這是我的錯。我從來沒有在學校學過編程,這就是爲什麼我總是以意大利麪代碼結束的原因。我總是對不同的模式感到好奇,至少在基礎層面上試圖理解它們。完全失敗的OOP/MVC

MVC是我最恐懼的事情,我想我永遠無法使用它的優勢,因爲我不明白它的基本原理。

我的實際問題/問題是這樣的:

前端控制器調用它做一些初始化一個「核心」類,然後調用正確的操作/參數的實際控制人。控制器總是擴展'核心'類,所以我可以訪問它的變量等。他們一起工作很好,但這裏出現我真正的問題。

在不同情況下需要某種方法(在大多數情況下獲取數據庫條目)。 (例如,一個產品需要它的製造商)

在這種情況下我有兩個(壞)的選擇:

  • 注入所需的方法進入「核心」類,所以它變得越來越臃腫隨着時間的推移
  • 注入所需的方法進入實際調用控制器,所以我最終將冗餘的代碼庫

我看到了很多在我的方法可能出現的問題:

  • 控制器總是延伸「核心」類
  • 「核心」控制器保存數據庫對象,以便沒有它,我無法訪問我Db的
  • 數據庫功能(例如獲得產品)所在的控制器,但我不能訪問他們,因爲他們總是在再次調用「核心」第一(擴大問題)

請告訴我:

哪裏是我的方法的最大問題我可以在哪裏糾正它?

注:

請不要把這個作爲一個一般性的問題,我覺得這是一個回答的事情。如果您需要澄清一下,請提出要求,我會盡量減輕一些事情。

感謝您的寶貴時間,FABRIK

+0

擴展一個「核心」類聽起來像史詩般的失敗。 :)而不是將數據庫注入控制器。此外,您只需要一個控制器,而不是前端控制器和「實際控制器」。 – bzlm 2010-09-02 12:19:01

+0

@bzlm:我在你的評論中看到了一點,但我沒有看到正確的道路。 '核心'是爲了容納許多常用的重要方法/變量而創建的。如果不在裏面,我可以在哪裏握住它們?前端控制器在做它的工作時很好地調用它(調度器等),這很重要。 – fabrik 2010-09-02 12:32:56

+0

看到這個答案及其評論http://stackoverflow.com/questions/3626955/totally-failed-in-oop-mvc/3627102#3627102 – bzlm 2010-09-02 12:55:42

回答

0

是具有 「核心」 你最大的問題上課,儘快擺脫它。順便說一句,FrontController並不是唯一能夠做事情的MVC事物。

你的第二個問題是控制器處理數據庫,它不應該。我建議你使用一些抽象數據層,你只能在你的模型中使用它。而且控制器應該只處理模型,它不應該關心模型如何保存和提取數據。

+0

你如何看待這是最大的問題?普通的「核心」課有很多用途。查看[Lithium Framework](http://lithify.me/),他們將它用於絕大多數類... – ircmaxell 2010-09-02 12:35:37

+1

大多數面向對象框架都是從一個「對象」類派生出來的,作爲所有類的基礎。重要的是要記住爲什麼你使用繼承,並確保它是出於正確的原因。從Controller基類派生的控制器是有意義的,從Controller類派生的數據訪問類(即Repository)是沒有意義的。 – Lazarus 2010-09-02 12:40:13

+1

人,核心類是醜陋的設計。期。控制器,數據和實用程序對象有什麼共同之處?他們都是對象?這沒有任何意義。 我同意,雖然控制器可能派生自一些AbstractController類,但不應該以在問題中描述的方式使用這種繼承(即初始化和持有db連接) – 2010-09-02 12:46:38

1

數據的表示到控制器,並通過模型視圖。該模型可能受存儲庫支持,但取決於您可能希望在模型中提供數據庫訪問的開銷。數據架構應該與此類似:

(庫< ===>)型號< ===>控制器--->查看

+0

謝謝你的回答。這些是MVC的基本原則,並且(正如我之前所說)我並不是很熟悉它。這張圖很具代表性,但我正在尋找的是如何有效地連接它們。誰叫誰?誰擁有什麼?對什麼負責什麼?這是我最大的困境。我讀過的所有教程都基於一個假設你不想理解但使用它的框架。 – fabrik 2010-09-02 12:41:51

+0

@fabrik:沒有明確的答案,因爲不是所有人都同意。有很多的實現,每個都有些不同。我建議閱讀[Head First Design Patterns](http://oreilly.com/catalog/9780596007126)...它在解釋這些事情方面做得很好(恕我直言)...... – ircmaxell 2010-09-02 12:49:21

+1

@fabrik:在MVC中我使用通過依賴注入來控制反轉,所以當我的控制器被實例化時,它們被模型對象填充。然後,Controller方法可以從Model中檢索數據,然後使用Repository對象(通過DI)實例化數據。控制器不調用存儲庫,它調用模型,模型調用存儲庫。然後Controller實例化View並傳遞View所需的數據(通常在ViewModel中,但這可能導致過度複雜的事情)。控制器坐在中間,啓動一切。 – Lazarus 2010-09-02 12:55:59

0

研究使用DI框架自動將資源庫實例注入控制器(甚至更好,代理類)。嘗試將業務邏輯保存在控制器之外,而是將其重新映射到助手或代理類中。

我傾向於將我的邏輯分解爲視圖=>控制器(僅用於業務後期和視圖之間的交互)=>業務邏輯=>模型(DTO)=>低級別數據訪問至少。

此外,如果您在視圖中需要常用幫助程序功能,可能需要創建多個擴展程序來提供幫助。