来自 OOP 范式并从 OOP 语言移植代码,我现在遇到了一个问题,该问题通过抽象在 OOP 中解决,所以我想知道如何在 Go 中解决以下问题,该问题遵循组合而不是继承。
在这种情况下,我的 ValueObjects(DTO、POJO 等)由其他 ValueObjects 组成。我通过返回 json 的 Web 服务调用来填充它们,所以基本上我的函数/方法调用对于所有类型和子类型都是通用的。
我的超级类型EntityVO
type EntityVO struct {
EntityName string
EntityType string
PublicationId string
Version string
}
Run Code Online (Sandbox Code Playgroud)
由 EntityVO 组成的子类型 1
type ArticleVO struct {
EntityVO
ContentSize string
Created string
}
Run Code Online (Sandbox Code Playgroud)
由 EntityVO 组成的子类型 2,具有自己独特的字段集
type CollectionVO struct {
EntityVO
ProductId string
Position string
}
Run Code Online (Sandbox Code Playgroud)
我正在调用 Web 服务来检索数据并填充这些 VO。
早些时候,我有一个函数来调用 Web 服务并填充数据,但现在我正在为每个 VO 复制代码。
type Article struct{}
func (a *Article) RequestList(articleVO *valueObject.ArticleVO) (*valueObject.ArticleVO, error) {
// some code
}
Run Code Online (Sandbox Code Playgroud)
复制相同的代码但更改签名。
type Collection struct{}
func (c * Collection) RequestList(collectionVO *valueObject.CollectionVO) (*valueObject.ArticleVO, error) {
// some code - duplicate same as above except method signature
}
Run Code Online (Sandbox Code Playgroud)
我有几个实体,仅仅因为我的 VO 不同,我被迫复制代码并迎合我拥有的每种类型的 VO。在 OOP 中,子类型可以传递给接受超类型的函数,但在 go 中不能,所以想知道应该如何做,这样我就不会得到仅签名不同的重复代码?
在这种情况下有什么更好的方法建议吗?
这就是 golang 接口大放异彩的地方。
然而值得注意的是,在 golang 中编写子类/继承代码是很困难的。我们更愿意将其视为组合。
type EntityVO interface {
GetName() string
SetName(string) error
GetType() string
...
}
type EntityVOImpl struct {
EntityName string
EntityType string
PublicationId string
Version string
}
func (e EntityVOImpl) GetName() string {
return e.EntityName
}
...
type ArticleVOImpl struct {
EntityVOImpl
ContentSize string
Created string
}
type CollectionVOImpl struct {
EntityVO
ProductId string
Position string
}
// CODE
func (e *Entity) RequestList(entityVO valueObject.EntityVO) (valueObject.EntityVO, error) {
// some code
}
Run Code Online (Sandbox Code Playgroud)
此外,只要您的接口文件是共享的,我认为通过线路发送/编组/解组结构就不应该有任何问题。