2
다른 개체를 저장하기 위해 Google Cloud Datastore (또는 Google 앱 엔진 데이터 저장소)를 사용하고 있습니다. 이러한 객체의 대부분은 유사하므로 많은 코드 중복으로 끝납니다.golang의 인터페이스로 코드 중복 방지
예를 들어 두 개의 서로 다른 오브젝트 인 account
과 index
의 두 가지 작성 메소드가 있습니다.
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 동일합니다.
이런 종류의 코드 중복을 피하는 관용적 인 방법은 무엇입니까?
NewKey()
을 정의하지만'는 방법없는 create' 기능을 가지고 이상한 느낌. 그 이유는 여러 종류의 엔티티가있을 수 있기 때문입니다. 식별 된 것들과 미확인 된 것들. 그리고 나는이 서로 다른 엔티티에 대해 다르게 'create'함수를 구현해야합니다. 그래서 각 엔티티의 메소드로 만들고 싶었지만 엉망이되었습니다. 하지만 메소드에 의존하는 대신에'createIdedEnt'와'createUnidedEnt'와 같이이 함수들을 다르게 명명해야 할 것 같습니다. – etnbrd엔티티에서 데이터 액세스 레이어를 분리합니다. : AccountDal(). Create (ctx, account). –