大话胖model和瘦model

时间:2022-09-17 00:18:15

今天业务完成到一定程度,查看下代码,猛然发现目前的这个代码有点奇怪。奇怪就奇怪在我的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中:

大话胖model和瘦model

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

 

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

 

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

 

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

大话胖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”我认为也不算过分。

 

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

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

  1. MVC中@Html.DisPlayFor(model=>model.newsName)和 @Model.newsName的区别

    MVC中,在Controllers查询到数据,返回一个实体给View并显示,可以用@Html.DisPlayFor(model=>model.newsName)和 @Model.newsName ...

  2. 胖client和瘦client

    胖和瘦?纠结了妙龄少女,更郁闷了无数男女老少.每天充斥在宿舍的一句话就是:从明天開始我要减肥!!结果,可想而知,真的永远是明天而已.就这样,胖和瘦在我们人类之间无缝不在的存在着.但是client怎么就 ...

  3. 【转载】Analysis Service Tabular Model #003 Multidimensional Model VS Tabular Model 我们该如何选择?

    由于Multidimensional Model 和 Tabular Model 并不能互相转换, 所以在项目之初就应该要考虑好选择哪一种模型进行开发. 以下只是一些建议: Licensing 许可和 ...

  4. Generative model 和Discriminative model

    学习音乐自动标注过程中设计了有关分类型模型和生成型模型的东西,特地查了相关资料,在这里汇总. http://blog.sina.com.cn/s/blog_a18c98e50101058u.html ...

  5. JFinal项目eclipse出现the table mapping of model: com.gexin.model.scenic.Scenic not exists or the ActiveRecordPlugin not start.

    JFinal项目eclipse出现the table mapping of model: com.gexin.model.scenic.Scenic not exists or the ActiveR ...

  6. 胖ap和瘦ap的区别

    一,什么是AP,胖瘦AP如何区分?       先说说AP的概念.AP是Access Point的简称,即无线接入点,其作用是把局域网里通过双绞线传输的有线信号(即电信号)经过编译,转换成无线电信号传 ...

  7. MVC:一个View显示多个Model(多个Model你可以使用ViewBag或ViewData , 或者:Model["myInfo"] as)

    MVC:一个View显示多个Model 多个Model你可以使用ViewBag或ViewData , 或者:Model["myInfo"] as. 比如: Tuple<str ...

  8. MVC中Model BLL层Model模型互转

    MVC中Model BLL层Model模型互转 一. 模型通常可以做2种:充血模型和失血模型,一般做法是模型就是模型,不具备方法来操作,只具有属性,这种叫做失血模型(可能不准确):具备对模型一定的简单 ...

  9. js 实现angylar&period;js view层和model层双绑定(改变view刷新 model,改变model自动刷新view)

    近段时间研究了下angular.js 觉得它内部实现的view和model层之间存在很微妙的关系,如下图 如上图说的,view的改变会update 数据层model, 数据层会update视图层vie ...

随机推荐

  1. ArcGIS图层介绍

    什么是图层 图层是用来在 ArcGIS 产品套件中显示地理数据集的机制.每个图层代表一种数据集(可以是地图服务.图形或是矢量数据),并指定该数据集是如何描绘使用一组属性的. 包含一个地图控件的每个应用 ...

  2. json解析不推荐使用eval

    推荐使用JSON.parse() 低版本浏览器(IE6/7)不支持此方法,可以通过网上下载json2.js,引入到文件中,此文件通过判断浏览器是否支持JSON.parse()方法,如果不支持,文件中编 ...

  3. AJAX&comma;JSON用户名校验

    效果 开发结构 1,src部分有两个包dao和servlet 1.1dao包下有两个数据库工具类文件 SqlHelper.java package org.guangsoft.dao; import ...

  4. Intel Edison 参考链接2

    Edison的breakout板子的引脚: http://iotdk.intel.com/docs/master/mraa/java/edison.html Edison的引脚 http://www. ...

  5. 第二章排错的工具:调试器Windbg(下)

    感谢博主 http://book.51cto.com/art/200711/59874.htm 2.2  读懂机器的语言:汇编,CPU执行指令的最小单元2.2.1  需要用汇编来排错的常见情况 汇编是 ...

  6. Struts2升级出现的问题

    由于大家都懂的原因,涉struts2的项目需要将struts2相关包升级至2.3.15.1.今将升级方法和常见问题解决简单总结如下. 一.基本升级操作 1. 获取Struts2.3.15.1jar包 ...

  7. Android手机app的adb命令测试电量

    Android手机app电量测试 Android 5.0及以上的设备, 允许我们通过adb命令dump出电量使用统计信息 第一步:手机安装要测试的应用,打开手机开发者模式-USB模式,运行cmd.ex ...

  8. linux抓包命令之tcpdump

    顾名思义,tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析.它支持针对网络层.协议.主机.网络或端口的过滤,并提供and.or.not等逻辑语句来帮助你去掉无用的信息,tcpdump ...

  9. Form表单中的action提交路径问题

    Form表单中的action提交路径问题 Form表单action属性和method属性的一些问题: 我遇到的是Form表单提交到servelet处理时遇到的问题:(1)<form name=& ...

  10. linux----之tcpdump小用

    1.通过抓包大致确定访问量 #time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -c 10000 >/dev/null 根据real时间判断访 ...