domain-model

这篇文档尝试概述领域模型和Repository

什么是领域模型?

从最简单的层面上来讲,领域模型就是代码的类。这有什么好说的,每天都在写类。领域模型也是数据库实体类,然而并没有什么不同。
领域模型是微服务架构中传输的数据类,实体也有。

到底什么是领域模型?在Eric Evans的书中,其实有两种解释,战略和战术。战略上,领域模型是这个真实世界的映射。战术上,如何
定义领域模型的实体类,如何操作,如何在分层中传递,又是如何构造,有很多的讨论。

解决什么问题?

想看存在什么问题。复杂系统中,经常有那种没有人愿意去维护的系统,原因有很多。一是弄不明白。二是改一下都是bug。代码内部就是一团
一团的毛线。

如果给你一个系统,首先这个系统有一个简介,简单介绍他是解决什么问题,如何工作的。大致了解后,有一个目录,每一个目录相对独立。
目录里面的每一个标题清晰的解释了自己。根据目录指定的位置,可以定位到那里,内容清晰。可能还会分层一、二、三个段落,每一个段落
都有一个段落的标题。这就是我们学习的模式。

用领域模型来实现阅读某一个章节的内容。

1
2
3
class Book {
public List<TableOfContent> tableOfContents;
}
1
2
Book book;
String text = book.getChapter("第一章").getChappter("第一节 领域模型").getSegment(1);

text就是这本书第一章第一节的第一段,我看过很多代码是这样的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$book = [];
$segments = [];

foreach ($book['chapters'] as $chapters) {
foreach ($chapters as $chapters2) {
if ($chapters2 == "第一节 领域模型") {
foreach ($segments as $segment) {
if ($segment['chapter_id'] == $chapters2) {
$text = $segment[1];
}
}
}
}
}

很明显,java有着容易认知的优势。这是一个查询的案例,如何是保存呢?

如果我是一个作者,我想要为这本书添加一个段落。

1
2
3
4
5
6
7
8
9
class BookService {
@AutoWired
private BookRepository bookRepository;

public void write() {
book = bookRepository.findByName("领域模型")
book.getChapter("第一章").getChappter("第一节 领域模型").write("这是第二段");
}
}

再来一个反模式的案例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$book = [];
$segments = [];

foreach ($book['chapters'] as $chapters) {
foreach ($chapters as $chapters2) {
if ($chapters2 == "第一节 领域模型") {
foreach ($segments as $segment) {
if ($segment['chapter_id'] == $chapters2) {
$segments[] = "这是第二段";
break;
}
}
}
}
}

这里有一个问题,通常我们需要添加到数据库中。所以,还需要添加一些东西

1
bookRepository.save(book);

java完成,来看看反面案例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$book = [];
$segments = [];

foreach ($book['chapters'] as $chapters) {
foreach ($chapters as $chapters2) {
if ($chapters2 == "第一节 领域模型") {
foreach ($segments as $segment) {
if ($segment['chapter_id'] == $chapters2) {
$segments[] = "这是第二段";
$sql = "insert into segments (chapter_id, text) values (?, ?)";
$db->execute($sql, $chapter_id, $segments[1]);
break;
}
}
}
}
}

我们来看看代码结构可能是这样的。

1
2
3
4
|-./book
|-./book/Book.java
|-./book/BookService.java
|-./book/BookRepository.java

另外可能是这样的

1
2
|-/
|-/BookController.php

从领域模型中我们可以看到知识和关系。类的名字和属性然我们对这个事务有大概的认识,类里面的关系。

关系

一对一关系

一对多关系

在实际应用场景中是这样的

1
2
3
4
class Book {
@OneToOne
public List<TableOfContent> tableOfContents;
}

多对多关系

存在的问题

golang没有办法实现Jpa或者是Hibernate这样的模式,golang现存的ORM框架中还没有可以支持关系处理的。那么只能是手工编写SQL,也没有办法先对对象的状态进行修改,然后一次持久化到数据库中。而是每一个都需要单独处理。

Service

MVC框架盛行的时候,如上面的代码,所有的逻辑处理完成后作为一个数据集合Set到视图中给视图使用。

不知道从什么时候开始,