Files
controle-de-estoque-cli/README.md
T

83 lines
2.9 KiB
Markdown
Raw Normal View History

2026-07-15 01:00:03 -03:00
# Controle de Estoque CLI
Aplicação de linha de comando (CLI) em Go para gerenciar um estoque de produtos.
Projeto de estudo focado em organização de código em camadas (MVC) e no uso de
estruturas de dados nativas do Go.
## Funcionalidades
- **Adicionar** produtos ao estoque (nome, categoria, preço e quantidade)
- **Listar** todos os produtos cadastrados
- **Atualizar** um campo específico de um produto pelo ID
- **Deletar** um produto pelo ID
## Como executar
Requer [Go](https://go.dev/) 1.26 ou superior instalado.
```bash
go run .
```
Para compilar um binário:
```bash
go build -o controle-de-estoque
./controle-de-estoque
```
## Uso
Ao iniciar, o programa exibe um menu. Escolha uma opção pelo número ou pelo nome:
```
1 / adicionar - Adiciona o produto no estoque
2 / listar - Lista todos os produtos do estoque
3 / atualizar - Atualiza um produto do estoque
4 / deletar - Deleta um produto do estoque
0 / sair - Sair do programa
```
Ao **atualizar**, informe o ID do produto e o campo desejado
(`nome`, `categoria`, `preco` ou `quantidade`), seguido do novo valor.
## Estrutura do projeto
O código é organizado em camadas, separando responsabilidades:
```
.
├── main.go # Ponto de entrada: monta as dependências e inicia a CLI
├── controller/
│ └── controller.go # Orquestra o fluxo entre a entrada do usuário e o modelo
├── view/
│ └── view.go # Entrada e saída no terminal (menus, leitura, exibição)
└── model/
└── inventory.go # Regras de negócio e armazenamento dos produtos (map em memória)
```
- **model** — define `Product` e `Inventory`, guardando os produtos em um
`map[ProductID]Product`
- **view** — responsável por toda interação com o terminal.
- **controller** — recebe a opção do usuário e chama as operações do modelo.
> Os dados são mantidos apenas em memória: ao encerrar o programa, o estoque é perdido.
## Conceitos aprendidos
- **Arquitetura em camadas (MVC)** — separação de responsabilidades entre
`model`, `view` e `controller`, mantendo cada parte independente.
- **Structs e métodos** — modelagem de dados com `Product`/`Inventory` e métodos
(`func (e *Inventory) ...`).
- **Maps** — armazenamento em `map[ProductID]Product` para busca, atualização e
remoção, o padrão *comma-ok* (`v, ok := m[k]`) e a função embutida
`delete(m, chave)`.
- **Tipos nomeados** — criação de `type ProductID int` para dar semântica aos
identificadores.
- **Leitura de entrada** — uso de `bufio.Reader`
- **Tratamento de strings** — `strings.TrimSpace` para limpar os espaços e quebras de linhas da entrada e
`strconv` (`Atoi`, `ParseFloat`) para converter texto em tipos numéricos.
- **Tratamento de erros** — múltiplos retornos `(valor, error)` e verificação com
`if err != nil`.
- **Formatação de saída** — `fmt.Printf` com verbos como `%d`, `%s` e `%.2f`.