Найти в Дзене
ГоГофер

Чистая архитектура в Golang (начало)

Чистая архитектура в программировании на языке Golang

В мире программирования существует множество различных подходов к проектированию приложений. Одним из наиболее популярных и эффективных подходов является чистая архитектура. В данной статье мы рассмотрим, что такое чистая архитектура, как ее использовать при разработке приложений на языке Golang и приведем примеры кода.

Что такое чистая архитектура?

Чистая архитектура – это подход к проектированию приложений, который основывается на принципе разделения ответственности (Separation of Concerns). Основная идея заключается в том, что приложение должно быть разбито на слои, каждый из которых отвечает за определенную функциональность. Каждый слой должен быть независимым и не должен зависеть от других слоев.

Основными принципами чистой архитектуры являются:

1. Независимость от фреймворков и библиотек.

2. Разделение на слои.

3. Использование интерфейсов.

4. Принцип единственной ответственности (Single Responsibility Principle).

5. Принцип инверсии зависимостей (Dependency Inversion Principle).

Как использовать чистую архитектуру при разработке на Golang?

Для использования чистой архитектуры при разработке на Golang необходимо разбить приложение на слои. Каждый слой должен быть независимым и иметь свои интерфейсы.

Ниже приведен пример структуры проекта на Golang, который использует чистую архитектуру:

```

├── cmd

│  └── main.go

├── internal

│  ├── domain

│  │  ├── models.go

│  │  ├── repository.go

│  │  └── usecase.go

│  ├── infrastructure

│  │  ├── database.go

│  │  └── repository.go

│  ├── interfaces

│  │  ├── handlers.go

│  │  ├── http

│  │  │  ├── router.go

│  │  │  └── server.go

│  │  └── repository.go

│  └── services

│    └── myservice.go

├── pkg

├── vendor

├── go.mod

└── go.sum

```

Как видно из примера, проект разбит на следующие слои:

1. cmd – слой приложения, который отвечает за запуск и конфигурацию приложения.

2. internal – слой бизнес-логики, который содержит доменные модели, репозитории и usecase-сценарии.

3. infrastructure – слой инфраструктуры, который содержит реализации репозиториев и баз данных.

4. interfaces – слой интерфейсов, который содержит обработчики запросов и реализации репозиториев для взаимодействия с внешним миром.

5. services – слой сервисов, который содержит бизнес-логику приложения.

Пример кода

Ниже приведен пример кода для доменной модели User:

```

package domain
type User struct {
  ID    int64 `json:"id"`
  Name   string `json:"name"`
  Email  string `json:"email"`
  Password string `json:"-"`
}

```

Ниже приведен пример кода для репозитория UserRepository:

```

package domain
type UserRepository interface {
  Create(user *User) error
  GetByID(id int64) (*User, error)
  GetByEmail(email string) (*User, error)
  Update(user *User) error
  Delete(id int64) error
}

```

Ниже приведен пример кода для usecase-сценария CreateUser:

```

package domain
type CreateUserInput struct {
  Name   string `json:"name"`
  Email  string `json:"email"`
  Password string `json:"password"`
}
type CreateUserOutput struct {
  User *User `json:"user"`
}
type CreateUserUsecase interface {
  Execute(input *CreateUserInput) (*CreateUserOutput, error)
}

```

Ниже приведен пример кода для реализации CreateUserUsecase:

```

package usecase
import (
  "myapp/domain"
)
type CreateUser struct {
  userRepository domain.UserRepository
}
func NewCreateUser(userRepository domain.UserRepository) *CreateUser {
  return &CreateUser{userRepository}
}
func (uc *CreateUser) Execute(input *domain.CreateUserInput) (*domain.CreateUserOutput, error) {
  user := &domain.User{
    Name:   input.Name,
    Email:  input.Email,
    Password: input.Password,
  }
  err := uc.userRepository.Create(user)
  if err != nil {
    return nil, err
  }
  output := &domain.CreateUserOutput{
    User: user,
  }
  return output, nil
}

```

В данном примере мы создали usecase-сценарий CreateUser, который создает нового пользователя в базе данных. Для этого мы использовали репозиторий UserRepository.

Заключение

Чистая архитектура – это подход к проектированию приложений, который позволяет создавать независимые слои и облегчает поддержку и тестирование приложения. В данной статье мы рассмотрели, как использовать чистую архитектуру при разработке на языке Golang и привели примеры кода. Надеемся, что данная статья поможет вам создавать более эффективные и поддерживаемые приложения.