@icarusmx/creta 0.9.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/creta.js CHANGED
@@ -6,6 +6,7 @@ import fs from 'fs'
6
6
  import path from 'path'
7
7
  import { fileURLToPath } from 'url'
8
8
  import { CretaCodeSession } from '../lib/session.js'
9
+ import { Lesson1SystemDecomposition } from '../lessons/lesson1-system-decomposition.js'
9
10
  import { Lesson6InterfaceDesign } from '../lessons/lesson6-interface-design.js'
10
11
 
11
12
  const ENUNCIADOS = [
@@ -812,7 +813,21 @@ async function startEnunciadosSelectorInteractive() {
812
813
  console.log(`📚 Nivel: ${enunciadoSeleccionado.nivel}`)
813
814
 
814
815
  // Check if we have a lesson implementation for this enunciado
815
- if (enunciadoSeleccionado.id === 6) {
816
+ if (enunciadoSeleccionado.id === 1) {
817
+ console.log("\n🚀 ¡Lección disponible! Iniciando sesión de estudio dirigida...")
818
+ await new Promise(resolve => setTimeout(resolve, 1500)) // Brief pause
819
+
820
+ try {
821
+ const lesson1 = new Lesson1SystemDecomposition()
822
+ await lesson1.start()
823
+ } catch (error) {
824
+ console.error("\n❌ Error al ejecutar la lección:", error.message)
825
+ console.log("\n🚀 Próximamente:")
826
+ console.log("- Sesiones de estudio dirigidas basadas en este enunciado")
827
+ console.log("- Ejercicios prácticos que ilustren el concepto")
828
+ console.log("- Proyectos específicos para internalizar la idea")
829
+ }
830
+ } else if (enunciadoSeleccionado.id === 6) {
816
831
  console.log("\n🚀 ¡Lección disponible! Iniciando sesión de estudio dirigida...")
817
832
  await new Promise(resolve => setTimeout(resolve, 1500)) // Brief pause
818
833
 
@@ -895,7 +910,23 @@ async function startEnunciadosSelectorFallback() {
895
910
  console.log(`📚 Nivel: ${enunciadoSeleccionado.nivel}`)
896
911
 
897
912
  // Check if we have a lesson implementation for this enunciado
898
- if (enunciadoSeleccionado.id === 6) {
913
+ if (enunciadoSeleccionado.id === 1) {
914
+ console.log("\n🚀 ¡Lección disponible! Iniciando sesión de estudio dirigida...")
915
+ rl.close()
916
+ await new Promise(resolve => setTimeout(resolve, 1500)) // Brief pause
917
+
918
+ try {
919
+ const lesson1 = new Lesson1SystemDecomposition()
920
+ await lesson1.start()
921
+ } catch (error) {
922
+ console.error("\n❌ Error al ejecutar la lección:", error.message)
923
+ console.log("\n🚀 Próximamente:")
924
+ console.log("- Sesiones de estudio dirigidas basadas en este enunciado")
925
+ console.log("- Ejercicios prácticos que ilustren el concepto")
926
+ console.log("- Proyectos específicos para internalizar la idea")
927
+ }
928
+ return
929
+ } else if (enunciadoSeleccionado.id === 6) {
899
930
  console.log("\n🚀 ¡Lección disponible! Iniciando sesión de estudio dirigida...")
900
931
  rl.close()
901
932
  await new Promise(resolve => setTimeout(resolve, 1500)) // Brief pause
@@ -0,0 +1,257 @@
1
+ #!/usr/bin/env node
2
+
3
+ // LECCIÓN 1: La parte difícil del diseño orientado a objetos es descomponer un sistema como un conjunto de objetos que interactúan entre sí
4
+ // Enfoque práctico: Dos definiciones de sistema y su descomposición en objetos
5
+
6
+ import { createInterface } from 'readline'
7
+
8
+ export class Lesson1SystemDecomposition {
9
+ constructor() {
10
+ this.rl = createInterface({
11
+ input: process.stdin,
12
+ output: process.stdout
13
+ })
14
+ }
15
+
16
+ async start() {
17
+ console.log("🎯 LECCIÓN 1: Descomposición de Sistemas")
18
+ console.log("=" .repeat(50))
19
+ console.log("📚 Concepto: La parte difícil del diseño orientado a objetos es descomponer un sistema como un conjunto de objetos que interactúan entre sí.")
20
+ console.log("\n💡 ¿Por qué es la parte difícil?")
21
+ console.log("- Pasar de una idea abstracta a objetos concretos")
22
+ console.log("- Decidir dónde están los límites entre objetos")
23
+ console.log("- Definir cómo estos objetos van a interactuar")
24
+ console.log("- Balancear teoría y práctica en el diseño")
25
+
26
+ await this.waitForEnter("\nPresiona Enter para comenzar con las definiciones de sistema...")
27
+
28
+ await this.practicalExercise()
29
+ await this.conclusion()
30
+
31
+ this.rl.close()
32
+ }
33
+
34
+ async practicalExercise() {
35
+ console.clear()
36
+ console.log("🛠️ EJERCICIO PRÁCTICO: Biblioteca Digital")
37
+ console.log("=" .repeat(50))
38
+ console.log("🎯 Objetivo: Entender dos definiciones de sistema y su descomposición")
39
+ console.log("\nComenzaremos con dos definiciones de sistema y posteriormente")
40
+ console.log("ejemplificaremos la descomposición en objetos.")
41
+
42
+ await this.waitForEnter("\nPresiona Enter para ver las definiciones...")
43
+
44
+ await this.step1_SystemDefinitions()
45
+ await this.step2_ApplyDefinitions()
46
+ await this.step3_DecompositionChallenge()
47
+ await this.step4_ObjectIdentification()
48
+ }
49
+
50
+ async step1_SystemDefinitions() {
51
+ console.clear()
52
+ console.log("📖 PASO 1: Dos Definiciones de Sistema")
53
+ console.log("=" .repeat(45))
54
+ console.log("Antes de descomponer, debemos entender qué ES un sistema:")
55
+
56
+ console.log("\n🔬 DEFINICIÓN 1 (Teórica):")
57
+ console.log("\"El sistema es una totalidad deductiva de discurso\"")
58
+ console.log("")
59
+ console.log("• Enfoque: Estructura lógica y coherencia conceptual")
60
+ console.log("• Pregunta clave: ¿Qué reglas gobiernan este dominio?")
61
+ console.log("• Ejemplo: Las leyes matemáticas que definen la geometría")
62
+
63
+ console.log("\n🎯 DEFINICIÓN 2 (Práctica):")
64
+ console.log("\"El sistema es un conjunto de cosas que relacionadas")
65
+ console.log("entre sí ordenadamente contribuyen a un determinado propósito\"")
66
+ console.log("")
67
+ console.log("• Enfoque: Componentes colaborando hacia un objetivo")
68
+ console.log("• Pregunta clave: ¿Qué partes trabajan juntas para qué fin?")
69
+ console.log("• Ejemplo: Motor, ruedas, frenos trabajando para transportar")
70
+
71
+ await this.waitForEnter("\n💭 ¿Ves cómo ambas son válidas pero muy diferentes? Presiona Enter para aplicarlas...")
72
+ }
73
+
74
+ async step2_ApplyDefinitions() {
75
+ console.clear()
76
+ console.log("📚 PASO 2: Aplicando las Definiciones")
77
+ console.log("=" .repeat(45))
78
+ console.log("Vamos a analizar una \"Biblioteca Digital\" desde ambos enfoques:")
79
+
80
+ console.log("\n🔬 BIBLIOTECA como TOTALIDAD DEDUCTIVA:")
81
+ console.log("Las reglas lógicas que gobiernan el dominio:")
82
+ console.log("")
83
+ console.log("• Un libro puede estar disponible o prestado")
84
+ console.log("• Un usuario puede tener máximo N libros prestados")
85
+ console.log("• Un préstamo tiene fecha de inicio y vencimiento")
86
+ console.log("• Solo usuarios registrados pueden solicitar préstamos")
87
+ console.log("• Un libro prestado no puede prestarse a otro usuario")
88
+ console.log("• Los préstamos vencidos generan multas")
89
+
90
+ await this.waitForEnter("\nPresiona Enter para ver la definición práctica...")
91
+
92
+ console.log("\n🎯 BIBLIOTECA como CONJUNTO ORDENADO:")
93
+ console.log("Componentes que colaboran hacia el propósito de 'gestionar conocimiento':")
94
+ console.log("")
95
+ console.log("• Catálogo de libros disponibles")
96
+ console.log("• Sistema de usuarios registrados")
97
+ console.log("• Proceso de préstamos y devoluciones")
98
+ console.log("• Control de fechas y multas")
99
+ console.log("• Búsqueda y recomendaciones")
100
+ console.log("• Reportes de uso y estadísticas")
101
+
102
+ await this.waitForEnter("\n🤔 Ambas describen lo mismo, pero ¿cómo las convertimos en objetos? Presiona Enter...")
103
+ }
104
+
105
+ async step3_DecompositionChallenge() {
106
+ console.clear()
107
+ console.log("⚡ PASO 3: El Desafío de la Descomposición")
108
+ console.log("=" .repeat(50))
109
+ console.log("Aquí viene LA PARTE DIFÍCIL: ¿Qué objetos creamos?")
110
+
111
+ console.log("\n🤯 Preguntas que generan 'ruido':")
112
+ console.log("• ¿Book es un objeto o solo datos?")
113
+ console.log("• ¿User y Member son el mismo objeto?")
114
+ console.log("• ¿Loan es un objeto o un método en Library?")
115
+ console.log("• ¿Catalog es separado de Library?")
116
+ console.log("• ¿Fine es un objeto o una propiedad de Loan?")
117
+ console.log("• ¿Search es un objeto o funcionalidad de Catalog?")
118
+
119
+ console.log("\n💡 La dificultad surge de:")
120
+ console.log("1. Las reglas lógicas (def. 1) no nos dicen directamente qué objetos crear")
121
+ console.log("2. Los componentes (def. 2) pueden agruparse de múltiples formas")
122
+ console.log("3. No hay una 'respuesta correcta' única")
123
+ console.log("4. Debemos balancear teoría (coherencia) y práctica (propósito)")
124
+
125
+ await this.waitForEnter("\nPresiona Enter para ver cómo abordar esta descomposición...")
126
+ }
127
+
128
+ async step4_ObjectIdentification() {
129
+ console.clear()
130
+ console.log("🎯 PASO 4: Estrategia de Identificación de Objetos")
131
+ console.log("=" .repeat(55))
132
+ console.log("Combinemos ambas definiciones para guiar nuestra descomposición:")
133
+
134
+ console.log("\n📋 PASO 4A: Identificar Entidades Centrales")
135
+ console.log("(De la definición práctica - cosas que colaboran)")
136
+ console.log("")
137
+ console.log("• Book - Representa el conocimiento a gestionar")
138
+ console.log("• User - Quien interactúa con el sistema")
139
+ console.log("• Loan - La relación temporal entre User y Book")
140
+ console.log("• Library - El coordinador general del sistema")
141
+
142
+ await this.waitForEnter("\nPresiona Enter para ver las reglas...")
143
+
144
+ console.log("\n📋 PASO 4B: Validar con Reglas Lógicas")
145
+ console.log("(De la definición teórica - coherencia del discurso)")
146
+ console.log("")
147
+ console.log("• ¿Book puede validar si está disponible? ✓")
148
+ console.log("• ¿User puede verificar su límite de préstamos? ✓")
149
+ console.log("• ¿Loan puede calcular si está vencido? ✓")
150
+ console.log("• ¿Library puede aplicar las reglas de negocio? ✓")
151
+
152
+ await this.waitForEnter("\nPresiona Enter para ver el resultado...")
153
+
154
+ console.log("\n🏗️ PASO 4C: Descomposición Resultante")
155
+ console.log("")
156
+ console.log("class Book {")
157
+ console.log(" // Encapsula: título, autor, ISBN, estado")
158
+ console.log(" isAvailable() → boolean")
159
+ console.log(" markAsLoaned() → void")
160
+ console.log("}")
161
+ console.log("")
162
+ console.log("class User {")
163
+ console.log(" // Encapsula: nombre, email, límites, historial")
164
+ console.log(" canBorrow() → boolean")
165
+ console.log(" getCurrentLoans() → Array<Loan>")
166
+ console.log("}")
167
+ console.log("")
168
+ console.log("class Loan {")
169
+ console.log(" // Encapsula: fechas, estado, multas")
170
+ console.log(" isOverdue() → boolean")
171
+ console.log(" calculateFine() → number")
172
+ console.log("}")
173
+ console.log("")
174
+ console.log("class Library {")
175
+ console.log(" // Coordina las interacciones, aplica reglas de negocio")
176
+ console.log(" lendBook(user, book) → Loan")
177
+ console.log(" returnBook(loan) → boolean")
178
+ console.log("}")
179
+
180
+ await this.waitForEnter("\nPresiona Enter para ver por qué esta descomposición funciona...")
181
+
182
+ console.clear()
183
+ console.log("✅ POR QUÉ ESTA DESCOMPOSICIÓN FUNCIONA")
184
+ console.log("=" .repeat(45))
185
+ console.log("🔬 Satisface la definición TEÓRICA:")
186
+ console.log("• Cada objeto encapsula reglas coherentes de su dominio")
187
+ console.log("• Book 'sabe' sobre disponibilidad")
188
+ console.log("• User 'sabe' sobre sus límites")
189
+ console.log("• Loan 'sabe' sobre fechas y multas")
190
+ console.log("• Library 'conoce' las reglas de interacción")
191
+
192
+ console.log("\n🎯 Satisface la definición PRÁCTICA:")
193
+ console.log("• Los objetos colaboran hacia 'gestionar conocimiento'")
194
+ console.log("• Cada uno tiene responsabilidad clara en el propósito")
195
+ console.log("• Juntos forman un sistema ordenado y funcional")
196
+ console.log("• Sus interacciones cumplen el objetivo del sistema")
197
+
198
+ console.log("\n💡 La 'parte difícil' se resuelve:")
199
+ console.log("1. Usando ambas definiciones como guía")
200
+ console.log("2. Identificando entidades que tengan tanto coherencia lógica")
201
+ console.log(" como propósito práctico")
202
+ console.log("3. Validando que los objetos puedan 'interactuar entre sí'")
203
+ console.log("4. Asegurando que cada objeto contribuya al sistema completo")
204
+
205
+ await this.waitForEnter("\nPresiona Enter para continuar con la conclusión...")
206
+ }
207
+
208
+ async conclusion() {
209
+ console.clear()
210
+ console.log("🎓 CONCLUSIÓN: La Descomposición de Sistemas")
211
+ console.log("=" .repeat(50))
212
+ console.log("🎯 Hemos demostrado que:")
213
+ console.log("\n1. Un SISTEMA puede entenderse desde dos perspectivas complementarias")
214
+ console.log("2. La descomposición es difícil porque debemos satisfacer AMBAS")
215
+ console.log("3. Los objetos deben tener COHERENCIA LÓGICA (def. teórica)")
216
+ console.log("4. Los objetos deben COLABORAR HACIA UN PROPÓSITO (def. práctica)")
217
+ console.log("5. La interacción entre objetos es lo que mantiene al sistema unificado")
218
+
219
+ console.log("\n🔑 Estrategia para futuras descomposiciones:")
220
+ console.log("• PASO 1: Define las reglas lógicas del dominio")
221
+ console.log("• PASO 2: Identifica el propósito y componentes colaboradores")
222
+ console.log("• PASO 3: Busca entidades que satisfagan ambos aspectos")
223
+ console.log("• PASO 4: Valida que puedan interactuar coherentemente")
224
+
225
+ console.log("\n📚 Conexión con lecciones siguientes:")
226
+ console.log("• Lección 2: Cómo estos objetos INTERACTÚAN (solicitudes)")
227
+ console.log("• Lección 3: Qué mecanismo usan para colaborar")
228
+ console.log("• Lección 4-6: Cómo definir esas interacciones (interfaces)")
229
+
230
+ console.log("\n💭 Reflexión final:")
231
+ console.log("Antes de escribir código, pregúntate:")
232
+ console.log("• ¿Qué reglas lógicas gobiernan este dominio?")
233
+ console.log("• ¿Qué propósito debe cumplir este sistema?")
234
+ console.log("• ¿Qué objetos pueden satisfacer ambos aspectos?")
235
+ console.log("• ¿Cómo van a interactuar para mantener la coherencia del sistema?")
236
+
237
+ console.log("\n🏆 ¡Has comprendido por qué la descomposición es la parte difícil!")
238
+ console.log("Ahora entiendes que no es solo dividir código en clases,")
239
+ console.log("sino encontrar la estructura que honre tanto la lógica como el propósito.")
240
+
241
+ await this.waitForEnter("\n✨ ¡Lección 1 completada! Presiona Enter para salir...")
242
+ }
243
+
244
+ async waitForEnter(message) {
245
+ return new Promise((resolve) => {
246
+ this.rl.question(message, () => {
247
+ resolve()
248
+ })
249
+ })
250
+ }
251
+ }
252
+
253
+ // Para usar la lección independientemente
254
+ if (import.meta.url === `file://${process.argv[1]}`) {
255
+ const lesson = new Lesson1SystemDecomposition()
256
+ await lesson.start()
257
+ }
@@ -309,10 +309,13 @@ export class Lesson6InterfaceDesign {
309
309
  console.log(" }")
310
310
  console.log("}")
311
311
  console.log("")
312
- console.log("// Bank sigue funcionando igual con cualquier tipo de cuenta!")
312
+ console.log("// Las cuentas pueden enviarse dinero directamente!")
313
313
  console.log("const savingsAcc = new SavingsAccount(123, 'María', 1000)")
314
314
  console.log("const creditAcc = new CreditAccount(456, 'Juan', 500, 2000) // límite crédito")
315
- console.log("bank.transfer(savingsAcc, creditAcc, 300) // ¡Funciona!")
315
+ console.log("savingsAcc.send(300, creditAcc) // ¡Funciona con cualquier tipo de cuenta!")
316
+ console.log("")
317
+ console.log("// O podemos usar el Bank para registro completo:")
318
+ console.log("bank.transfer(savingsAcc, creditAcc, 300) // Crea Transaction automáticamente")
316
319
 
317
320
  await this.waitForEnter("\nPresiona Enter para continuar con la conclusión...")
318
321
  }
@@ -323,15 +326,28 @@ export class Lesson6InterfaceDesign {
323
326
  console.log("=" .repeat(55))
324
327
  console.log("🎯 Hemos demostrado que:")
325
328
  console.log("\n1. El ÉNFASIS debe estar en definir QUÉ solicitudes maneja cada objeto")
326
- console.log("2. Las INTERFACES especifican cómo hacer estas solicitudes")
327
- console.log("3. La IMPLEMENTACIÓN viene después, siguiendo el contrato")
328
- console.log("4. Los objetos COLABORAN a través de estas interfaces bien definidas")
329
-
330
- console.log("\n🔑 Lecciones específicas del ejemplo bancario:")
329
+ console.log("2. Las INTERFACES son el CONJUNTO de todas las firmas de operación")
330
+ console.log("3. Cada FIRMA especifica: nombre, insumos y valor de retorno")
331
+ console.log("4. La IMPLEMENTACIÓN viene después, siguiendo el contrato")
332
+ console.log("5. Los objetos COLABORAN a través de estas interfaces bien definidas")
333
+
334
+ console.log("\n📋 Firmas de operación en nuestro ejemplo:")
335
+ console.log("• BankAccount.getBalance() → number")
336
+ console.log("• BankAccount.send(amount, targetAccount) → boolean")
337
+ console.log("• Bank.createAccount(ownerName, initialBalance) → BankAccount")
338
+ console.log("• Bank.transfer(fromAccount, toAccount, amount) → Transaction")
339
+ console.log("• Transaction.getDetails() → {from, to, amount, timestamp, status}")
340
+
341
+ console.log("\n🔑 La interfaz de BankAccount es el CONJUNTO completo:")
342
+ console.log(" {getBalance, getAccountInfo, deposit, send}")
343
+ console.log("🔑 La interfaz de Bank es el CONJUNTO completo:")
344
+ console.log(" {createAccount, transfer, getAllTransactions, validateOperation}")
345
+
346
+ console.log("\n💡 Beneficios de este enfoque:")
331
347
  console.log("• ENCAPSULACIÓN: getBalance() protege el acceso al estado interno")
332
348
  console.log("• VALIDACIÓN: send() ejecuta lógica de negocio antes de operar")
333
- console.log("• RESPONSABILIDAD: Cada objeto maneja su propia integridad")
334
- console.log("• COLABORACIÓN: Bank, BankAccount y Transaction trabajan juntos")
349
+ console.log("• CONTRATO CLARO: Cada firma especifica exactamente qué esperar")
350
+ console.log("• COLABORACIÓN: Los objetos conocen las firmas de otros objetos")
335
351
 
336
352
  console.log("\n📚 Conexión con lecciones anteriores:")
337
353
  console.log("• Lección 2: Los objetos interactúan a través de solicitudes ✓")
@@ -349,12 +365,15 @@ export class Lesson6InterfaceDesign {
349
365
  console.log("5. Haz que los objetos colaboren a través de solicitudes")
350
366
 
351
367
  console.log("\n💭 Reflexión final:")
352
- console.log("En el mundo real, ¿cómo te asegurarías de que tu cuenta bancaria")
353
- console.log("esté protegida y que solo se ejecuten operaciones válidas?")
354
- console.log("¡Exactamente como lo hicimos aquí: interfaces bien definidas!")
368
+ console.log("Antes de implementar cualquier objeto, pregúntate:")
369
+ console.log(" ¿Cuáles son TODAS las firmas de operación que necesito?")
370
+ console.log(" ¿Qué nombre, insumos y valor de retorno tendrá cada firma?")
371
+ console.log("• ¿Cómo van a colaborar los objetos usando estas firmas?")
372
+ console.log("• ¿El CONJUNTO de firmas forma una interfaz coherente?")
355
373
 
356
374
  console.log("\n🏆 ¡Has completado el ejemplo más importante del diseño orientado a objetos!")
357
- console.log("Ahora entiendes por qué el ÉNFASIS debe estar en las interfaces.")
375
+ console.log("Ahora entiendes que el ÉNFASIS debe estar en definir el CONJUNTO")
376
+ console.log("completo de firmas de operación ANTES de implementar.")
358
377
 
359
378
  await this.waitForEnter("\n✨ ¡Lección 6 completada! Presiona Enter para salir...")
360
379
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@icarusmx/creta",
3
- "version": "0.9.1",
3
+ "version": "0.10.0",
4
4
  "description": "Salgamos de este laberinto.",
5
5
  "type": "module",
6
6
  "bin": {