2016-09-27 63 views
2

我正在使用Google Cloud Datastore(或Google應用程序引擎數據存儲)來存儲不同的對象。大多數這些對象是相似的,因此我最終導致大量的代碼重複。避免代碼與golang中的接口重複

作爲示例,下面是兩個不同對象的創建方法:accountindex

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 
} 

正如你可以看到,這兩個片段是相同的,對於保持架型,返回類型,以及錯誤消息節選。

什麼是避免這種代碼重複的慣用方法?

回答

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) 
} 
+0

我想這一點,但感覺奇怪,有'create'不是一個方法的功能。原因是我可能有幾種實體。例如,識別出來的和未識別出來的。我需要爲這些不同的實體實現不同的'create'功能。 所以我想讓它成爲每個實體的一種方法,但最終變得一團糟。 但我想我將不得不命名這些函數,如'createIdedEnt'和'createUnidedEnt',而不是依賴方法。 – etnbrd

+0

我會從實體分離數據訪問層。 like:AccountDal()。Create(ctx,account)。 –