MVC:逻辑应该放在模型或服务层吗?

时间:2015-07-22 23:42:52

标签: model-view-controller

最近,我与一位同事进行了交谈,并就模型视图控制器范例进行了对话。我们谈论的是文件的正确组织等等,我提到我认为那些瘦弱的控制器和胖模型"是要走的路。这意味着控制器只是调用"胖模型"包含业务逻辑的方法:

public class CreditCard {
    //instance vars
    //constructor
    //getters
    //setters (if you want mutability)

    public boolean makeCreditCardPayment(Cart cart) {
    //implementation details...
    }   
}

我的同事提到了其他方面。他说这些模特不应该真的变胖了#34;并包含任何其他业务逻辑。该模型应该只是一个数据结构,并且包含零方法(显然,如果您使用Java,则需要setter和getter)。就像C风格的结构一样,显然有数据字段有mutators和accessors:

public class CreditCard {
    //instance vars
    //constructor
    //getters
    //setters (if you want mutability)
}


public class PaymentService {
    public boolean makeCreditCardPayment(CreditCard card, Cart cart) {
    //implementation details...
    }   

    public boolean makePayPalPayment(PayPal paypal, Cart cart){
    //implementation details...
    }

甚至为实现接口的每种付款类型都有一个PaymentService。所以类似于' CreditCardPaymentService实现了付款'或者' PayPalPaymentService支付付款'。

对我来说,使用服务方法似乎我们只是回到程序式编程。

另一个例子是'车辆'使用getSpeed方法的对象与接收Vehicle对象并返回速度的服务进行比较。

我查看了其他stackoverflow答案,但他们有不同的答案。在一个问题中,其中一个用户提到服务层是MVC模型部分的一部分。我正在寻找其他答案。

1 个答案:

答案 0 :(得分:0)

我遇到了许多声称属于MVC保护伞的不同哲学。

我的位置:

模型直接管理某种后备存储,并且应该包含变异和验证逻辑。

控制器应该看起来像其他控制器和视图的模型(使它们可组合),并包含验证从控制器接口到模型接口的映射所需的任何其他逻辑。

视图只包含他们需要运行的状态和逻辑;他们的目的是显示数据并收集输入。

您的PaymentService似乎试图成为多个控制器,因此我会选择单独的CreditCardPaymentServicePayPalPaymentService路线。