Este projeto é uma implementação de um sistema simples utilizando os princípios de Domain-Driven Design (DDD) em GoLang. Ele simula a criação e manipulação de ordens de compra (Orders), aplicando conceitos de Entities, Value Objects, Repositories, e Use Cases.
├── cmd
│ ├── main.go
│ └── main_test.go
├── domain
│ ├── entities
│ │ ├── order.go
│ │ └── order_test.go
│ ├── repositories
│ │ ├── in_memory_order_repository.go
│ │ ├── in_memory_order_repository_test.go
│ │ ├── mock_order_repository.go
│ │ └── order_repository.go
│ └── value_objects
│ ├── price.go
│ └── price_test.go
├── go.mod
├── go.sum
├── README.md
└── usecases
├── create_order.go
└── create_order_use_case_test.go
-
Criação de Ordens: Simula a criação de uma ordem com ID único e preço total.
-
Manipulação de Preços: Validação e cálculos utilizando o Value Object Price.
-
Repositórios: Implementa o padrão de repositório para armazenar as ordens.
-
Arquitetura Limpa: Divisão clara entre camadas (Domínio, Casos de Uso, Infraestrutura).
Pré-requisitos
-
GoLang instalado na versão mais recente.
-
Ambiente configurado para desenvolvimento em Go.
- Clone o repositório:
git clone https://github.com/williamkoller/ddd-golang.git
cd ddd-golang
- Instale as dependências:
go mod tidy
- Execute o projeto:
go run cmd/main.go
- Entidades Representam os objetos principais do domínio, como Order:
type Order struct {
ID string
TotalPrice value_objects.Price
Products []string
}
- Value Objects Representam conceitos do domínio com validações e comportamentos específicos, como Price:
type Price struct {
Amount float64
}
func NewPrice(amount float64) (Price, error) {
if amount < 0 {
return Price{}, fmt.Errorf("price cannot be negative")
}
return Price{Amount: amount}, nil
}
- Repositórios Interfaces que definem como interagir com a infraestrutura:
type OrderRepository interface {
Save(order entities.Order) error
FindById(id string) (entities.Order, error)
}
Criação de uma ordem utilizando o caso de uso CreateOrder:
package main
import (
"ddd-golang/domain/value_objects"
"ddd-golang/infrastructure/persistence"
"ddd-golang/usecases"
"fmt"
)
func main() {
repo := persistence.NewInMemoryOrderRepository()
useCase := usecases.NewCreateOrderUseCase(repo)
price, _ := value_objects.NewPrice(100.0)
order, _ := useCase.Execute("1234", price)
fmt.Printf("Ordem criada com ID: %s\n", order.ID)
}
Para executar os testes, utilize o comando:
go test ./...
ok ddd-golang/cmd 0.002s
ok ddd-golang/domain/entities 0.002s
ok ddd-golang/domain/repositories 0.002s
ok ddd-golang/domain/value_objects 0.002s
ok ddd-golang/usecases 0.002s