repository

package module
v0.0.0-...-404efc1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 29, 2021 License: MIT Imports: 0 Imported by: 0

README

Паттерн «Репозиторий»

Репозиторий представляет собой концепцию хранения коллекции для сущностей определенного типа. Она не описывает хранение в базах данных или кэширование или решение любой другой технической проблемы. Репозитории представляют коллекции. Как вы храните эти коллекции — это просто деталь реализации.

Пример реализации (см. код)

Представьте, что у вас есть Singleton-экземпляр репозитория для сущностей Member, MemberRepository.

Затем создайте новый объект Member и добавьте его в репозиторий. Позже, вы запросите у репозитория все элементы, хранящиеся в нем, таким образом вы получите коллекцию, которая содержит этот объект внутри. Возможно вы захотите получить какой-то конкретный объект по его ID, это также возможно.

Взаимодействие с репозиторием

Представьте, что мы создаем сущность Member. Мы приводим объект к необходимому состоянию, затем запрос заканчивается и объект исчезает. Пользователь пытается авторизоваться в нашем приложении и не может. Очевидно, что нам необходимо сделать этот объект доступным и для других частей приложения.

member := &Member{email, password}
memberRepository.Save(member)

Позже мы сможем получить доступ к объекту

member := memberRepository.findByEmail(email)
members := memberRepository.getAll()
Должны ли репозитории создавать сущности

Если мы относимся к нашим репозиториям как к простым коллекциям, так значит и не нужно нагружать их лишним функционалом.

В чем выгода использования репозиторием?

Основное преимущество репозиториев — это абстрактный механизм хранения для коллекций сущностей.

Предоставляя интерфейс MemberRepository мы развязываем руки разработчику, который уже сам решит как и где хранить данные.

type MemberRepository interface {
	GetAll() []Member
	Save(m *Member)
	FindByEmail(email string) (Member, bool)
}

Теперь разработчик сможет сам определить реализацию хранения данных

type ArrayMemberRepository struct {}

func (m *ArrayMemberRepository) GetAll() []Member {
  // ...
}

func (m *ArrayMemberRepository) Save(mb Member) {
	// ...
}

func (m *ArrayMemberRepository) FindByEmail(email string) (Member, bool) {
	// ...
}

Таким образом, большинство наших приложений знает только абстрактное понятие MemberRepository и его использование может быть отделено от фактической реализации.

Дополнительная информация

Весь текст взят из этой статьи, минимизирован и адаптирован под Go.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Member

type Member struct {
	Email, Password string
}

type MemberRepository

type MemberRepository interface {
	GetAll() []Member
	Save(m Member)
	FindByEmail(email string) (Member, bool)
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL