Ну допустим такая
type Object struct {
ID string
Property string
}
Типичный вариант использования - это обновить в ней поле, сохранить это изменения в базе данных и далее использовать изменённый объект.
Как лучше реализовать структуру Object + интерфейс репозитория? Какой из этих вариантов лучше?
Вариант 1
type Object struct {
id string
property string
repository ObjectRepository
}
type ObjectRepository interface {
Store(o Object) error
GetByID(ID string) (Object, error)
UpdateProperty(ID string, newProperty string) error
}
func NewObject(id string, property string, rep ObjectRepository) Object {//}
func (o *Object) ID() string { return o.id }
func (o *Object) Property() string { return o.property }
func (o *Object) SetProperty(value string) {
o.property = value
o.repository.UpdateProperty(o.ID, property)
}
Использование
o := NewObject("1", "Val1", r)
o.SetProperty("Val2")
//Use o
Вариант 2
type Object struct {
Id string
Property string
}
type ObjectRepository interface {
Store(o Object) error
GetByID(ID string) (Object, error)
Update(Object) error //Copy all changes to db
}
Использование
o := Object{ID:"1", Property:"Val1"}
o.Property = "Val2"
r.Update(o)
//Use o
А потом нам надо обновить 1к объектов и начинаются страдания
Вариант 1 не репозиторий, это что-то ужасное. Вариант 2 — классический репозиторий. Так обычно и делают. Можете, конечно, любой другой шаблон проектирования использовать, но любой из них требует явного сохранения
Обсуждают сегодня