2010-09-02 70 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)=>低级别数据访问至少。

此外,如果您在视图中需要常用帮助程序功能,可能需要创建多个扩展程序来提供帮助。