@imsetup

Я усложняю или так правильно?

Я решил написать каркас чистой архитектуры, который бы использовал в дальнейшем в своих pet-project. Я опирался на принятые сообществом Golang правила .
Так вот ближе к вопросу, на данный момент у меня архитектура примерно такова:
├── internal
│ ├── users/v1
│ │ ├── service
│ │ ├── repository
│ │ │ ├── postgresql
│ │ │ │ ├── postgresql.go
│ │ │ ├── redis
│ │ │ │ ├── redis.go
│ │ └── handler

(Лишнее я не стал писать, лучше сосредоточимся на проблеме)

В файлах postgresql.go и redis.go находятся интерфейсы, структуры и функция(Adapter), которая возвращает interface
code
package postgresql

type PostgreSQL interface {
	Test()
}

type postgreSQLRepository struct {
}

func NewPostgreSQL() PostgreSQL {
	return &postgreSQLRepository{}
}

func (r *postgreSQLRepository) Test() {}


Инициализация баз данных будет примерно такая:
code
userPostgresql := postgresql.NewPostgreSQL
userRedis := redis.NewRedis


и дальше таких инициализаций будет еще больше, эту проблему я решил, добавив в repository файл repository.go с таким кодом
code
package repository

func NewRedis() redis.Redis {
	return redis.NewRedis()
}

func NewPostgreSQL() postgresql.PostgreSQL {
	return postgresql.NewPostgreSQL()
}


и теперь инициализация в главном файле выглядит куда красивее:
code
func main() {
	repository.NewPostgreSQL()
	repository.NewRedis()
}


Теперь вопрос: Правильно ли я сделал или я слишком усложнил код? Конечно, я находил решение, просто кидать файлы postgresql,go, redis.go в repository, но мне такой исход не понравился, потому что там еще будут тесты и все перемешается.
Я надеюсь на открытый ответ и если у вас есть решение по проще, рад был бы выслушать вас.
  • Вопрос задан
  • 265 просмотров
Пригласить эксперта
Ответы на вопрос 2
yellow79
@yellow79
Senior Software Engineer
По ссылке нет никаких принятых сообществом правил. Это просто чья-то фантазия, о чём писал Расс Кокс в issue данного репозитория.

Интерфейсы в go принято объявлять там, где они будут использоваться, а не там, где создаётся структура реализующая данный интерфейс. У вас функции возвращают интерфейс, так в go не принято, функция может принимать значения и интерфейсы, но возвращать должна значения, исключение интерфейс error.

Я бы вам рекомендовал ознакомиться с переводом советов от Дэйва Чейни, многое прояснится, там же есть ссылка на оригинал. Сам регулярно перечитываю данный материал
Ответ написан
Комментировать
@mayton2019
Bigdata Engineer
Если ты начинающий - то лучше написать работающее приложение. А архитектура должна быть мотивированной.
Вот в книжках по шаблонам проектирования так и пишут дескыть motivation.

А если на пустом hello world делать архитектуру - то оно выглядит как-то странно. И принцип KISS/Yagni
никто не отменял. И бритву Оккама.
Ответ написан
Ваш ответ на вопрос

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

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