码迷,mamicode.com
首页 > 其他好文 > 详细

领域模型与数据映射器(理解)

时间:2016-05-04 15:47:03      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:

领域模型根据业务逻辑编写,以及生成对象(对象安全,与数据层分离)
 
处理业务逻辑,根据业务逻辑编写,如果每个类与数据表相对应是最好不过,但是现实生产并不是这样.   主要功能是这样,如公交站会有很多公交车(公交车也是一个对象,它可能拥有乘客)以及车站的基本信息(名称等等),我们把车站声明为一个领域对象,构造方法可以传入ID已经车站的基本信息,每一条基本信息拥有自己的set get 方法,这里还会拥有公交车的get set (公交车的领域对象) 
 
 
数据层
 
数据映射器可以很好的完成数据库操作,好处在于领域模型可以更专注的处理业务逻辑,而不必过多的关心数据库的操作。
在数据映射器类中,编写可以用到的sql语句,已经增删改查方法的编写。添加方法:通过领域模型的set方法注入需要添加的字段(如为车站起一个名字),这是一个完整的车站,现在是时候把它写到数据库中了,我们实例化车站的数据映射器,向添加方法中传入刚刚实例的车站对象,在映射器中执行车站对象的get方法取得车站信息,然后执行sql来添加数据库,添加返回主键ID,可以把ID存在领域对象中,以便之后对该对象的更新删除查找操作,更新操作同添加。查找,我们或许会从$_REQUEST中拿到想要查找的ID,首先,实例化映射器,传入ID,然后执行映射器查找方法,将查找到的信息写入我们的领域对象中。我们应该在查找出数据的时候实例化我们需要的领域对象,如此,可以在映射器中添加实例化领域对象方法。
如上延伸,查找一跳数据,映射器可以很好的完成实例化领域模型,但是,更多的时候需要一次查找出十几条,甚至几百条数据,我们需要对每一条数据进行实例化领域操作,会造成性能的低下,改进实例化操作,iterator(迭代器)接口。
Iterator extends Traversable {
/* 方法 */
abstract public mixed current ( void )//返回当前元素
abstract public scalar key ( void )//返回当前元素的键
abstract public void next ( void )//向前移动到下一个元素
abstract public void rewind ( void )//返回到迭代器的第一个元素
abstract public boolean valid ( void )//检查当前位置是否有效
}
如上是php.net贴出来的iterator接口说明,整理一下我们需要的,我们可能一次查询处多条数据,每一条数据都需要实例为领域对象。我们来继承这个迭代器,对,有很多条数据,可以在继承迭代器的接口(命名为 abstract A)A 类的构造方法中传入我们查询出来的数组和对应的映射器,把这些分别放入私有变量中,想一下应该怎么改造这个A了,我们需要一个负责实例化领域和返回领域对象的方法(别忘了我们在构造方法中传入了数据映射器,映射器可以为我们实例化对象),OK,很明显了,我们需要使用映射器的来实例化领域对象,然后返回该领域对象,以供使用。这样做还有一个好处,持久化操作,我们甚至可以把他作为一个单例来使用,再添加一个增加领域对象的方法,于是所有的领域对象都静静地躺在内存里待命,可以拿来想要的一条,或者全部。对了,每一个对象都应该有自己的迭代器,这样更好,嗯。有个烦恼的问题,迭代器中可能有重复的数据,甚至是一些已经改过,但是内存中还未做修改,这回导致bug,甚至很难找到问题所在,嗯。。。。
 
 
 
 
ps:   20 公里来回骑行
  70 个45度俯卧撑(7*10)
  160 个108度屈腿卷腹(20*8)
  35 个90度蹲起

领域模型与数据映射器(理解)

标签:

原文地址:http://www.cnblogs.com/zhaohaibo/p/5458625.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!