Model view controller MVC中控制器的传统使用是否违反了单一责任原则?

Model view controller MVC中控制器的传统使用是否违反了单一责任原则?,model-view-controller,solid-principles,single-responsibility-principle,Model View Controller,Solid Principles,Single Responsibility Principle,维基百科以这种方式描述了这个问题: 单一责任原则规定每个对象都应该有一个单一的责任,责任应该完全由类封装。它的所有服务都应该与这一责任紧密结合 MVC中控制器的传统使用似乎会导致程序员违反这一原则。使用一个简单的留言簿控制器和视图。控制器可能有两个方法/操作:1)Index()和2)Submit()。Index()显示表单。Submit()处理它。这两种方法是否代表两种不同的责任?如果是这样,单一责任是如何发挥作用的?是的 如果你想遵循SRP,你可以把你的控制器分解成一个调度器和动作;Dispa

维基百科以这种方式描述了这个问题:

单一责任原则规定每个对象都应该有一个单一的责任,责任应该完全由类封装。它的所有服务都应该与这一责任紧密结合

MVC中控制器的传统使用似乎会导致程序员违反这一原则。使用一个简单的留言簿控制器和视图。控制器可能有两个方法/操作:1)Index()和2)Submit()。Index()显示表单。Submit()处理它。这两种方法是否代表两种不同的责任?如果是这样,单一责任是如何发挥作用的?

是的

如果你想遵循SRP,你可以把你的控制器分解成一个调度器和动作;Dispatcher将控制分派给它的操作,在编译时(C++模板)或运行时(Java XML,无论什么),您都可以编写Dispatcher和操作

为什么我们不经常看到这一点?因为控制器通常是“特殊”实现,所以叶级的具体类不是泛化的,也不是子类化的。在这里,类更方便地用于分组代码,操作几乎肯定是非公共的(可能是私有的,可能是受保护的),“仅仅”内部实现细节

如何决定向哪一个操作发送操作、可能操作的数量和多样性的选择非常多,并且发送和操作是紧密耦合的。因此,在实践中,将代码放在一个地方通常更容易。

不,不是这样

MVC模式或其变体没有导致违反单一责任原则的内在因素。控制器的实现是否违反SRP取决于封装的行为是否有一个以上的更改原因(就像任何其他类一样),而不是因为模式的任何预设规定性使用

您给出的示例是数据应用程序上的基本表单的子集,其中控制器仅为给定模型提供CRUD操作。CRUD操作在本质上是相当内聚的,因此这通常不构成对SRP的违反。在一个控制器上有多个方法开始变得可疑的地方是,这些方法代表了跨域的不同行为交互

这就是说,即使有人认为CRUD代表了四个独立的非内聚关注点,MVC模式也没有内在的东西迫使您在同一个控制器中促进这些操作


了解一下MVC模式的历史,并讨论它在Web开发中的应用,checkout。

我同意,它本身并没有违反MVC模式,但它确实鼓励您——您将把新的与用户相关的操作放在哪里?当然是在UserController中。很快,它就失去了控制,充满了互不依赖的操作方法,但仅仅因为方便而被分组。我开始了一场讨论,讨论取消控制器,将操作分组到名称空间的想法。