2
我正在使用Google Cloud Datastore(或Google應用程序引擎數據存儲)來存儲不同的對象。大多數這些對象是相似的,因此我最終導致大量的代碼重複。避免代碼與golang中的接口重複
作爲示例,下面是兩個不同對象的創建方法: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
}
正如你可以看到,這兩個片段是相同的,對於保持架型,返回類型,以及錯誤消息節選。
什麼是避免這種代碼重複的慣用方法?
我想這一點,但感覺奇怪,有'create'不是一個方法的功能。原因是我可能有幾種實體。例如,識別出來的和未識別出來的。我需要爲這些不同的實體實現不同的'create'功能。 所以我想讓它成爲每個實體的一種方法,但最終變得一團糟。 但我想我將不得不命名這些函數,如'createIdedEnt'和'createUnidedEnt',而不是依賴方法。 – etnbrd
我會從實體分離數據訪問層。 like:AccountDal()。Create(ctx,account)。 –