Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model view controller 胖模型和瘦控制器听起来像是在创建上帝模型_Model View Controller_Design Patterns_Architecture_God Object - Fatal编程技术网

Model view controller 胖模型和瘦控制器听起来像是在创建上帝模型

Model view controller 胖模型和瘦控制器听起来像是在创建上帝模型,model-view-controller,design-patterns,architecture,god-object,Model View Controller,Design Patterns,Architecture,God Object,我已经读了很多博客,这些博客提倡胖模特和瘦控制器的方法,尤其是Rails阵营。因此,路由器基本上只是确定在什么控制器上调用什么方法,而控制器方法所做的就是在模型上调用相应的方法,然后打开视图。所以我有两个问题我不明白: 除了在基于路由的类上帝模型上调用方法外,控制器和路由器实际上并没有做太多不同的任务 模特们做得太多了。发送电子邮件、创建关系、删除和修改其他模型、排队任务等。基本上,现在你有了上帝般的对象,它们可以做任何与建模和处理数据相关或不相关的事情 你的底线在哪里?这不正是上帝模式吗?我认

我已经读了很多博客,这些博客提倡胖模特和瘦控制器的方法,尤其是Rails阵营。因此,路由器基本上只是确定在什么控制器上调用什么方法,而控制器方法所做的就是在模型上调用相应的方法,然后打开视图。所以我有两个问题我不明白:

  • 除了在基于路由的类上帝模型上调用方法外,控制器和路由器实际上并没有做太多不同的任务
  • 模特们做得太多了。发送电子邮件、创建关系、删除和修改其他模型、排队任务等。基本上,现在你有了上帝般的对象,它们可以做任何与建模和处理数据相关或不相关的事情

  • 你的底线在哪里?这不正是上帝模式吗?

    我认为您可以区分单个fat模型(可能命名为应用程序或应用程序)和几个分解为逻辑组(业务、客户、订单、消息)的fat模型。后者是我构建应用程序的方式,每个模型大致对应于关系数据库中的数据库表或文档数据库中的集合。这些模型处理创建、更新和操作组成模型的数据的所有方面,无论是与数据库通信还是调用API。控制器非常负责调用适当的模型并选择模板的小mor

    如果“模型”类的实现很差,是的,您的担忧是相关的。 模型类不应执行电子邮件(基础结构任务)

    真正的问题是MVC中的模型意味着什么。 它并不局限于具有一些方法的POCO类。 MVC中的模型意味着数据和业务逻辑。将其视为经典核心POCO模型的超集

    视图====控制器===模型-->业务流程层-->核心模型

    加入基础设施组件和数据访问层,并使用注入将其传递到BPL中,那么您的a流程将按照预期使用MVC

    BPL可以调用UoW/Respository模式,并通过注入对象或接口模式执行业务规则和调用基础设施特性

    因此,保持控制器精简的建议并不意味着经典核心模型中的“person”类应该有50个方法,并且直接调用Email。你认为这是错误的,这是对的

    如果直接调用,控制器可能仍然需要实例化基础结构类并将其注入BPL或核心层。应该有一个业务层或至少一个类来协调跨经典对象模型类的调用。 这就是我的观点;-)

    对于MVC的一般用法,请参见wiki描述

    一个关于MVC中“M”的小博客

    将Rails视为MVC设计模式的主要部分可能不是最好的主意。所说的框架有一些固有的缺陷(我在一篇文章中对此进行了详细阐述),社区刚刚开始解决这些问题。您可以将DataMapper2视为第一个主要步骤

    一些理论 给出建议的人似乎被一种相当普遍的误解所困扰。因此,让我首先澄清一下:模型,在现代MVC设计模式中,不是类或对象。模型是一个层

    MVC模式背后的核心思想是,它的第一步是表示层和模型层之间的划分。正如表示层分解为控制器(实例,负责处理用户输入)、视图(实例,负责UI逻辑)和模板/布局一样,模型层也是如此

    模型层由以下主要部分组成:

    • 也称为域实体、业务对象或模型对象(我不喜欢后一个名称,因为它只会增加混淆)。这些结构通常被人们错误地称为“模型”。它们负责包含业务规则(特定域逻辑单元的所有数学和验证)

    • 存储抽象:

      通常使用模式实现(不要与滥用此名称的模式混淆)。这些实例通常负责存储域对象中的信息并将其检索到域对象中。每个域对象可以有几个映射器,就像有几种形式的存储一样(DB、缓存、会话、cookies、/dev/null)

    • 服务:

      负责应用程序逻辑的结构(即域对象之间的交互以及域对象和存储抽象之间的交互)。它们的行为应该类似于表示层与模型层交互的“接口”。这通常是Rails中的代码在控制器中的结果

    在这些组之间的空间中还可能存在多个结构:、和

    哦。。。当我们(在web上下文中)谈论与MVC应用程序交互的用户时,它不是人。“用户”实际上是您的web浏览器

    那么神呢? 控制器应该与服务交互,而不是使用可怕的单一模型。您将数据从用户输入传递到特定服务(例如
    MailService
    RecognitionService
    )。通过这种方式,控制器可以更改模型层的状态,但这是通过使用清晰的API完成的,并且不会干扰内部结构(这将导致泄漏的抽象)

    这样的更改可能会立即引起一些反应,或者只会影响视图实例从模型层请求的数据,或者两者兼而有之

    每个服务都可以与任意数量的域对象和存储抽象进行交互(尽管通常只有少数)。例如,
    RecogitionService