Golang Import Cycle Challenge - PullRequest
       11

Golang Import Cycle Challenge

0 голосов
/ 26 октября 2018

У меня проблема с циклической зависимостью (цикл импорта не разрешен) в моем коде go, и я не уверен, что это лучший способ ее устранения.Я думаю, что мое непонимание интерфейсов golang может повлиять на мою способность видеть путь вперед.

Моя проблема - у меня есть два пакета:

  • Событие - Событие в основном является «родительским» и будет делать много вызовов в пакет тренировки
  • Тренировка - В одном случае мне нужно вызвать пакет события, и это создает циклическую зависимость, потому что событие ужепотребляет Workout

Каков наилучший способ, позволяющий Workout вызывать функцию (а не метод объекта) в домене событий?

Ниже приведен упрощенный код, помогающий обеспечить некоторый контекст

//workout package
//This is a private function on the workout package that is 
//attempting to call a public function on the Event Package
func findWorkoutAssociatedToActivityTcx(txcObject *DataTcx) *EventWorkout{
    return event.GetEventByDate(txcObject.ActivityDate, "", "")
}

Можно ли создать интерфейс для этой функции?Я не до конца понимаю, как бы я это сделал.Большое спасибо.

// ОБНОВЛЕНИЯ - Код при попытке установить интерфейс

//WorkoutPackage
//workout package
//This is a private function on the workout package that is
//attempting to call a public function on the Event Package
func findWorkoutAssociatedToActivityTcx(txcObject *DataTcx, userID, transactionID string) *Workout {
    //return event.GetEventByDate(txcObject.ActivityDate, "", "")
    MyEventFinder.GetEventByDate(txcObject.ActivityDate, userID, transactionID)
    return nil
}

var MyEventFinder EventFinder

type EventFinder interface {
    GetEventByDate(time.Time, string, string) (*sharedstructs.ListOfEvents, error)
}

// Пакет событий

type eventProvider struct{}

func (e eventProvider) GetEventByDate(date time.Time, userID, transactionID string) (*sharedstructs.ListOfEvents, error) {
        redFalconLogger.LogDebug("event.GetEventByDate: ", transactionID)
        if date.IsZero() || userID == "" {
            return nil, sharedstructs.InvalidData{Msg: "Invalid date or userID"}
        }
        //Create the query params
        queryParamArray, queryParamCreationError := createQueryParamForQueryByDate(&date, &userID)
        if queryParamCreationError != nil {
            return nil, queryParamCreationError
        }
        //perform the query - pass empty orderBy because I don't care
        queryResults, queryError := queryForEvent(*queryParamArray, "")
        if queryError != nil {
            switch queryError.(type) {
            case firestorehelper.UnqueryableCollection:
                return nil, sharedstructs.Forbidden{Msg: "operation is forbidden, probably due to malformed query"}
            default:
                return nil, sharedstructs.InternalServerError{Msg: "something went wrong in the query"}
            }
        }
        return queryResults, nil
    }

1 Ответ

0 голосов
/ 26 октября 2018

Вы уверены, что можете сделать это с помощью интерфейса. В пакете событий вам нужно дать GetEventByDate структуру получателя:

type eventProvider struct {}
func (e eventProvider) GetEventByDate(t time.Time, a, b string) *workout.EventWorkout{...}

Затем в тренировочном пакете:

type EventFinder interface {
    GetEventByDate(time.Time, string, string) *EventWorkout
}

Затем вы можете передать экземпляр eventProvider в пакет тренировки и использовать его только через интерфейс EventFinder, который не зависит от времени компиляции пакета event. Вы не показываете, как вызываете пакет workout, но это может быть либо параметром для вызова метода, либо установкой его при построении структуры в пакете тренировки.

...