2016-09-27 7 views
2

다른 개체를 저장하기 위해 Google Cloud Datastore (또는 Google 앱 엔진 데이터 저장소)를 사용하고 있습니다. 이러한 객체의 대부분은 유사하므로 많은 코드 중복으로 끝납니다.golang의 인터페이스로 코드 중복 방지

예를 들어 두 개의 서로 다른 오브젝트 인 accountindex의 두 가지 작성 메소드가 있습니다.


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 
} 

당신이 볼 수 있듯이

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 
} 

, 두 조각은, 홀더 유형, 반환 유형 및 오류 메시지 excepts 동일합니다.

이런 종류의 코드 중복을 피하는 관용적 인 방법은 무엇입니까?

답변

2

사용 인터페이스는 내가이 시도 방법 & 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

NewKey()을 정의하지만'는 방법없는 create' 기능을 가지고 이상한 느낌. 그 이유는 여러 종류의 엔티티가있을 수 있기 때문입니다. 식별 된 것들과 미확인 된 것들. 그리고 나는이 서로 다른 엔티티에 대해 다르게 'create'함수를 구현해야합니다. 그래서 각 엔티티의 메소드로 만들고 싶었지만 엉망이되었습니다. 하지만 메소드에 의존하는 대신에'createIdedEnt'와'createUnidedEnt'와 같이이 함수들을 다르게 명명해야 할 것 같습니다. – etnbrd

+0

엔티티에서 데이터 액세스 레이어를 분리합니다. : AccountDal(). Create (ctx, account). –