seutil
@seutil

Как спроектировать архитектуру?

Имеется хранилище паролей, которое может быть JSON файлом или браться из SQLite. Иерархия следующая:
Storage-> Folder -> Item -> Data.
Хочется чтобы при изменении, или создании, Item'а или Folder'а Storage меняло своё состояние с Opened на Modified.

Пока имеется два варианта:
1. God Interface(поскольку проект на go), который содержит всякие методы по добавлению и удалению(их получается 8), к уже 5 имеющимся
2. Иерархия интерфейсов, которые содержат методы Storage(), Folder(), Item() для Folder'а, Item'а и Data соответственно, которые возвращают интерфейс "родителя".

God Interface решает проблему, но слишком много методов для одного интерфейса;
Иерархия интерфейсов разделяет логику, но для изменения состояния придётся городить штуки вроде item.Folder().Storage().SetStatus(Modified), но и сделать метод SetStatus() экспортируемым, чего не хотелось бы.

Есть какие-нибудь другие варианты реализации такой "иерархии"?
  • Вопрос задан
  • 242 просмотра
Решения вопроса 1
@falconandy
но и сделать метод SetStatus() экспортируемым, чего не хотелось бы.

Можете создать отдельные интерфейсы для таких методов, тогда они будут доступны при явном приведении.
Что-то типа:
type Item interface {
	// public methods
	Folder() Folder
}

type Folder interface {
	// public methods
	Storage() Storage
}

type Storage interface {
	// public methods
}

type StorageInternal interface {
	SetStatus(status StorageStatus)
}

item.Folder().Storage().(StorageInternal).SetStatus(StatusModified)


Возможно в вашем случае можно сделать новый интерфейс неэкспортируемым, тогда он не будет доступен извне.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы