MVC框架中的模型-视图分离问题(四) —— 五大分离原则

1.    视图不能通过下述两种方式修改模型: 直接改变模型数据对象,以及调用模型的方法(会引起副作用)。也就是说,模板可以访问模型数据或调用方法,但这些访问必须是无副作用的。这条规则出现的部分原因是数据访问必须是序列无关的(order-insensitive)。
2.    视图不能对非独立数据的值(dependent data values)进行计算。 因为这样的计算将来有可能会变。任何情况下这种计算应该被封装在模型中。比如说,视图不能像这样计算图书的价格“$price*.90”。为了独立于模型,视图不能对数据的含义做任何假设。
3.    视图不能比较非独立数据的值。 但是可以检验数据的属性,如数据是否存在,多值数据的长度等。但像$bloodPressure<120这样的检验就应该放到模型中去,因为医生们总是希望能一直降低我们的最高收缩压。可以用下面这种做法代替这种表达式:$bloodPressureOk!=null。视图的输出可以是关于模型数据和计算的条件判断,这个条件的计算是在模型中进行的。甚至像将负数标成红色这样简单的功能都应该放到模型中去。
4.    视图不能对数据类型做任何假设。 有些类型假设显而易见,比如假设一个数据值是日期。但这样一来就会存在很多狡猾的做法:比如一个模板可以假设$userID是数值型;如此程序员就不能在模型中把它修改成非数值型而不破坏这个模板。这条规则禁止了如colorCode[$topic]和$name[$ID]这样的数组索引。视图也不能调用有参函数了(无论静态或动态地),因为这样就会对参数类型做出假设。除非你能保证视图方法只将它们当作对象类型处理。另外,美工不是程序员,期望他们能调用函数并传递些东西进去是不现实的。
5.    模型中的数据不能包含显示信息或版面信息。 模型不能将显示信息假装是数据的值进行传递。包括不能传递模板的名字到其他数据的值中。

    关于非独立数据,不仅仅指直接的模型数据引用如$user或$model.getUser(),也包括视图中被依赖于模型数据的逻辑改变的局部变量。比如:
#set interest = 0.08
#if ( $risk < 0.5 )
#set interest = 0.065
#endif
#set interestRate = interest*100
    这儿,变量interest和interestRate依赖于模型数据$risk的值。依赖关系有时候防不胜防啊。

    有了上述五大分离原则[1] ,下节我们就可以对目前流行的MVC框架进行评测,看是否满足模型-视图的分离要求。

参考文献
[1] Parr, T.J., Enforcing Strict Model-view Separation in Template Engines. WWW ’04: Proceedings of the 13th international conference onWorldWideWeb, New York, NY, USA, ACM Press (2004) 224–233, http://www.cs.usfca.edu/~parrt/papers/mvc.templates.pdf

你可能感兴趣的:(mvc,框架,user,null)