我最近写了一个Go微服务应用程序,这个程序的设计来自三个灵感:
-
清晰架构"Clean Architecture"¹ and SOLID (面向对象设计)² 设计 原则³
-
Go的简洁设计⁵ 特别是 Go的面向对象的设计⁶
我使用Spring的基于接口的编程和依赖注入(Dependency Injection)来实现Bob Martin的清晰架构(Clean Architecture),并遵循了Go的简单编程风格。当它们之间存在冲突时,进行了取舍。我只采用了Clean Architecture的设计原则(主要是SOLID),因此实现的细节可能与其他SOLID实现不同。
我来自Java背景,对前两个设计思想非常熟悉。在学习了Go之后,我逐渐认同了Go的简单风格。粗略来说,有两种不同的编程风格,一种是面向对象的, 它强调设计;另一种是非面向对象的,它信奉用最简单的代码来实现用户需要的功能,无需预先设计。 Go更接近第二阵营,尽管它有一些面向对象的功能。 Go的编程思路为我提供了一个重新评估面向对象编程的新视角,并影响了我的编码风格。结果是我只在必要时才进行面向对象的设计,而我更倾向于使用更简单的解决方案而不是完美的方案。
设计原则:
-
基于接口编程(Programming on interface)⁷
本程序有三个主要业务层,用例(usecase),数据服务(dataservice)和域模型(model),其中只有域模型没有接口,因为没有必要。 当你访问外部服务时,你可以通过接口进行访问。
// sqlUserDataServiceFactory is a empty receiver for Build method type sqlUserDataServiceFactory struct{ } func (sudsf *sqlUserDataServiceFactory) Build(c container.Container, dataConfig