2013-09-05 2 views
1

Я пытаюсь выяснить идиоматический способ структурирования моделей в Go, но у меня возникли проблемы с поиском образцов для более крупных приложений типа предприятия (просто много кошек и собак, которые говорят ...).Модели структурирования в Go

Я начал, помещая каждый из моих моделей в отдельный пакет, так что, казалось, производят чистейшую API использовать модели:

import "models/person" 

person.New(...)  // returns the newly created person 
person.GetById(123) // returns a single person 
person.GetAll()  // returns a list of people 

Однако, я столкнулся с проблемой, что мои модели должны слишком много ссылок друг на друга. Я закончил с пакетами, которые выглядят так:

-- File person.go 
package Person 
import "models/team" 

type Person struct { 
    Name string 
    Team Team 
} 

func (p *Person) New(...) *Person { 
    ... 
} 

-- File team.go 
package Team 
import "models/person" 

type Team struct { 
    Name string 
    People []*Person 
} 

func (t *Team) New(...) *Team { 
    ... 
} 

Это не работает, потому что теперь у меня есть циклическая ссылка. Должен ли я просто добавлять все эти модели в один и тот же пакет, чтобы API выглядел так?

import "model" 

model.NewPerson(...)  // returns the newly created person 
model.GetPersonById(123) // returns a single person 
model.GetAllPeople()  // returns a list of people 

Или я должен использовать интерфейсы для решения этой проблемы (и если да, то на что они похожи)?

У меня также есть вопросы о том, как обращаться с такими вещами, как соединения с базой данных. Как обычно люди подключают базу данных к своим моделям (напрямую или через какой-то промежуточный объект)? Нужно ли каждому звонку использовать интерфейс для какой-либо базы данных в качестве параметра или есть лучший способ сделать это?

Есть ли более крупный пример структурирования полного API Rest в Go Go? Я нашел один пример here, но он все еще довольно маленький, и автор отмечает, что он новичок в Go, поэтому я не уверен, сколько из этого нужно доверять.

Спасибо!

ответ

0

Нет необходимости размещать каждую модель в отдельной упаковке. Фактически, они могли бы, вероятно, просто пойти в основной пакет. Если несколько пакетов имеют разные взаимные зависимости друг от друга, они не являются концептуально раздельными, чтобы быть отдельными пакетами в любом случае.

0

Не нужно объединять все модели в единый пакет, чтобы прервать циклическую проблему импорта. Вместо этого я предлагаю использовать интерфейсы.

Некоторые (вероятно, листовые) пакеты определяют только интерфейс, который определяет поведение вашей модели. Примечание: интерфейсы не определяют данные. Но любые данные можно абстрагировать как поведение с помощью методов getter и setter. Тогда у вас может быть любое количество объектов, которые удовлетворяют этому интерфейсу в любом месте, которое вы предпочитаете, - в отдельных пакетах или нет.

Этот подход также упрощает тестирование (возможно, издевательства) модели.

Смежные вопросы