bxcodec 在写完上一篇文章 后,收到了 pull request。由此,作者尝试做了一些改进,在最新的 master 分支中引入了 domain package
。
以下为旧结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
models
├── article.go
├── author.go
└── errors.go
article
├── delivery
│ └── http
│ ├── article_handler.go
│ └── article_test.go
├── mocks
│ ├── ArticleRepository.go
│ └── ArticleUsecase.go
├── repository //Encapsulated Implementation of Repository Interface
│ ├── mysql_article.go
│ └── mysqlarticle_test.go
├── repository.go // Repository Interface
├── usecase //Encapsulated Implementation of Usecase Interface
│ ├── articleucase_test.go
│ └── artilce_ucase.go
└── usecase.go // Usecase Interface.
可以看出,在旧结构中,模块(比如:article)中包含了具体实现和“合同”(ArticleUsecase, ArticleRepository)。
因此,作者尝试采用 Ben Johnson 在 https://medium.com/@benbjohnson/standard-package-layout-7cdbc8391fc1 中提出的一项新改进。
对于 domain package
,作者并没有把它移到项目根目录下,而是将其移动到单一的 package 中,以便与旧结构中使用的 models package
保持一致。
以下为新结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
domain
├── mocks
│ ├── ArticleRepository.go
│ ├── AuthorRepository.go
│ └── ArticleUsecase.go
├── article.go
├── author.go
└── errors.go
article
├── delivery
│ └── http
│ ├── article_handler.go
│ └── article_test.go
├── repository //Encapsulated Implementation of Repository Interface
│ └── mysql
│ ├── mysql_article.go
│ └── mysqlarticle_test.go
└── usecase //Encapsulated Implementation of Usecase Interface
├── articleucase_test.go
└── artilce_ucase.go
作者将 models 改名为 domain,并将所有接口“合同”( Usecase、Repository)移入 domain package 中。
作者在末尾也提到,还不知道新结构有没有比旧结构更好?但是,作者将尝试在项目中使用这种新结构。如果发生任何问题,这个 PR 将关闭。但是,如果对于开发人员来说,使用新结构很好并且更舒适,那么作者便会将其合并到主分支中。