大话胖model和瘦model

今天业务完成到一定程度,查看下代码,猛然发现目前的这个代码有点奇怪。奇怪就奇怪在我的model中有很多文件,每个文件都对应数据库中的一张表,然后每个model中有很多是几乎没有什么逻辑代码的。比如:

这个原因是什么呢,因为rdb_model这个类实现了ORM,我继承这个类才能使用ORM的那些操作。

 

但是这个确实让我很不爽,一个神马东西都没有的类为什么要写呢?引申出的一个问题是到底是胖model好呢,还是瘦model好?

 

不难想象我项目中的代码算是胖controller,瘦model了。即我的model完成了ORM的封装流程,为的就是controller中能更方便使用。说实话,这样controller中的函数写下来是非常舒服的。但是考虑一个问题,这样子是不是违反了DRY原则呢?如果是瘦到只封装ORM的model,那么一定可以闭着眼睛说,controller中一定有很多会冗余的代码。这确实是不好的做法。controller中的冗余可共用的代码并没有抽象出来,这当然会造成日后的代码困扰。

 

那我们退一步,如果model不再那么瘦呢?我们把基础的一些方法都放到model中,但是我们还是坚守着一个表一个model的方法。那么就会将下面这样的方法放到model中:

问题就是,这里势必要使用comment_model了,这个model是comment表的映射,它的内部却是任何功能都没有实现。

 

如果你会说这样其实没有什么问题,那么下面问题来了,现在访问量上来了,我们不从DB中取出数据了,我们改成从DB中取出数据,存入缓存,然后下次再去缓存中取数据。这时候的问题来了,缓存是加在controller中还是model中呢?

 

这个观点各执己见,从领域驱动模型来说,缓存是不属于领域模型范畴的,它和领域数据逻辑没有关系,它属于应用层范畴。但是从MVC观点来看,Model层是数据获取的抽象,controller层只管理数据的重新组织和连接,数据从哪里来并不属于controller管理范畴。所以呢,数据从DB中来还是从Cache中来,这是Model层应该管理的。

 

如果再退一步呢?所有的数据逻辑都写在model中呢?那么就会出现下面这个看起来奇怪的代码了:

一个方法只有一行!!如果增删改查都这么做,就很冗余了。这么多本来可以不用写的代码总是让人非常不爽。在调用的时候反正都是一句话的事情,为什么还要封装一层呢?

我想所有的分歧先要弄清的是MVC的model是什么的抽象?如果说model是数据结构的抽象,那么ORM就已经完成了这个抽象行为,一个DB一个model就是实现这样的抽象。但是我觉得并不是这样的。model应该是业务逻辑上的抽象。就是说,model层应该是触及到了具体的业务逻辑,它把业务逻辑封装成了可以给controller调用和使用的语言。这就非常符合领域驱动设计的意思了。model层是将业务领域封装成模型的层。算是一种“翻译”工作,将现实中的业务“翻译”成程序语言。这样的model封装才有意义。

然后回到缓存放在controller还是model的观点。我认为,业务领域获取数据是从缓存还是DB中获取,这个逻辑应该是放在model中的,因为这个也属于“翻译”的过程。如果这个逻辑由应用层来做的话,它就需要关心到这个访问和那个访问是不是同时都使用了缓存,返回的数据是不是一致的这样一致性问题。那么就是把这层和实际的“运行环境”的逻辑放在本该很清晰的应用层来做了。

 

但是呢?老子说的,不同情况不同分析。

做前台和做后台是一样的逻辑吗?这里说的前台是指API,WEB,WAP等方式。后台指的是运营,审核等后台。我的观点就是前台尽可能或者强制性地“胖model”化。意思就是所有可以零散放在model中的访问都在model中放着。这个观点就默认了

 

这样的写法在前台是合理的。如果在cars这个表上面加个缓存,那么只需要修改model中的三个方法,不需要修改业务的应用逻辑!!这样就把模型在具体环境的实现完全抽象化了。

但是对于后台呢?后台实际上是对实际数据的强行干预了。所以我们在后台很少触碰到缓存等优化机制的。并且鉴于后台开发不需要承担大并发的需求,也往往开发时间紧张于前台。所以后台开发这种“胖controller,瘦model”的模型非常适合的。甚至于能用到“胖controller,无model”我认为也不算过分。

 

所以再次举起具体问题具体分析的大旗,这个问题算是有结论了。

时间: 2025-01-29 21:27:22

大话胖model和瘦model的相关文章

JSP 构架-2种方式:Model I和Model II

js|model 作者:Lance Lavandowska 编译:blueski 如果你经常去Servlet或JSP的新闻组或者邮件列表,那么一定会看到不少关于Model I 和Model II 方法的讨论.究竟采用哪一种,这取决于你的个人喜好.团队工作策略以及是否采用正统的OOP. 简单地说,Model I将事务逻辑(business logic)和表示代码(presentation code)融合在一起(如在HTML中):Model II则提倡最大限度地将所有的代码放到内容表示之外. Mod

ASP.NET MVC的Model元数据与Model模板:将”ListControl”引入ASP.NET MVC

我们不仅可以创建相应的模板来根据Model元数据控制种类型的数据在UI界面上的呈现方法,还可以通过一些扩展来控制Model元数据本身.在某些情况下通过这两者的结合往往可以解决很多特殊数据的呈现问题,我们接下来演示的实例就是典型的例子.[本文已经同步到<How ASP.NET MVC Works?>中] 传统的ASP.NET具有一组重要的控件类型叫做列表控件(ListControl),它的子类包括DropDownList.ListBox.RadioButtonList和CheckBoxList等

怎样为kvc的model的子model的属性直接赋值

问题描述 怎样为kvc的model的子model的属性直接赋值 我建了一个model,里面有一个属性也是model @interface UserInfo : NSObject @property (nonatomic, strong) LoginModel *loginModel; 子model里面有一个属性userID @interface LoginModel : NSObject @property (nonatomic, copy) NSString *userID; 当我想直接给子m

特斯拉两款新车Model C和Model R曝光 售价仅3.5万美元

根据Autoblid的一份报告,特斯拉或许将在2018年推出最少四款新车型.这些新车型中,我们已经知道了Model X和Model 3,但报告中指出,特斯拉还将会推出一款敞篷跑车,以及一款紧凑型轿车.Autobild指出,对于紧凑型轿车,特斯拉也许会将其命名为Model C.从目前的情况来看,特斯拉这款车将主打更为廉价的市场,预计它的售价将会是3万5千美元.对于另外一款新车,Autobild称这将会是一辆全新的跑车,目前它的代号是Model R.特斯拉副总裁George Blankenship透

ASP.NET MVC的Model元数据与Model模板:将”ListControl”引入ASP.NET MVC

我们不仅可以创建相应的模板来根据Model元数据控制种类型的数据在UI界面上的呈现方法,还可以通过一些扩展来控制Model元数据本身.在某些情况下通过这两者的结合往往可以解决很多特殊数据的呈现问题,我们接下来演示的实例就是典型的例子. 传统的ASP.NET具有一组重要的控件类型叫做列表控件(ListControl),它的子类包括DropDownList.ListBox.RadioButtonList和CheckBoxList等.对于ASP.NET MVC来说,我们可以通过HtmlHelper/H

ASP.NET MVC的Model元数据与Model模板:模板的获取与执行策略

当我们调用HtmlHelper或者HtmlHelper<TModel>的模板方法对整个Model或者Model的某个数据成员以某种模式(显示模式或者编辑模式)进行呈现的时候,通过预先创建的代表Model元数据的ModelMetadata对象都可以找到相应的模板.如果模板对应着某个自定义的分部View,那么只需要执行该View即可:对于默认模板,则直接可以得到相应的HTML.本篇文章着重讨论模板的获取和执行机制,不过在这之前,顺便来讨论一下DataTypeAttribute和模板的关系. 一.

ASP.NET MVC的Model元数据与Model模板:预定义模板

通过ModelMetadata表示的Model元数据的一个主要的作用在于为定义在HtmlHelper和HtmlHelper<TModel>中的模板方法(这些模板方法包括Display/DisplayFor.Editor/EditorFor.DisplayForModel/EditForModel.Lable/LabelFor和DisplayText/DisplayTextFor等)提供用于最终生成HTML的元数据信息.在调用这些方法的时候,如果我们指定了一个具体的通过分部View定义的模板,或

怎样用JQuery获取&amp;amp;lt;%=Html.TextBoxFor(Model=&amp;amp;gt;Model.UserName) %&amp;amp;gt;的值

问题描述 怎样用JQuery获取<%=Html.TextBoxFor(Model=>Model.UserName)%>中的值 解决方案 解决方案二:$("#UserName").val()

画胖小人和瘦小人,建造者模式版本

逻辑代码: 1 abstract class PersonBuilder 2 { 3 protected Graphics g; 4 protected Pen p; 5 6 public PersonBuilder(Graphics g, Pen p) 7 { 8 this.g = g; 9 this.p = p; 10 } 11 12 public abstract void BuildHead(); 13 public abstract void BuildBody(); 14 publi