Как избежать циклов зависимости с общими пакетами? - PullRequest
0 голосов
/ 16 октября 2019

Я знаю, что об этом часто спрашивают, но я все еще не понимаю, как это исправить. Скажем, у меня есть такая структура:

foo
- foos.go      // custom foo type
database
- database.go  // interface
- postgres.go  // implementation

В database.go Мне нужно импортировать foo, поэтому я могу saveOnDb(foo.myfoo), а в foos.go Мне нужно импортировать database, чтобы я могdatabase.saveOnDb(myfoo).

Не компилируется из-за цикла импорта. Каким будет правильный дизайн?

Ответы [ 2 ]

1 голос
/ 16 октября 2019

База данных не должна зависеть от foo, она должна быть достаточно абстрактной.

Вместо saveOnDb(foo.myfoo) вы могли бы использовать интерфейс?

type somefoo interface{}

saveOnDb(somefoo)

, затем назвать его

database.saveOnDb(myfoo)
0 голосов
/ 16 октября 2019

Еще один способ подойти к этому - поручить foo вместо сохранения в базе данных, поэтому foo вызывает пакет db, а другие пакеты просто вызывают foo.Save и не заботятся о пакете db. Поэтому вместо:

database.saveOnDb(myfoo)

Если вы хотите сохранить поля foo, используйте этот метод на экземпляре foo, который использует пакет базы данных для внутреннего сохранения:

foo.Save()

А такжев пакете foos (или foo) вы, вероятно, захотите

foos.Create()
foos.Find()
foos.FindAll() 

, которые знают все о foos и как их вернуть - пакет db не должен знать об этом, поэтому он не должен импортировать foo.

Ваш пакет базы данных определенно не должен знать о конкретных типах, он должен знать о взаимодействии с базой данных. Также взгляните на некоторые формы, если вы предпочитаете более общее решение (но для этого потребуется использовать интерфейс {}).

...