我正在使用谷歌云数据存储(或谷歌应用引擎数据存储)来存储不同的对象。这些对象中的大多数都是相似的,因此我最终得到了大量的代码重复。
例如,这里有两个创建方法,两个不同的对象,account
和 index
。
func (account *Account) Create(ctx context.Context) (*Account, error) {
if ret, err := datastore.Put(ctx, account.newKey(ctx), account); err != nil {
log.Errorf(ctx, "Error while creating Account : %v\n", err)
return nil, err
} else {
account.Id = strconv.FormatInt(ret.IntID(), 10)
}
return account, nil
}
func (index *Index) Create(ctx context.Context) (*Index, error) {
if ret, err := datastore.Put(ctx, index.newKey(ctx), index); err != nil {
log.Errorf(ctx, "Error while creating Index : %v\n", err)
return nil, err
} else {
index.Id = strconv.FormatInt(ret.IntID(), 10)
}
return index, nil
}
如您所见,除了持有者类型、返回类型和错误消息之外,这两个片段是相同的。
避免这种代码重复的惯用方法是什么?
最佳答案
使用接口(interface)定义方法New Key()
和Set ID()
type Entity interface {
SetId(id int64)
NewKey(c context.Context) *datastore.Key
}
func create(c context.Context, entity Entity) error {
if ret, err := datastore.Put(c, entity.NewKey(c), entity ); err != nil {
log.Errorf(c, "Error while creating entity: %v\n", err)
return err
} else {
entity.SetId(ret.IntID())
return nil
}
}
func (index *Index) Create(c context.Context) (*Index, error) {
return index, create(c, index)
}
func (account *Account) Create(c context.Context) (*Account, error) {
return account, create(c, account)
}
关于google-app-engine - 使用 golang 中的接口(interface)避免代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39720221/