Skip to content

williamkoller/ddd-golang

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Continuous Integration

🏗️ Domain-Driven Design com GoLang

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.

🛠️ Estrutura do Projeto

├── 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

✨ Funcionalidades

  • 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).

🚀 Como Executar

Pré-requisitos

  • GoLang instalado na versão mais recente.

  • Ambiente configurado para desenvolvimento em Go.

Passos

  1. Clone o repositório:
git clone https://github.com/williamkoller/ddd-golang.git
cd ddd-golang
  1. Instale as dependências:
go mod tidy
  1. Execute o projeto:
go run cmd/main.go

🧩 Componentes Principais

  1. Entidades Representam os objetos principais do domínio, como Order:
type Order struct {
	ID         string
	TotalPrice value_objects.Price
	Products   []string
}
  1. 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
}
  1. Repositórios Interfaces que definem como interagir com a infraestrutura:
type OrderRepository interface {
	Save(order entities.Order) error
	FindById(id string) (entities.Order, error)
}

🔍 Exemplo de Uso

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)
}

Testes

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

Releases

No releases published

Packages

No packages published

Languages