Este proyecto ha sido simplificado para estudiantes. Ahora utiliza un objeto JSON simple en memoria con una arquitectura en capas clara y separada.
src/
├── types/
│ ├── database.ts # Define el objeto JSON con los datos
│ ├── category.ts # Interface para categorías
│ └── paciente.ts # Interface para pacientes
├── repositories/ # 🆕 Capa de acceso a datos
│ ├── categoryRepository.ts # CRUD para categorías
│ ├── pacienteRepository.ts # CRUD para pacientes
│ └── index.ts
├── services/ # Capa de lógica de negocio
│ ├── categoryService.ts # Lógica de negocio de categorías
│ ├── pacienteService.ts # Lógica de negocio de pacientes
│ └── index.ts
└── presentations/ # Capa de presentación (sin cambios)
- Responsabilidad: Manejo directo del objeto JSON
- Archivos:
repositories/categoryRepository.ts,repositories/pacienteRepository.ts - Qué hace: CRUD básico, búsquedas, conteos
// Ejemplo: CategoryRepository
export class CategoryRepository {
static getAll(): Category[] { /* ... */ }
static findById(id: number): Category | undefined { /* ... */ }
static create(data: CategoryInput): Category { /* ... */ }
static update(id: number, updates: CategoryUpdate): Category | null { /* ... */ }
static delete(id: number): boolean { /* ... */ }
static count(): number { /* ... */ }
}- Responsabilidad: Lógica de negocio y orquestación
- Archivos:
services/categoryService.ts,services/pacienteService.ts - Qué hace: Validaciones, logs, reglas de negocio, usa repositories
// Ejemplo: CategoryService
export class CategoryService {
static async getAll(): Promise<Category[]> {
console.log('📋 Obteniendo todas las categorías...')
const categories = CategoryRepository.getAll()
console.log(`✅ ${categories.length} categorías obtenidas`)
return categories
}
// ... más métodos
}- Responsabilidad: Interfaz de usuario
- Archivos:
presentations/CategoryPresentation.ts, etc. - Qué hace: Maneja DOM, eventos, llama a los services
- ✅ Separación por responsabilidades: Cada capa tiene un propósito claro
- ✅ Un archivo por entidad: CategoryRepository, PacienteRepository
- ✅ Fácil de entender: Cada archivo es pequeño y específico
- ✅ Escalable: Agregar nuevas entidades es simple
- ✅ Misma API en services: No se rompe el código existente
La "base de datos" sigue siendo un objeto simple en src/types/database.ts:
export const database: JsonDatabase = {
categories: [
{ id: 1, description: 'Medicina General', created_at: '2024-01-01' },
{ id: 2, description: 'Pediatría', created_at: '2024-01-01' },
// ...
],
pacientes: [
{
id: 1,
nombre: 'Juan Carlos',
apellido: 'González',
// ...
},
// ...
]
}import { CategoryService, PacienteService } from './services'
// Obtener todos
const categories = await CategoryService.getAll()
const pacientes = await PacienteService.getAll()
// Operaciones específicas
const paciente = await PacienteService.getById(1)
const pacientsFilter = await PacienteService.searchByName('Juan')
const mujeres = await PacienteService.getByGender('Femenino')import { CategoryRepository, PacienteRepository } from './repositories'
// Acceso directo a datos (sin logs)
const categories = CategoryRepository.getAll()
const count = CategoryRepository.count()
const paciente = PacienteRepository.findById(1)- Separación clara: Cada capa tiene una responsabilidad específica
- Fácil de encontrar: ¿Necesitas CRUD? → Repository. ¿Lógica? → Service
- Escalable: Agregar
ProductRepositoryes copiar y adaptar - Patrones reales: Repository pattern se usa en la industria
- Debugging simple: Los logs están en Services, la data en Repositories
- Enseñar responsabilidades únicas por archivo
- Mostrar flujo de datos: Presentation → Service → Repository → JSON
- Explicar inyección de dependencias conceptualmente
- Demostrar testing por capas
Para agregar, por ejemplo, "Doctores":
- Crear interface:
types/doctor.ts - Agregar al JSON:
types/database.ts - Crear repository:
repositories/doctorRepository.ts - Crear service:
services/doctorService.ts - Crear presentation:
presentations/DoctorPresentation.ts
- Los datos se pierden al recargar - Es temporal para aprender
- No hay persistencia - Enfócate en la arquitectura
- Logs informativos - Ayudan a ver el flujo de datos
- Código simple - Sin complejidades innecesarias
¡Perfecto para aprender arquitectura limpia y separación de responsabilidades! 🎓
La primera imagen muestra un listado de flashcards para la administración de los usuarios.
La segunda imagen es donde se muestra la creación de las flashcards y podemos ver que una flashcard puede tener más de una categoría.
En la tercera imagen empezamos a estudiar las flashcards escogiendo una categoría de estudio.
En la cuarta imagen empezamos a visualizar las flashcard por la categoría escogida.
En la quinta imagen mostramos que al dar vuelta a las flashcards se puede ver la respuesta del concepto.
Cada iteración de los usuarios con las flashcards debe quedar almacenada para promover la memoria espaciada.




