Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
198 changes: 114 additions & 84 deletions Guia5/README.md
Original file line number Diff line number Diff line change
@@ -1,95 +1,139 @@
# Guia 5 — Projeto de Sistema com Orientação a Objetos

## Contexto

Agora é sua vez de propor e implementar um **sistema completo** utilizando o paradigma de Orientação a Objetos em Python.

O objetivo deste guia é consolidar os conceitos vistos no curso de POO: classes, objetos, construtores, métodos, encapsulamento, atributos de classe/métodos de classe, herança, polimorfismo, classes abstratas, interfaces (via ABC), composição, etc.

**Exemplos de sistemas sugeridos** (escolha um ou crie o seu):
- Sistema de Banco (conta corrente, poupança, transferência, cliente)
- Sistema de Gerenciamento de Biblioteca
- Sistema de Loja/E-commerce simples (Produto, Carrinho, Cliente, Pedido)
- Sistema de Escola (Aluno, Professor, Disciplina, Turma)
- Sistema de Hospital (Paciente, Médico, Consulta, Exame)

Toda o projeto deve estar explicado conceitualmente em um arquivo Guia5_<Nome_do_Projeto>_README.md contendo o que se segue:

---
# Guia 5 — Sistema de Gerenciamento de Biblioteca

## 1. Diagrama UML

### Diagrama de Classes Principal

Mantenha o diagrama **exatamente como está** (atualize apenas se necessário).
O diagrama abaixo foi adaptado a partir do modelo de exemplo (Cliente/Conta) para o domínio de biblioteca: `Pessoa` e `Item` são as classes abstratas que concentram o comportamento comum, `Usuario`/`Bibliotecario` e `Livro`/`Revista` são suas especializações, e `Biblioteca` e `Emprestimo` representam a composição que orquestra o sistema.

```mermaid
classDiagram
class Cliente {
class Pessoa {
<<abstract>>
-nome: str
-cpf: str
+__init__(nome, cpf)
+apresentar() str
+__str__() str
}
class Conta {
class Usuario {
-limite_emprestimos: int
-emprestimos_ativos: list
+pode_retirar() bool
+registrar_emprestimo(emprestimo)
+registrar_devolucao(emprestimo)
+apresentar() str
}
class Bibliotecario {
-matricula: str
+apresentar() str
}

class Item {
<<abstract>>
-numero: int
-saldo: float
+depositar(valor)
+sacar(valor)
+transferir(destino, valor)
-titulo: str
-codigo: int
-disponivel: bool
+marcar_como_emprestado()
+marcar_como_devolvido()
+prazo_emprestimo_dias() int
+descricao_detalhada() str
}
class ContaCorrente {
-limite: float
class Livro {
-autor: str
-paginas: int
+prazo_emprestimo_dias() int
+descricao_detalhada() str
}
class ContaPoupanca {
-taxa_rendimento: float
class Revista {
-edicao: int
+prazo_emprestimo_dias() int
+descricao_detalhada() str
}
Cliente "1" --> "1..*" Conta : possui
Conta <|-- ContaCorrente
Conta <|-- ContaPoupanca

class Emprestimo {
-data_emprestimo: date
-data_devolucao_prevista: date
-data_devolucao_efetiva: date
+esta_ativo() bool
+esta_atrasado(data) bool
+finalizar(data)
}

class Biblioteca {
-nome: str
+adicionar_item(item)
+cadastrar_usuario(usuario)
+realizar_emprestimo(cpf, codigo) Emprestimo
+realizar_devolucao(cpf, codigo) Emprestimo
+itens_disponiveis() list
+emprestimos_atrasados() list
}

Pessoa <|-- Usuario
Pessoa <|-- Bibliotecario
Item <|-- Livro
Item <|-- Revista

Usuario "1" --> "0..*" Emprestimo : possui
Emprestimo "1" --> "1" Item : refere-se a

Biblioteca "1" *-- "0..*" Item : acervo
Biblioteca "1" *-- "0..*" Usuario : usuários
Biblioteca "1" *-- "0..*" Bibliotecario : equipe
Biblioteca "1" *-- "0..*" Emprestimo : histórico
```

### Justificativa das alterações em relação ao diagrama de exemplo

- **Hierarquia dupla:** o domínio bancário tinha apenas uma hierarquia (`Conta`). Aqui foram criadas duas hierarquias de herança — `Pessoa` (→ `Usuario`, `Bibliotecario`) e `Item` (→ `Livro`, `Revista`) — para exercitar herança e polimorfismo em mais de um eixo do sistema.
- **Composição explícita:** a classe `Biblioteca` foi adicionada como agregadora central (não existia equivalente direto no exemplo), demonstrando composição com múltiplas classes (`Item`, `Usuario`, `Bibliotecario`, `Emprestimo`).
- **Classe de associação:** `Emprestimo` substitui o papel que `transferir()` cumpria na `Conta` do exemplo — em vez de um método, o vínculo "usuário pegou um item emprestado" virou uma classe própria, permitindo guardar datas e status sem inflar `Usuario` ou `Item`.
- **Polimorfismo de regra de negócio:** `prazo_emprestimo_dias()` é abstrato em `Item` e implementado de forma diferente em `Livro` (14 dias) e `Revista` (7 dias), papel análogo ao que `depositar`/`sacar` cumpriam em `Conta`/`ContaCorrente`/`ContaPoupanca`.

---

## Descreva as Classes (Exemplos)
## 2. Descreva as Classes

Cliente: Representa o titular da conta.
Conta (abstrata): Define o contrato comum (depósito, saque, transferência).
ContaCorrente: Herda de Conta, permite saldo negativo até o limite.
ContaPoupanca: Herda de Conta, aplica rendimento.
- **Pessoa** *(abstrata)*: define o contrato comum entre qualquer pessoa do sistema (nome, CPF, validações e o método abstrato `apresentar()`).
- **Usuario**: herda de `Pessoa`. Pode retirar itens por empréstimo até um limite configurável; mantém a lista de seus empréstimos ativos (composição).
- **Bibliotecario**: herda de `Pessoa`. Representa o funcionário responsável pela operação do sistema; possui matrícula própria.
- **Item** *(abstrata)*: define o contrato comum entre qualquer item do acervo (título, código único, disponibilidade) e exige que cada subclasse implemente seu próprio prazo de empréstimo e descrição detalhada.
- **Livro**: herda de `Item`. Possui autor, número de páginas e prazo de devolução de 14 dias.
- **Revista**: herda de `Item`. Possui número de edição e prazo de devolução de 7 dias.
- **Emprestimo**: representa o vínculo (composição) entre um `Usuario` e um `Item` durante o período de retirada; calcula a data prevista de devolução automaticamente a partir do prazo do item, e sabe informar se está ativo ou atrasado.
- **Biblioteca**: classe central do sistema. Por composição, mantém o acervo de itens, os usuários, os bibliotecários e o histórico de empréstimos, além de implementar as regras de negócio (`realizar_emprestimo`, `realizar_devolucao`, buscas e consultas).

---

## Use este esquema de pastas como Exemplo
## 3. Esquema de Pastas

```bash
meu-sistema-banco/
Guia5/
├── src/
│ ├── __init__.py
│ ├── cliente.py
│ ├── conta.py
│ ├── conta_corrente.py
│ └── conta_poupanca.py
├── tests/
│ ├── __init__.py
│ ├── test_cliente.py
│ ├── test_conta_corrente.py
│ └── test_sistema_banco.py
│ ├── pessoa.py
│ ├── usuario.py
│ ├── bibliotecario.py
│ ├── item.py
│ ├── livro.py
│ ├── revista.py
│ ├── emprestimo.py
│ └── biblioteca.py
├── main.py
├── pytest.ini
├── requirements.txt
├── README.md
└── .gitignore
```

---

## Descreva como preparar o ambiente

Siga rigorosamente uma sequência e descreva ela nesta seção para garantir reprodutibilidade. Exemplo:

## 4. Preparando o Ambiente

### 1. Criar venv

Na pasta do projeto ..\Guia5> executar o comando:
Na pasta do projeto `..\Guia5>` executar o comando:

```bash
python -m venv .venv
Expand All @@ -99,51 +143,37 @@ python -m venv .venv

#### Windows

Na pasta do projeto ..\Guia5> executar o comando:
Na pasta do projeto `..\Guia5>` executar o comando:

```bash
.\.venv\Scripts\activate
```

#### Linux/macOS

Na pasta do projeto ..\Guia5> executar o comando:

```bash
source .venv/bin/activate
```

### 3. Instalar dependências

Na pasta do projeto ..\Guia5> executar o comando:
Na pasta do projeto `..\Guia5>` executar o comando:

```bash
pip install -r requirements.txt
```

### 4. Testes

Na pasta do projeto ..\Guia5> executar o comando:
### 4. Execução


```bash
pytest -v
```

ou

```bash
python -m pytest -v
```

### 5. Execução
Na pasta do projeto ..\Guia5> executar o comando:
Na pasta do projeto `..\Guia5>` executar o comando:

```bash
python main.py
```

Na tela que abrir você poderá interagir com o sistema da seguinte forma... (descreva funcionalidades, o que o usuário pode experimentar, etc.).

---

Na tela que abrir, o sistema já inicia com alguns dados de exemplo (2 livros, 1 revista e 1 usuária cadastrados) e você poderá interagir através de um menu numérico no terminal, podendo:

1. **Listar acervo** — vê todos os livros e revistas cadastrados, com status de disponibilidade.
2. **Listar usuários** — vê os usuários cadastrados e quantos empréstimos ativos cada um possui.
3. **Cadastrar usuário** — informa nome e CPF (11 dígitos) para criar um novo usuário.
4. **Adicionar livro ao acervo** — informa título, autor e número de páginas.
5. **Adicionar revista ao acervo** — informa título e número da edição.
6. **Realizar empréstimo** — informa o CPF do usuário e o código do item; o sistema calcula automaticamente a data prevista de devolução.
7. **Realizar devolução** — informa o CPF do usuário e o código do item para finalizar o empréstimo.
8. **Listar empréstimos ativos** — mostra todos os empréstimos em andamento.
9. **Listar empréstimos atrasados** — mostra apenas os empréstimos cuja data prevista de devolução já passou.
0. **Sair** — encerra o programa.
Loading