Задать вопрос
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() экспортируемым, чего не хотелось бы.

Есть какие-нибудь другие варианты реализации такой "иерархии"?
  • Вопрос задан
  • 247 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 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)


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

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

Похожие вопросы