工程架构设计的核心是面向接口编程
展开来讲,就是架构需要分层,层之间通过interface交互而不依赖具体实现,达到高内聚低耦合的效果
什么是好的工程架构
- 不依赖特定UI
- 不依赖特定框架。从web框架换成桌面应用框架,whatelse,不影响业务逻辑
- 不依赖特定外部组件。例如可以使用任意db,如mysql、mongo,不与某一基础设施强耦合
如何做到好的工程架构
总的原则还是面向接口编程,接口可以解耦,可以替换成任何不同的具体实现而不影响业务逻辑本身
具体地,一个好的工程架构如上图示范
- 越外层(主要指使用的基础设施)越具体,越容易变化;越内层(主要指业务逻辑本身)越抽象越核心,越不容易变
- 内层是高度抽象的,只能跟着业务逻辑变化,而不受基础设施变化的影响。内层不能依赖外层,而是外层依赖内层。那么如何理解DB这些基础设施要去依赖内层的业务逻辑?这是因为,是业务逻辑定义了外部基础设施的interface,然后随便你什么基础设施去做interface的具体实现,把具体实现注入到内层(如use cases)即可(内层预留注入口)
说到这里可能还是略微有点抽象,其实golang的OpenTelemetry-Go就是个很好的案例
OpenTelemetry-Go提供了一套Telemetry interface,也提供了具体实现
当然,如果你不喜欢它的实现,你可以自行对Telemetry interface进行实现
任何的具体实现,都可以通过如SetTracerProvider
这类的方法注入到工程中使用
// SetTracerProvider registers `tp` as the global trace provider.
func SetTracerProvider(tp trace)
网友评论