Initial commit SteelBase - Oficiais e Funcionando

This commit is contained in:
Marcos
2026-03-22 16:56:47 -03:00
commit f10278909b
194 changed files with 87242 additions and 0 deletions

View File

@@ -0,0 +1,419 @@
# Design Document - Sistema de Cache de Perfis
## Overview
Sistema de cache intermediário usando IndexedDB para armazenar dados de perfis estruturais. O sistema fornece uma camada de abstração entre os arquivos CSV originais e o aplicativo, permitindo carregamento rápido, sincronização sob demanda, e gerenciamento flexível de fontes de dados.
## Architecture
### High-Level Architecture
```
┌─────────────────────────────────────────────────────────┐
│ Application Layer │
│ (UI Components, Sections, Calculations) │
└────────────────────┬────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ Data Service API │
│ getPerfis() | searchPerfis() | getPerfilById() │
└────────────────────┬────────────────────────────────────┘
┌────────────┴────────────┐
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Cache Layer │ │ CSV Loader │
│ (IndexedDB) │◄────────►│ (Fetch API) │
└──────────────┘ └──────────────┘
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Browser │ │ BD/perfis/ │
│ Storage │ │ *.csv │
└──────────────┘ └──────────────┘
```
### Component Diagram
```
┌─────────────────────────────────────────────────────────┐
│ CacheManager │
│ - init() │
│ - checkHealth() │
│ - clearAll() │
└────────────────────┬────────────────────────────────────┘
┌────────────┼────────────┬────────────┐
▼ ▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ DataStore│ │SyncManager│ │CSVParser │ │DataService│
│ │ │ │ │ │ │ │
│ -get() │ │ -sync() │ │ -parse() │ │ -query() │
│ -set() │ │ -check() │ │ -validate│ │ -filter()│
│ -delete()│ │ -update()│ │ │ │ -search()│
└──────────┘ └──────────┘ └──────────┘ └──────────┘
```
## Components and Interfaces
### 1. CacheManager (Core)
**Responsabilidade:** Gerenciar ciclo de vida do cache e coordenar componentes
```javascript
class CacheManager {
constructor(config) {
this.dbName = 'AcoCalcProDB';
this.version = 1;
this.db = null;
this.config = config;
}
async init() {
// Inicializar IndexedDB
// Criar object stores
// Verificar versão
}
async checkHealth() {
// Verificar integridade do cache
// Retornar estatísticas
}
async clearAll() {
// Limpar todo o cache
}
getStats() {
// Retornar estatísticas de uso
}
}
```
### 2. DataStore (Storage Layer)
**Responsabilidade:** Interface com IndexedDB
```javascript
class DataStore {
constructor(db) {
this.db = db;
}
async get(storeName, key) {
// Buscar item por chave
}
async getAll(storeName) {
// Buscar todos os itens
}
async set(storeName, data) {
// Armazenar dados
}
async delete(storeName, key) {
// Deletar item
}
async clear(storeName) {
// Limpar store
}
async count(storeName) {
// Contar itens
}
}
```
### 3. SyncManager (Synchronization)
**Responsabilidade:** Sincronizar dados entre CSV e cache
```javascript
class SyncManager {
constructor(dataStore, csvParser) {
this.dataStore = dataStore;
this.csvParser = csvParser;
this.sources = {}; // Mapeamento tipo -> caminho CSV
}
async syncAll(progressCallback) {
// Sincronizar todos os tipos
}
async syncType(tipo, progressCallback) {
// Sincronizar tipo específico
}
async checkUpdates() {
// Verificar se há atualizações disponíveis
}
async getLastSync(tipo) {
// Retornar timestamp da última sincronização
}
async calculateHash(csvText) {
// Calcular hash MD5 do CSV
}
}
```
### 4. CSVParser (Data Processing)
**Responsabilidade:** Parse e validação de arquivos CSV
```javascript
class CSVParser {
async parse(csvText, schema) {
// Parse CSV para objetos
// Validar contra schema
// Retornar dados processados
}
validate(data, schema) {
// Validar estrutura dos dados
}
transform(data, transformFn) {
// Aplicar transformações
}
}
```
### 5. DataService (API Layer)
**Responsabilidade:** API pública para acesso aos dados
```javascript
class DataService {
constructor(cacheManager, syncManager) {
this.cache = cacheManager;
this.sync = syncManager;
}
async getPerfis(tipo, options = {}) {
// Buscar perfis do cache ou CSV
// options: { forceRefresh, includeMetadata }
}
async searchPerfis(tipo, filters) {
// Buscar com filtros
// filters: { nome, peso_min, peso_max, etc }
}
async getPerfilById(tipo, id) {
// Buscar perfil específico
}
async getMetadata(tipo) {
// Retornar metadados (última sync, count, etc)
}
}
```
## Data Models
### IndexedDB Schema
```javascript
const DB_SCHEMA = {
name: 'AcoCalcProDB',
version: 1,
stores: {
// Store para cada tipo de perfil
cantoneiras: {
keyPath: 'id',
indexes: [
{ name: 'nome', keyPath: 'nome', unique: false },
{ name: 'tipo', keyPath: 'tipo', unique: false },
{ name: 'peso_kg_m', keyPath: 'peso_kg_m', unique: false }
]
},
perfis_w: {
keyPath: 'id',
indexes: [
{ name: 'nome', keyPath: 'nome', unique: false },
{ name: 'peso', keyPath: 'peso', unique: false }
]
},
// ... outros tipos
// Store para metadados
_metadata: {
keyPath: 'tipo',
indexes: []
},
// Store para configuração
_config: {
keyPath: 'key',
indexes: []
}
}
};
```
### Metadata Model
```javascript
{
tipo: 'cantoneiras',
lastSync: 1699564800000, // timestamp
hash: 'a1b2c3d4e5f6...', // MD5 hash do CSV
count: 39,
version: '1.0',
source: 'BD/perfis/cantoneiras_brasil_completo.csv',
size: 12345 // bytes
}
```
### Config Model
```javascript
{
key: 'csv_sources',
value: {
cantoneiras: 'BD/perfis/cantoneiras_brasil_completo.csv',
perfis_w: 'BD/perfis/perfis_w_brasil_completo.csv',
// ... outros
}
}
```
## Error Handling
### Error Types
```javascript
class CacheError extends Error {
constructor(message, code, details) {
super(message);
this.name = 'CacheError';
this.code = code;
this.details = details;
}
}
// Códigos de erro
const ERROR_CODES = {
DB_NOT_AVAILABLE: 'DB_NOT_AVAILABLE',
SYNC_FAILED: 'SYNC_FAILED',
CSV_PARSE_ERROR: 'CSV_PARSE_ERROR',
DATA_NOT_FOUND: 'DATA_NOT_FOUND',
QUOTA_EXCEEDED: 'QUOTA_EXCEEDED'
};
```
### Fallback Strategy
```
1. Tentar carregar do cache
↓ (falha)
2. Tentar carregar do CSV
↓ (falha)
3. Usar dados em memória (se disponível)
↓ (falha)
4. Exibir erro ao usuário
```
## Testing Strategy
### Unit Tests
- DataStore: CRUD operations
- CSVParser: Parse e validação
- SyncManager: Lógica de sincronização
- DataService: API pública
### Integration Tests
- Fluxo completo: CSV → Cache → UI
- Sincronização com múltiplos tipos
- Fallback quando IndexedDB não disponível
### Performance Tests
- Tempo de carregamento do cache
- Tempo de sincronização
- Uso de memória
- Tamanho do banco de dados
## Migration Strategy
### Phase 1: Implementação Base
- Criar estrutura do cache
- Implementar DataStore e CSVParser
- Testes unitários
### Phase 2: Integração
- Integrar com código existente
- Manter compatibilidade
- Testes de integração
### Phase 3: UI Admin
- Painel de administração
- Botões de sincronização
- Estatísticas
### Phase 4: Otimizações
- Web Workers para parsing
- Compressão de dados
- Lazy loading
## Configuration
### Default Configuration
```javascript
const DEFAULT_CONFIG = {
dbName: 'AcoCalcProDB',
version: 1,
autoSync: false, // Sincronizar automaticamente na inicialização
syncInterval: null, // Intervalo de sincronização automática (ms)
cacheExpiry: 7 * 24 * 60 * 60 * 1000, // 7 dias
enableCompression: false,
enableWebWorkers: false,
debug: false,
sources: {
cantoneiras: 'BD/perfis/cantoneiras_brasil_completo.csv',
barras: 'BD/perfis/barras_brasil_completo.csv',
// ... outros
}
};
```
## Performance Considerations
### Optimization Techniques
1. **Indexing**: Criar índices para campos frequentemente buscados
2. **Lazy Loading**: Carregar apenas dados necessários
3. **Compression**: Comprimir dados grandes antes de armazenar
4. **Web Workers**: Parse de CSV em background thread
5. **Batch Operations**: Inserir múltiplos registros de uma vez
### Expected Performance
- Cache hit: < 100ms
- Cache miss + CSV load: < 2s
- Sync all types: < 10s
- Search with filters: < 50ms
## Security Considerations
- IndexedDB é isolado por origem (same-origin policy)
- Dados não são criptografados (não contêm informações sensíveis)
- Validar dados do CSV antes de armazenar
- Limitar tamanho máximo do cache (50MB)
## Future Enhancements
1. **Sync com servidor remoto**: Permitir sincronizar com API REST
2. **Versionamento de dados**: Manter histórico de versões
3. **Diff e merge**: Detectar conflitos entre versões
4. **Export/Import**: Exportar cache para backup
5. **Compression**: Comprimir dados automaticamente
6. **Service Worker**: Cache de arquivos CSV para offline completo

View File

@@ -0,0 +1,152 @@
# Requirements Document - Sistema de Cache de Perfis
## Introduction
Sistema de cache intermediário para armazenar dados de perfis estruturais carregados de arquivos CSV. O sistema permitirá carregar dados uma vez, armazená-los localmente no navegador (IndexedDB), e fornecer uma interface para atualizar/sincronizar quando os arquivos CSV forem modificados.
## Glossary
- **IndexedDB**: Banco de dados NoSQL do navegador para armazenamento local persistente
- **CSV Source**: Arquivos CSV originais em `BD/perfis/`
- **Cache Layer**: Camada intermediária que armazena dados processados
- **Sync Manager**: Componente responsável por sincronizar dados entre CSV e cache
- **Data Service**: API unificada para acesso aos dados de perfis
- **Admin Panel**: Interface administrativa para gerenciar o cache
## Requirements
### Requirement 1: Armazenamento Local com IndexedDB
**User Story:** Como desenvolvedor, quero armazenar dados de perfis localmente no navegador, para que o aplicativo não precise carregar CSVs repetidamente.
#### Acceptance Criteria
1. WHEN o aplicativo inicializa, THE Sistema SHALL criar um banco IndexedDB chamado "AcoCalcProDB"
2. THE Sistema SHALL criar object stores separadas para cada tipo de perfil (cantoneiras, perfis_w, perfis_i, etc.)
3. THE Sistema SHALL armazenar metadados incluindo timestamp de última atualização e versão dos dados
4. THE Sistema SHALL persistir dados entre sessões do navegador
5. THE Sistema SHALL suportar até 50MB de dados armazenados
### Requirement 2: Carregamento Inteligente de Dados
**User Story:** Como usuário, quero que o aplicativo carregue dados rapidamente, para que eu não precise esperar toda vez que abrir uma seção.
#### Acceptance Criteria
1. WHEN o usuário acessa uma seção de perfil, THE Sistema SHALL verificar se dados existem no cache local
2. IF dados existem no cache, THEN THE Sistema SHALL carregar do cache em menos de 100ms
3. IF dados não existem no cache, THEN THE Sistema SHALL carregar do CSV e armazenar no cache
4. THE Sistema SHALL exibir indicador de loading durante carregamento inicial
5. THE Sistema SHALL funcionar offline após primeiro carregamento
### Requirement 3: Interface de Sincronização
**User Story:** Como administrador, quero atualizar os dados do cache quando modificar arquivos CSV, para que as alterações sejam refletidas no aplicativo.
#### Acceptance Criteria
1. THE Sistema SHALL fornecer botão "🔄 Atualizar Dados" no painel administrativo
2. WHEN usuário clica em atualizar, THE Sistema SHALL recarregar todos os CSVs
3. THE Sistema SHALL mostrar progresso da sincronização (0-100%)
4. THE Sistema SHALL exibir timestamp da última sincronização
5. THE Sistema SHALL permitir atualização seletiva por tipo de perfil
### Requirement 4: Versionamento e Validação
**User Story:** Como desenvolvedor, quero detectar quando dados estão desatualizados, para que o sistema possa atualizar automaticamente.
#### Acceptance Criteria
1. THE Sistema SHALL armazenar hash MD5 de cada arquivo CSV
2. WHEN aplicativo inicializa, THE Sistema SHALL comparar hashes dos arquivos
3. IF hash mudou, THEN THE Sistema SHALL marcar dados como desatualizados
4. THE Sistema SHALL exibir notificação quando dados estiverem desatualizados
5. THE Sistema SHALL permitir configurar atualização automática ou manual
### Requirement 5: API Unificada de Acesso
**User Story:** Como desenvolvedor, quero uma API simples para acessar dados, para que não precise me preocupar se vêm do cache ou CSV.
#### Acceptance Criteria
1. THE Sistema SHALL fornecer função `getPerfis(tipo)` que retorna dados do cache ou CSV
2. THE Sistema SHALL fornecer função `searchPerfis(tipo, filtros)` para busca com filtros
3. THE Sistema SHALL fornecer função `getPerfilById(tipo, id)` para busca por ID
4. THE Sistema SHALL retornar Promises para todas operações assíncronas
5. THE Sistema SHALL tratar erros gracefully com fallback para CSV
### Requirement 6: Gerenciamento de Espaço
**User Story:** Como usuário, quero gerenciar o espaço usado pelo cache, para que não ocupe muito armazenamento do navegador.
#### Acceptance Criteria
1. THE Sistema SHALL exibir espaço total usado pelo cache no painel admin
2. THE Sistema SHALL permitir limpar cache de tipos específicos de perfis
3. THE Sistema SHALL permitir limpar todo o cache com um botão
4. THE Sistema SHALL avisar quando espaço disponível for menor que 10MB
5. THE Sistema SHALL funcionar mesmo se IndexedDB não estiver disponível (fallback para CSV)
### Requirement 7: Migração e Compatibilidade
**User Story:** Como desenvolvedor, quero migrar dados existentes para o novo sistema, para que não haja perda de funcionalidade.
#### Acceptance Criteria
1. THE Sistema SHALL detectar se é primeira execução
2. WHEN primeira execução, THE Sistema SHALL carregar todos os CSVs e popular cache
3. THE Sistema SHALL manter compatibilidade com código existente
4. THE Sistema SHALL permitir desabilitar cache via configuração
5. THE Sistema SHALL migrar automaticamente entre versões do schema
### Requirement 8: Monitoramento e Debug
**User Story:** Como desenvolvedor, quero monitorar operações do cache, para que possa debugar problemas.
#### Acceptance Criteria
1. THE Sistema SHALL logar todas operações de cache no console (modo debug)
2. THE Sistema SHALL exibir estatísticas de hit/miss do cache
3. THE Sistema SHALL permitir exportar dados do cache para JSON
4. THE Sistema SHALL permitir importar dados de JSON para cache
5. THE Sistema SHALL fornecer ferramenta de diagnóstico no painel admin
### Requirement 9: Performance e Otimização
**User Story:** Como usuário, quero que o aplicativo seja rápido, para que eu possa trabalhar eficientemente.
#### Acceptance Criteria
1. THE Sistema SHALL carregar dados do cache em menos de 100ms
2. THE Sistema SHALL indexar campos comuns (nome, tipo) para busca rápida
3. THE Sistema SHALL usar Web Workers para parsing de CSV em background
4. THE Sistema SHALL implementar lazy loading para perfis não utilizados
5. THE Sistema SHALL comprimir dados antes de armazenar (se >1MB)
### Requirement 10: Configuração Flexível de Fontes
**User Story:** Como administrador, quero configurar caminhos dos arquivos CSV, para que possa reorganizar estrutura de pastas.
#### Acceptance Criteria
1. THE Sistema SHALL permitir configurar caminho base dos CSVs no painel admin
2. THE Sistema SHALL permitir configurar nome de arquivo para cada tipo de perfil
3. THE Sistema SHALL validar se arquivos existem antes de tentar carregar
4. THE Sistema SHALL salvar configuração no localStorage
5. THE Sistema SHALL fornecer configuração padrão funcional
## Technical Constraints
- Deve funcionar em navegadores modernos (Chrome 60+, Firefox 60+, Safari 12+, Edge 79+)
- Deve usar apenas JavaScript vanilla (sem frameworks)
- Deve ser compatível com código existente
- Deve funcionar offline após primeiro carregamento
- Deve ter fallback para CSV se IndexedDB não disponível
## Non-Functional Requirements
- **Performance**: Carregamento do cache < 100ms
- **Reliability**: Taxa de sucesso > 99.9%
- **Usability**: Interface intuitiva no painel admin
- **Maintainability**: Código modular e bem documentado
- **Scalability**: Suportar até 10.000 registros por tipo de perfil

View File

@@ -0,0 +1,168 @@
# Implementation Plan - Sistema de Cache de Perfis
## Overview
Este plano implementa um sistema de cache intermediário usando IndexedDB para armazenar dados de perfis estruturais, permitindo carregamento rápido, sincronização sob demanda, e gerenciamento flexível de fontes de dados.
## Tasks
- [ ] 1. Criar estrutura base do sistema de cache
- Criar arquivo `js/core/cache-manager.js` com classe CacheManager
- Implementar inicialização do IndexedDB
- Criar schema do banco de dados com stores para cada tipo de perfil
- Implementar tratamento de erros e fallback
- _Requirements: 1.1, 1.2, 1.3, 1.4_
- [ ] 2. Implementar DataStore (camada de armazenamento)
- Criar arquivo `js/core/data-store.js` com classe DataStore
- Implementar operações CRUD (get, getAll, set, delete, clear)
- Implementar contagem de registros
- Adicionar suporte a índices para busca rápida
- _Requirements: 1.2, 1.3, 9.2_
- [ ] 3. Implementar CSVParser (processamento de dados)
- Criar arquivo `js/core/csv-parser.js` com classe CSVParser
- Implementar parse de CSV para objetos JavaScript
- Adicionar validação de schema
- Implementar transformações de dados (trim, parseFloat, etc)
- Tratar linhas vazias e caracteres especiais
- _Requirements: 2.3, 4.2_
- [ ] 4. Implementar SyncManager (sincronização)
- Criar arquivo `js/core/sync-manager.js` com classe SyncManager
- Implementar sincronização de todos os tipos de perfis
- Implementar sincronização seletiva por tipo
- Adicionar cálculo de hash MD5 para detecção de mudanças
- Implementar callback de progresso
- Armazenar metadados de sincronização (timestamp, hash, count)
- _Requirements: 3.1, 3.2, 3.3, 4.1, 4.2, 4.3_
- [ ] 5. Implementar DataService (API pública)
- Criar arquivo `js/core/data-service.js` com classe DataService
- Implementar `getPerfis(tipo, options)` com fallback para CSV
- Implementar `searchPerfis(tipo, filters)` com suporte a múltiplos filtros
- Implementar `getPerfilById(tipo, id)` para busca por ID
- Implementar `getMetadata(tipo)` para informações de sincronização
- Adicionar cache em memória para dados frequentemente acessados
- _Requirements: 2.1, 2.2, 5.1, 5.2, 5.3, 5.5_
- [ ] 6. Integrar sistema de cache com código existente
- Atualizar `app.js` para inicializar CacheManager na inicialização
- Modificar `carregarCantoneiras()` para usar DataService
- Adicionar tratamento de erros com fallback para CSV
- Manter compatibilidade com código existente
- Testar carregamento de cantoneiras com cache
- _Requirements: 2.1, 2.2, 2.4, 7.3, 7.4_
- [ ] 7. Criar interface de administração do cache
- Adicionar seção "Cache Manager" no painel administrativo
- Criar botão "🔄 Sincronizar Todos" com barra de progresso
- Exibir estatísticas de cache (espaço usado, última sync, count)
- Adicionar botões para sincronizar tipos individuais
- Implementar botão "🗑️ Limpar Cache" com confirmação
- Exibir timestamp da última sincronização por tipo
- _Requirements: 3.1, 3.2, 3.3, 3.4, 6.1, 6.2, 6.3_
- [ ] 8. Implementar configuração de fontes de dados
- Adicionar seção "Configurar Fontes CSV" no painel admin
- Permitir editar caminho base dos CSVs
- Permitir editar nome de arquivo para cada tipo
- Validar se arquivos existem antes de salvar
- Salvar configuração no localStorage
- Fornecer botão "Restaurar Padrões"
- _Requirements: 10.1, 10.2, 10.3, 10.4, 10.5_
- [ ] 9. Implementar detecção automática de atualizações
- Calcular hash MD5 dos arquivos CSV na inicialização
- Comparar com hash armazenado no cache
- Exibir notificação quando dados estiverem desatualizados
- Adicionar opção de atualização automática ou manual
- Implementar configuração de intervalo de verificação
- _Requirements: 4.1, 4.2, 4.3, 4.4, 4.5_
- [ ] 10. Adicionar ferramentas de diagnóstico e debug
- Criar seção "Diagnóstico" no painel admin
- Exibir estatísticas de hit/miss do cache
- Implementar botão "Exportar Cache" (JSON)
- Implementar botão "Importar Cache" (JSON)
- Adicionar modo debug com logs detalhados no console
- Exibir informações de saúde do IndexedDB
- _Requirements: 8.1, 8.2, 8.3, 8.4, 8.5_
- [ ] 11. Implementar gerenciamento de espaço
- Calcular espaço total usado pelo cache
- Exibir espaço disponível no navegador
- Implementar aviso quando espaço < 10MB
- Adicionar botão para limpar tipos específicos
- Implementar limpeza automática de dados antigos (opcional)
- _Requirements: 6.1, 6.2, 6.3, 6.4_
- [ ] 12. Implementar fallback e compatibilidade
- Detectar se IndexedDB está disponível
- Implementar fallback completo para CSV quando IndexedDB não disponível
- Adicionar opção para desabilitar cache via configuração
- Garantir que aplicativo funciona sem cache
- Testar em navegadores sem IndexedDB
- _Requirements: 6.5, 7.4, 7.5_
- [ ] 13. Otimizações de performance
- Implementar lazy loading para perfis não utilizados
- Adicionar cache em memória para dados recentes
- Otimizar queries com índices apropriados
- Implementar batch insert para sincronização rápida
- Medir e otimizar tempo de carregamento
- _Requirements: 9.1, 9.2, 9.4, 9.5_
- [ ]* 14. Implementar Web Workers para parsing (opcional)
- Criar Web Worker para parse de CSV em background
- Mover processamento pesado para worker thread
- Implementar comunicação via postMessage
- Testar performance com arquivos grandes
- _Requirements: 9.3_
- [ ]* 15. Implementar compressão de dados (opcional)
- Adicionar biblioteca de compressão (pako.js ou similar)
- Comprimir dados antes de armazenar se > 1MB
- Descomprimir ao carregar
- Medir ganho de espaço vs overhead de CPU
- _Requirements: 9.5_
- [ ] 16. Criar documentação do sistema
- Documentar API pública do DataService
- Criar guia de uso para desenvolvedores
- Documentar configurações disponíveis
- Adicionar exemplos de uso
- Documentar troubleshooting comum
- _Requirements: Todos_
- [ ] 17. Aplicar sistema de cache a todos os tipos de perfis
- Atualizar funções de carregamento de barras redondas
- Atualizar funções de carregamento de tubos circulares
- Atualizar funções de carregamento de perfis I
- Atualizar funções de carregamento de perfis W
- Atualizar funções de carregamento de tubos RHS
- Atualizar funções de carregamento de chapas
- Atualizar funções de carregamento de perfis HP
- Atualizar funções de carregamento de barras roscadas
- Atualizar funções de carregamento de barras chatas
- _Requirements: 2.1, 2.2, 5.1_
- [ ] 18. Testes de integração e validação final
- Testar carregamento inicial (primeira vez)
- Testar carregamento do cache (segunda vez)
- Testar sincronização manual
- Testar detecção de atualizações
- Testar fallback quando CSV não disponível
- Testar limpeza de cache
- Testar configuração de fontes
- Validar performance (< 100ms para cache hit)
- _Requirements: Todos_
## Notes
- Tarefas marcadas com * são opcionais e podem ser implementadas posteriormente
- Cada tarefa deve ser testada individualmente antes de prosseguir
- Manter compatibilidade com código existente durante toda implementação
- Priorizar funcionalidade básica antes de otimizações avançadas