前一段时间看了 Bob 大叔的《整洁架构之道》,不过那本书里没有提到具体要如何做,一直想在自己的项目实践一下。
整洁架构
搜索了一下,看看有没有哪些项目在用 Bob 大叔介绍的 clean architecture(CA) 的方式来组织,可以参考一下,搜索到了几个 repo,对比了下,基本的组织结构是符合 CA 的,还有的有一定的变种,比如加上了 DDD(领域驱动开发,Domain Driven Development),我总结了一下几种文件组织的方式,按照 CA 那个图从内到外划分:
-
Entities/Domains: 定义了核心的业务逻辑,不依赖于任何实现。可以是一组方法的或者数据+方法的对象,ts 中可以用接口来定义
-
Use cases/application/app: 一个 use case 是 entities 的一个特例,实现了具体的业务,例如 addPost,updatePost。依赖从外部注入(比如作为函数参数),而不是直接 import。
-
Adapters/Interfaces/implementations/controllers: 连接 use case 和外部具体的实现类。负责路由,controller,格式转换等。
-
Frameworks/infrastructure/drivers: 是具体的类和框架等。例如,mongoose,redis,express 等。在这里注入依赖,将所有的部分连接起来。
其中一个项目还将 domain 按照 subdomain 来进行划分,subdomain 就像一个模块一样,将上面的几个部分细分到每个 subdomain 中,也就是说每一个 subdomain 内部都包含了一个 CA 的架构。
这是我搜索到的几个项目:
- https://github.com/stemmlerjs/ddd-forum
- https://github.com/yuraxdrumz/clean-architecture-example (https://yuriktech.com/2019/06/11/Implementing-Clean-Architecture/ 这篇文章有介绍)
- https://github.com/royib/clean-architecture-node
- https://github.com/talyssonoc/node-api-boilerplate
- https://github.com/jbuget/nodejs-clean-architecture-app
ddd-forum
其中我比较喜欢 https://github.com/stemmlerjs/ddd-forum 的组织方式:
- 前后端都有
- 划分为多个模块(subdomain),每个模块下面按照 DDD + CA 进行划分
- 分层更细,每个模块将 DDD + CA 分为最多 7 个 部分(domain,dtos,infra,mappers,repos,services,useCases)
- 适合大型和需要多人协作的项目
不过使用这种组织方式的时候要注意:
- 对于简单的项目帮助不一定很明显,因为模块划分的更细相当于提高了一定的复杂度
- DDD 在理解和使用上需要学习,有一定的门槛
clean-architecture-example
这个项目支持 typescript,和 CA 的架构很符合,如何我开始一个简单的 nodejs 项目,我会参考这个架构。
其它
其它 3 个项目也是 nodejs 的项目,不支持 typescript,如果项目不支持 typescript,可以考虑参考这几个项目。
总结
有个好的架构可以让项目的协作和维护更容易,你喜欢什么样的架构?
网友评论