我正在使用Google Cloud Datastore(或Google应用引擎数据存储区)来存储不同的对象。大多数这些对象都是相似的,因此我最终会有大量的代码重复。
例如,以下是两个创建方法,包含两个不同的对象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
}
正如您所看到的,两个片段是相同的,除了持有者类型,返回类型和错误消息。
避免这种代码重复的惯用方法是什么?
答案 0 :(得分:2)
使用界面定义方法NewKey()
& SetID()
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)
}