代码改变世界

ORM的那些事

2022-02-14 17:29  虎背熊腰  阅读(71)  评论(0)    收藏  举报

编程模式的诞生都是为了高内聚低耦合,所以只要能自圆其说都能提炼成一种编程思想

 

1: mvc的诞生

模型-视图-控制器(MVC)是Xerox PARC在八十年代为编程语言Smalltalk一种设计模式

 

2: 失血模型和充血模型提出者


Martin Fowler在 2003 年《企业应用架构模式》提出了失血模型和充血模型

https://martinfowler.com/bliki/AnemicDomainModel.html?spm=a2c6h.12873639.0.0.ec8d36f3lWpPLl

 

3: 领域驱动提出

领域驱动设计(Domain-Driven Design)是程序员 Eric Evans 于 2004 在他的《 领域驱动设计:解决软件核心中的复杂性》一书中提出的一个概念。

 

4: orm 的实现方式

Martin Fowler 它在Martin Fowler的2003年著《企业应用架构的模式》 Active Record vs Data Mapper

什么是Active Record?
Active Record 可以说是现在最受欢迎的一种ORM结构。如果你常常使用Ruby之类的语言,可能你已经对Active Record有一定l。下面是一个简单的Active Record例子。

$user = new user;
$user->username = 'ou';
$user->save();




什么是Data Mapper?
和Active Record不同,Data Mapper完全的把你的域(doamin)从持久层(persistence layer)中分离出来了。所以你的对象(object)完全不需要和数据库有任何联系。

下面是一个Data Mapper的例子。看起来和Active Record差不多。但是下面代码只是单纯的PHP对象,所以它完全不知道关于数据库的任何消息。因此,我们也不能使用save()方程

$user = new user;
$user->username = 'ou';
所以我们需要用到Entity Manager.

$user = new user;
$user->username = 'ou';
EntityManager::persist($user);

  

 

 5: 失血模型

UserModel{
int id;
string name
}

常用开发架构模式:

  

6: 充血模型

UserModel{
int id;
int name;
punlic function add(name){
   if empty name
   throw  Exception
}
}

常用开发架构模式:

  

  

7: Repository

 Repository这个概念出自”DDD”(Domain-Driven-Design),Repository Pattern提议所有操作最好是基于领域(Domain)进行。同时,他的行为像Java里面的Collection。当然,这是一种抽象的概念。如Collection中存在add、update、remove,contains等函数。同样的,你应该把这些定义到Repository中

 

8: pojo【pojo和javabean存在略微差别,pojo 是马丁提出的,主要解决ejb模式的繁重,do,dto 这些概念已经无法找出来源,大概率还是马丁提出的

使用方式:先写一个核心POJO,然后实现业务逻辑接口和持久化接口,就成了Domain Model; UI需要使用时,就实现数据绑定接口,变成VO(View Object)

  • DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。
  • DTO( Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。
  • VO( View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象。

以上三种比较常用

 

  • BO( Business Object):业务对象。 由Service层输出的封装业务逻辑的对象。
  • POJO( Plain Ordinary Java Object):在本手册中, POJO专指只有setter/getter/toString的简单类,包括DO/DTO/BO/VO等。
  • 所以以上model属于失血模型
  • pojo是在在2000年马丁提出的概念,也常用于领域驱动中

9: pojo 和RO经常用于领域模型设计中

 

 

10: 领域层常用项目结构

│ │ ├── domain
│ │ │ ├── model
│ │ │ │ ├── aggregates
│ │ │ │ │ └── UserRichInfo.java
│ │ │ │ └── vo
│ │ │ │ ├── UserInfo.java
│ │ │ │ └── UserSchool.java
│ │ │ ├── repository
│ │ │ │ └── IuserRepository.java
│ │ │ └── service
│ │ │ └── UserServiceImpl.java