【问题标题】:MVC pattern, no database, where to store objects?MVC模式,没有数据库,对象存储在哪里?
【发布时间】:2015-03-26 10:14:23
【问题描述】:

我正在做一个学校项目,或任务是设计一个项目管理工具。我们可以使用任何设计模式,只要我们能够根据 GRASP 原则解释它的优点。

我会给出项目工具的概要:

  • 项目的 CRUD 功能
  • 任务的 CRUD 功能(项目有任务)
  • 用户的 CRUD 功能(为用户分配任务)
  • 一个简单的图形用户界面

我们决定采用 MVC 模式,并且不允许使用数据库。我的问题是:我应该在哪里存储对象?

我应该在控制器中执行此操作吗?目前我们这样做:

public class ProjectController
{
    private ArrayList<Project> projects;

    public ProjectController(TaskController taskController)
    {
        projects = new ArrayList<Project>();
    }
}

我感觉将对象保留在控制器中有些问题,但我无法解释原因。任何人都可以根据 GRASP 原则解释最佳实践是什么?

编辑: 谢谢,向大家学习了一些东西,但只能选择一个答案。

【问题讨论】:

  • 对象存储在模型中,这就是MVCM 部分的全部意义所在。不一定要持久化数据,例如你可以把它放在堆上,但是在你的应用程序关闭后它就会丢失。

标签: java model-view-controller grasp


【解决方案1】:

简短回答:不,不要将您的商店放在控制器中。这是一个坏主意,它违反了 MVC 原则。

通常,模型是唯一负责您的数据的地方,但经常将 M 部分拆分为:

  • 正在获取数据。
  • 将数据存储在应用程序中。

其中有趣的部分是,没有人关心您的数据来自哪里。一个数据库,一个文件,一个 API 休息。不管怎样,没关系。

我并不是说我有最适合你的解决方案,但这里是你可以通过一个例子来做到这一点的方法。

  • 您将用户数据存储到文件中。
  • 您创建一个 php 类 UserDataRepository 来获取用户数据文件,并将数据设置到您的 UserModel 类中。
  • 从控制器中,您拨打您的UserDataReposiroty 并取回您的UserModel

这样,您的控制器不知道您是如何获取数据的。他只是要求存储库获取它们,然后它返回允许控制器操作的 UserModel。

希望对你有帮助

【讨论】:

  • 你创建了一个 php 类? - 为什么?..模型类可以做到这一点吗?。
  • @TheLostMind 恕我直言,这没有错。我经常避免使用模型类进行数据检索。您的数据源的特征可能会发生变化,而不会影响模型,或者同一类型的数据可能有不同的来源。
  • 视情况而定,你可以两者都做。有些人喜欢将模型分成两类,一方面是持久性,另一方面是数据的获取。我只是建议,因为这是一个学校项目,我认为目的是了解 MVC 的工作方式。我认为这样会更有启发性。
  • @Giuseppe - 是的,界面应该保持不变。数据源应与模型松散耦合。我只是对 php 类的用法感到好奇。 :)
【解决方案2】:

增加抽象。创建一个模型类。在那里创建您的数组列表(模型对象)。您的控制器仍应访问/调用模型方法。

明天,您可能希望将这些数据转储到文件或数据库中,您将在当前设计中完成这一任务。因此,将您的 模型 与控制器分开,并保持设计简洁。

【讨论】:

  • 所以我应该使用getAllProjectsgetAllTasks、...等方法创建一个单独的类,然后该类返回所需的列表?
  • @Michiel - 是的。您的控制器不应该关心与模型(数据)相关的任何事情。模型应该是控制器的黑盒。这样您就可以轻松更改模型而不影响控制器/视图。创建模型类并调用其方法获取数据。
  • 这样一个类的合适名称是什么?
【解决方案3】:

没有。如果您将数据存储在控制器中,那么您就没有使用 MVC。您必须在模型中执行此操作。您可以存储在内存或文件中,但始终将数据存储在模型中。例如,您可以实现 DAO 模式来操作数据。

也许,不是现在,但是你需要一个数据库。使用 DAO 模式,将您当前的持久性类型适应数据库并不难。

【讨论】:

    【解决方案4】:

    在MVC模式中,M代表模型,V代表视图,C代表控制器。一个常见的 MVC 应用程序进程是,一旦请求到来,控制器获取它并进行必要的处理,检索结果数据,然后将结果数据传递给视图进行渲染。视图层渲染后,通过图形用户界面显示给用户。

    所以controller可以看成是一个commander,它控制着进程,但是不好处理controller中的数据检索。模型应该负责检索和组织数据。这意味着 数据对象应该存储在 Model 而不是 Controller 中,Controller 调用 Model 来检索数据对象。以Java应用为例,通常需要这些部分:

    1. ProjectController,它调用ProjectService.getAllProjects() 方法来检索结果。检索到后,视图层使用结果呈现 GUI 以供显示。我建议 Controller 层应该很薄。
    2. ProjectService,它有方法getAllProjects(),这个方法调用ProjectDAO.getAllProjects()方法来检索项目数据,也许还有其他处理。业务逻辑到此为止。
    3. ProjectDAO,它有几个处理Project对象的方法,处理这一层的数据!但是这些方法应该独立于业务逻辑(因为业务逻辑应该在ProjectService处理)。
    4. Project 对象。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-22
      • 2013-12-01
      • 2010-12-03
      • 2012-03-16
      • 2015-07-05
      • 2010-09-11
      • 2010-11-11
      相关资源
      最近更新 更多