@icarusmx/creta 1.1.2 → 1.2.1
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 +42 -3
- package/lessons/lesson7-object-definition.js +198 -291
- package/package.json +1 -1
package/bin/creta.js
CHANGED
|
@@ -621,7 +621,8 @@ async function startMainMenuInteractive() {
|
|
|
621
621
|
|
|
622
622
|
const options = [
|
|
623
623
|
{ id: 1, title: "Aprender conceptos", description: "Explora los enunciados fundamentales" },
|
|
624
|
-
{ id: 2, title: "Construir proyectos", description: "Crea tu portafolio personal" }
|
|
624
|
+
{ id: 2, title: "Construir proyectos", description: "Crea tu portafolio personal" },
|
|
625
|
+
{ id: 3, title: "Crea una pull-request", description: "Aprende el flujo de contribución con Git" }
|
|
625
626
|
]
|
|
626
627
|
|
|
627
628
|
let selectedIndex = 0
|
|
@@ -692,6 +693,8 @@ Salgamos de este laberinto 🏛️
|
|
|
692
693
|
startEnunciadosSelector().then(resolve)
|
|
693
694
|
} else if (selectedOption.id === 2) {
|
|
694
695
|
startProyectosSelector().then(resolve)
|
|
696
|
+
} else if (selectedOption.id === 3) {
|
|
697
|
+
startPullRequestTutorial().then(resolve)
|
|
695
698
|
}
|
|
696
699
|
return
|
|
697
700
|
}
|
|
@@ -727,9 +730,10 @@ async function startMainMenuFallback() {
|
|
|
727
730
|
console.log("")
|
|
728
731
|
console.log("1. Aprender conceptos - Explora los enunciados fundamentales")
|
|
729
732
|
console.log("2. Construir proyectos - Crea tu portafolio personal")
|
|
733
|
+
console.log("3. Crea una pull-request - Aprende el flujo de contribución con Git")
|
|
730
734
|
console.log("")
|
|
731
735
|
|
|
732
|
-
const respuesta = await askQuestion("Elige una opción (1-
|
|
736
|
+
const respuesta = await askQuestion("Elige una opción (1-3) o 'q' para salir: ")
|
|
733
737
|
|
|
734
738
|
if (respuesta.toLowerCase() === 'q') {
|
|
735
739
|
console.log("Hecho con <3 por icarus.mx")
|
|
@@ -745,8 +749,11 @@ async function startMainMenuFallback() {
|
|
|
745
749
|
} else if (opcionSeleccionada === 2) {
|
|
746
750
|
rl.close()
|
|
747
751
|
await startProyectosSelector()
|
|
752
|
+
} else if (opcionSeleccionada === 3) {
|
|
753
|
+
rl.close()
|
|
754
|
+
await startPullRequestTutorial()
|
|
748
755
|
} else {
|
|
749
|
-
console.log("❌ Opción no válida. Elige 1 o
|
|
756
|
+
console.log("❌ Opción no válida. Elige 1, 2 o 3.")
|
|
750
757
|
rl.close()
|
|
751
758
|
}
|
|
752
759
|
|
|
@@ -1405,3 +1412,35 @@ async function startProyectosSelectorFallback() {
|
|
|
1405
1412
|
process.exit(1)
|
|
1406
1413
|
}
|
|
1407
1414
|
}
|
|
1415
|
+
|
|
1416
|
+
async function startPullRequestTutorial() {
|
|
1417
|
+
console.clear()
|
|
1418
|
+
console.log("🔀 Tutorial: Crea una Pull Request")
|
|
1419
|
+
console.log("=" .repeat(50))
|
|
1420
|
+
console.log("")
|
|
1421
|
+
console.log("📚 Aprenderás:")
|
|
1422
|
+
console.log(" • Cómo hacer fork de un repositorio")
|
|
1423
|
+
console.log(" • Crear una rama (branch) para tu cambio")
|
|
1424
|
+
console.log(" • Hacer commits con buenas prácticas")
|
|
1425
|
+
console.log(" • Crear una pull request profesional")
|
|
1426
|
+
console.log("")
|
|
1427
|
+
console.log("🚧 [PRÓXIMAMENTE]")
|
|
1428
|
+
console.log("")
|
|
1429
|
+
console.log("Esta funcionalidad está en desarrollo.")
|
|
1430
|
+
console.log("Pronto podrás practicar el flujo completo de contribución.")
|
|
1431
|
+
console.log("")
|
|
1432
|
+
|
|
1433
|
+
const rl = createInterface({
|
|
1434
|
+
input: process.stdin,
|
|
1435
|
+
output: process.stdout
|
|
1436
|
+
})
|
|
1437
|
+
|
|
1438
|
+
await new Promise((resolve) => {
|
|
1439
|
+
rl.question("\nPresiona Enter para volver al menú principal...", () => {
|
|
1440
|
+
rl.close()
|
|
1441
|
+
resolve()
|
|
1442
|
+
})
|
|
1443
|
+
})
|
|
1444
|
+
|
|
1445
|
+
await startMainMenu()
|
|
1446
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// LECCIÓN 7: Un objeto es un conjunto de datos y procedimientos que operan sobre esos datos
|
|
4
|
-
// Enfoque
|
|
4
|
+
// Enfoque conceptual: Entender qué es un dato, qué es un procedimiento, y por qué están unidos
|
|
5
5
|
|
|
6
6
|
import { createInterface } from 'readline'
|
|
7
7
|
|
|
@@ -16,370 +16,277 @@ export class Lesson7ObjectDefinition {
|
|
|
16
16
|
async start() {
|
|
17
17
|
await this.waitForEnter("\nPresiona Enter para comenzar...")
|
|
18
18
|
|
|
19
|
-
await this.
|
|
19
|
+
await this.conceptualExercise()
|
|
20
20
|
await this.conclusion()
|
|
21
21
|
|
|
22
22
|
this.rl.close()
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
async
|
|
25
|
+
async conceptualExercise() {
|
|
26
26
|
console.clear()
|
|
27
|
-
console.log("
|
|
28
|
-
console.log("
|
|
29
|
-
console.log("
|
|
27
|
+
console.log("Para entender qué ES un objeto,")
|
|
28
|
+
console.log("primero debemos entender dos conceptos fundamentales:")
|
|
29
|
+
console.log("")
|
|
30
|
+
console.log("1. ¿Qué es un DATO?")
|
|
31
|
+
console.log("2. ¿Qué es un PROCEDIMIENTO?")
|
|
30
32
|
|
|
31
33
|
await this.waitForEnter("\nPresiona Enter para continuar...")
|
|
32
34
|
|
|
33
|
-
await this.
|
|
34
|
-
await this.
|
|
35
|
-
await this.
|
|
35
|
+
await this.step1_WhatIsData()
|
|
36
|
+
await this.step2_WhatIsProcedure()
|
|
37
|
+
await this.step3_WhyTogether()
|
|
38
|
+
await this.step4_ObjectDefinition()
|
|
36
39
|
}
|
|
37
40
|
|
|
38
|
-
async
|
|
41
|
+
async step1_WhatIsData() {
|
|
39
42
|
console.clear()
|
|
40
|
-
console.log("
|
|
43
|
+
console.log("¿Qué es un DATO?")
|
|
41
44
|
console.log("=" .repeat(50))
|
|
42
45
|
|
|
43
|
-
console.log("\n
|
|
44
|
-
console.log("\n📊 Datos sueltos:")
|
|
46
|
+
console.log("\n🔍 Un dato es información que describe el estado de algo")
|
|
45
47
|
|
|
46
|
-
|
|
47
|
-
let accountNumber = "001-234567"
|
|
48
|
-
let ownerName = "María González"
|
|
49
|
-
let balance = 5000
|
|
50
|
-
let isActive = true`
|
|
48
|
+
await this.waitForEnter("\nPresiona Enter para ver ejemplos conceptuales...")
|
|
51
49
|
|
|
52
|
-
|
|
50
|
+
console.log("\n📦 Ejemplos de datos:")
|
|
51
|
+
console.log("")
|
|
52
|
+
console.log("• El saldo de una cuenta")
|
|
53
|
+
console.log(" → Este número describe cuánto dinero hay")
|
|
54
|
+
console.log("")
|
|
55
|
+
console.log("• El nombre de un usuario")
|
|
56
|
+
console.log(" → Este texto describe quién es")
|
|
57
|
+
console.log("")
|
|
58
|
+
console.log("• El estado de una puerta (abierta/cerrada)")
|
|
59
|
+
console.log(" → Este valor describe la condición actual")
|
|
60
|
+
console.log("")
|
|
61
|
+
console.log("• La lista de productos en un carrito")
|
|
62
|
+
console.log(" → Esta colección describe qué contiene")
|
|
53
63
|
|
|
54
|
-
await this.waitForEnter("\nPresiona Enter para
|
|
55
|
-
|
|
56
|
-
console.log("\n⚙️ Funciones separadas que operan sobre esos datos:")
|
|
64
|
+
await this.waitForEnter("\nPresiona Enter para continuar...")
|
|
57
65
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
console.log("
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
console.log("
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
balance += amount
|
|
68
|
-
return true
|
|
69
|
-
}
|
|
66
|
+
console.log("\n💡 Característica clave de los datos:")
|
|
67
|
+
console.log("Los datos DESCRIBEN, no HACEN nada por sí mismos")
|
|
68
|
+
console.log("")
|
|
69
|
+
console.log("El saldo de 5000 no se deposita solo")
|
|
70
|
+
console.log("El nombre 'María' no se cambia solo")
|
|
71
|
+
console.log("La puerta cerrada no se abre sola")
|
|
72
|
+
console.log("")
|
|
73
|
+
console.log("Los datos son PASIVOS. Solo representan información.")
|
|
70
74
|
|
|
71
|
-
|
|
72
|
-
if (!isActive) return false
|
|
73
|
-
if (amount <= 0) return false
|
|
74
|
-
if (amount > balance) {
|
|
75
|
-
console.log("Fondos insuficientes")
|
|
76
|
-
return false
|
|
75
|
+
await this.waitForEnter("\nPresiona Enter para ver qué es un procedimiento...")
|
|
77
76
|
}
|
|
78
|
-
balance -= amount
|
|
79
|
-
return true
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function getBalance() {
|
|
83
|
-
return isActive ? balance : 0
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function deactivate() {
|
|
87
|
-
isActive = false
|
|
88
|
-
}`
|
|
89
|
-
|
|
90
|
-
this.printCodeWithColors("Funciones sueltas", functionsCode)
|
|
91
|
-
|
|
92
|
-
await this.waitForEnter("\nPresiona Enter para ver el problema...")
|
|
93
77
|
|
|
78
|
+
async step2_WhatIsProcedure() {
|
|
94
79
|
console.clear()
|
|
95
|
-
console.log("
|
|
80
|
+
console.log("¿Qué es un PROCEDIMIENTO?")
|
|
96
81
|
console.log("=" .repeat(50))
|
|
97
82
|
|
|
98
|
-
console.log("\
|
|
99
|
-
console.log(" • Cualquier código puede modificar 'balance' directamente")
|
|
100
|
-
console.log(" • No hay protección de los datos")
|
|
101
|
-
|
|
102
|
-
console.log("\n2️⃣ Funciones no están vinculadas a datos:")
|
|
103
|
-
console.log(" • deposit() asume que 'balance' existe")
|
|
104
|
-
console.log(" • ¿Qué pasa si necesitamos múltiples cuentas?")
|
|
83
|
+
console.log("\n🔍 Un procedimiento es una secuencia de pasos que MODIFICA o LEE datos")
|
|
105
84
|
|
|
106
|
-
|
|
85
|
+
await this.waitForEnter("\nPresiona Enter para ver ejemplos conceptuales...")
|
|
107
86
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
87
|
+
console.log("\n⚙️ Ejemplos de procedimientos:")
|
|
88
|
+
console.log("")
|
|
89
|
+
console.log("• Depositar dinero en una cuenta")
|
|
90
|
+
console.log(" → MODIFICA el dato 'saldo' sumándole una cantidad")
|
|
91
|
+
console.log("")
|
|
92
|
+
console.log("• Cambiar el nombre de un usuario")
|
|
93
|
+
console.log(" → MODIFICA el dato 'nombre' asignándole un nuevo valor")
|
|
94
|
+
console.log("")
|
|
95
|
+
console.log("• Abrir una puerta")
|
|
96
|
+
console.log(" → MODIFICA el dato 'estado' de 'cerrada' a 'abierta'")
|
|
97
|
+
console.log("")
|
|
98
|
+
console.log("• Consultar el saldo")
|
|
99
|
+
console.log(" → LEE el dato 'saldo' sin modificarlo")
|
|
113
100
|
|
|
114
|
-
|
|
115
|
-
deposit(100) // ¿A cuál cuenta?`
|
|
116
|
-
|
|
117
|
-
this.printCodeWithColors("Escalabilidad problemática", problemCode)
|
|
101
|
+
await this.waitForEnter("\nPresiona Enter para continuar...")
|
|
118
102
|
|
|
119
|
-
|
|
103
|
+
console.log("\n💡 Característica clave de los procedimientos:")
|
|
104
|
+
console.log("Los procedimientos son ACTIVOS. Hacen algo con los datos.")
|
|
105
|
+
console.log("")
|
|
106
|
+
console.log("Un procedimiento sin datos no tiene sentido:")
|
|
107
|
+
console.log(" • ¿Depositar en dónde?")
|
|
108
|
+
console.log(" • ¿Cambiar qué nombre?")
|
|
109
|
+
console.log(" • ¿Abrir cuál puerta?")
|
|
110
|
+
console.log("")
|
|
111
|
+
console.log("Los procedimientos NECESITAN datos para operar")
|
|
112
|
+
|
|
113
|
+
await this.waitForEnter("\nPresiona Enter para ver por qué están unidos...")
|
|
120
114
|
}
|
|
121
115
|
|
|
122
|
-
async
|
|
116
|
+
async step3_WhyTogether() {
|
|
123
117
|
console.clear()
|
|
124
|
-
console.log("
|
|
118
|
+
console.log("¿Por qué DATOS y PROCEDIMIENTOS están JUNTOS?")
|
|
125
119
|
console.log("=" .repeat(50))
|
|
126
120
|
|
|
127
|
-
console.log("\n
|
|
128
|
-
console.log("
|
|
121
|
+
console.log("\n🤔 La pregunta fundamental:")
|
|
122
|
+
console.log("Si los datos describen el estado,")
|
|
123
|
+
console.log("y los procedimientos modifican ese estado,")
|
|
124
|
+
console.log("¿no deberían estar relacionados?")
|
|
129
125
|
|
|
130
|
-
await this.waitForEnter("\nPresiona Enter para ver
|
|
126
|
+
await this.waitForEnter("\nPresiona Enter para ver la respuesta...")
|
|
131
127
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
this.balance = initialBalance
|
|
138
|
-
this.isActive = true
|
|
139
|
-
}
|
|
128
|
+
console.log("\n✨ La respuesta: EL OBJETO")
|
|
129
|
+
console.log("")
|
|
130
|
+
console.log("Un objeto es la unión natural de:")
|
|
131
|
+
console.log(" • Los datos que describen SU estado")
|
|
132
|
+
console.log(" • Los procedimientos que operan sobre ESE estado")
|
|
140
133
|
|
|
141
|
-
|
|
142
|
-
deposit(amount) {
|
|
143
|
-
if (!this.isActive) {
|
|
144
|
-
console.log("Cuenta inactiva")
|
|
145
|
-
return false
|
|
146
|
-
}
|
|
147
|
-
if (amount <= 0) {
|
|
148
|
-
console.log("Cantidad inválida")
|
|
149
|
-
return false
|
|
150
|
-
}
|
|
151
|
-
this.balance += amount
|
|
152
|
-
return true
|
|
153
|
-
}
|
|
134
|
+
await this.waitForEnter("\nPresiona Enter para ver un ejemplo conceptual...")
|
|
154
135
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
136
|
+
console.log("\n📍 Ejemplo conceptual: Una cuenta bancaria")
|
|
137
|
+
console.log("")
|
|
138
|
+
console.log("┌─────────────────────────────────────┐")
|
|
139
|
+
console.log("│ OBJETO: Cuenta │")
|
|
140
|
+
console.log("├─────────────────────────────────────┤")
|
|
141
|
+
console.log("│ DATOS (estado): │")
|
|
142
|
+
console.log("│ • saldo │")
|
|
143
|
+
console.log("│ • titular │")
|
|
144
|
+
console.log("│ • activa │")
|
|
145
|
+
console.log("├─────────────────────────────────────┤")
|
|
146
|
+
console.log("│ PROCEDIMIENTOS (operaciones): │")
|
|
147
|
+
console.log("│ • depositar │")
|
|
148
|
+
console.log("│ • retirar │")
|
|
149
|
+
console.log("│ • consultarSaldo │")
|
|
150
|
+
console.log("│ • desactivar │")
|
|
151
|
+
console.log("└─────────────────────────────────────┘")
|
|
165
152
|
|
|
166
|
-
|
|
167
|
-
return this.isActive ? this.balance : 0
|
|
168
|
-
}
|
|
153
|
+
await this.waitForEnter("\nPresiona Enter para continuar...")
|
|
169
154
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
155
|
+
console.log("\n🔗 La relación esencial:")
|
|
156
|
+
console.log("")
|
|
157
|
+
console.log("• 'depositar' opera sobre 'saldo'")
|
|
158
|
+
console.log(" → No tiene sentido depositar sin un saldo que modificar")
|
|
159
|
+
console.log("")
|
|
160
|
+
console.log("• 'desactivar' opera sobre 'activa'")
|
|
161
|
+
console.log(" → No tiene sentido desactivar sin un estado que cambiar")
|
|
162
|
+
console.log("")
|
|
163
|
+
console.log("• 'consultarSaldo' lee 'saldo'")
|
|
164
|
+
console.log(" → No tiene sentido consultar sin un saldo que leer")
|
|
173
165
|
|
|
174
|
-
|
|
175
|
-
return {
|
|
176
|
-
number: this.accountNumber,
|
|
177
|
-
owner: this.ownerName,
|
|
178
|
-
balance: this.getBalance(),
|
|
179
|
-
status: this.isActive ? 'Activa' : 'Inactiva'
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}`
|
|
166
|
+
await this.waitForEnter("\nPresiona Enter para continuar...")
|
|
183
167
|
|
|
184
|
-
|
|
168
|
+
console.log("\n💭 La intuición:")
|
|
169
|
+
console.log("Los datos y los procedimientos están ATADOS entre sí")
|
|
170
|
+
console.log("")
|
|
171
|
+
console.log("No existen datos sin procedimientos que los manipulen")
|
|
172
|
+
console.log("No existen procedimientos sin datos sobre los que operen")
|
|
173
|
+
console.log("")
|
|
174
|
+
console.log("Esta unión es lo que llamamos: OBJETO")
|
|
185
175
|
|
|
186
|
-
await this.waitForEnter("\nPresiona Enter para ver
|
|
176
|
+
await this.waitForEnter("\nPresiona Enter para ver la definición completa...")
|
|
177
|
+
}
|
|
187
178
|
|
|
179
|
+
async step4_ObjectDefinition() {
|
|
188
180
|
console.clear()
|
|
189
|
-
console.log("
|
|
181
|
+
console.log("La Definición Completa")
|
|
190
182
|
console.log("=" .repeat(50))
|
|
191
183
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
const account2 = new BankAccount("001-789012", "Juan Pérez", 3000)
|
|
195
|
-
|
|
196
|
-
// Cada objeto tiene SUS PROPIOS datos
|
|
197
|
-
account1.deposit(500)
|
|
198
|
-
account2.withdraw(200)
|
|
199
|
-
|
|
200
|
-
console.log(account1.getBalance()) // 5500
|
|
201
|
-
console.log(account2.getBalance()) // 2800
|
|
202
|
-
|
|
203
|
-
// Las operaciones operan sobre los datos del objeto específico
|
|
204
|
-
account1.deactivate()
|
|
205
|
-
console.log(account1.isActive) // false
|
|
206
|
-
console.log(account2.isActive) // true ← No afectado`
|
|
207
|
-
|
|
208
|
-
this.printCodeWithColors("Uso del objeto", usageCode)
|
|
184
|
+
console.log("\n💎 'Un objeto es un conjunto de datos y procedimientos")
|
|
185
|
+
console.log(" que operan sobre esos datos'")
|
|
209
186
|
|
|
210
|
-
await this.waitForEnter("\nPresiona Enter para
|
|
211
|
-
}
|
|
187
|
+
await this.waitForEnter("\nPresiona Enter para desglosar la definición...")
|
|
212
188
|
|
|
213
|
-
|
|
214
|
-
console.
|
|
215
|
-
console.log("
|
|
216
|
-
console.log("
|
|
189
|
+
console.log("\n🔍 Desglose de la definición:")
|
|
190
|
+
console.log("")
|
|
191
|
+
console.log("1️⃣ 'Un objeto es un CONJUNTO'")
|
|
192
|
+
console.log(" → No es un solo elemento, es una agrupación")
|
|
193
|
+
console.log(" → Datos y procedimientos forman una unidad")
|
|
194
|
+
console.log("")
|
|
217
195
|
|
|
218
|
-
|
|
219
|
-
console.log(" Datos: let balance = 5000")
|
|
220
|
-
console.log(" Operación: function deposit(amount) { balance += amount }")
|
|
221
|
-
console.log(" ❌ Separados, sin relación formal")
|
|
196
|
+
await this.waitForEnter("Presiona Enter para continuar...")
|
|
222
197
|
|
|
223
|
-
console.log("
|
|
224
|
-
console.log("
|
|
225
|
-
console.log("
|
|
226
|
-
console.log("
|
|
198
|
+
console.log("2️⃣ '...de DATOS'")
|
|
199
|
+
console.log(" → Información que describe el estado del objeto")
|
|
200
|
+
console.log(" → Valores que representan lo que el objeto 'es'")
|
|
201
|
+
console.log(" → PASIVOS: no hacen nada por sí mismos")
|
|
202
|
+
console.log("")
|
|
227
203
|
|
|
228
|
-
await this.waitForEnter("
|
|
204
|
+
await this.waitForEnter("Presiona Enter para continuar...")
|
|
229
205
|
|
|
230
|
-
console.
|
|
231
|
-
console.log("
|
|
232
|
-
console.log("
|
|
206
|
+
console.log("3️⃣ '...y PROCEDIMIENTOS'")
|
|
207
|
+
console.log(" → Secuencias de pasos que modifican o leen datos")
|
|
208
|
+
console.log(" → Operaciones que representan lo que el objeto 'hace'")
|
|
209
|
+
console.log(" → ACTIVOS: transforman el estado")
|
|
210
|
+
console.log("")
|
|
233
211
|
|
|
234
|
-
|
|
235
|
-
console.log("│ OBJETO: account1 │")
|
|
236
|
-
console.log("├─────────────────────────────────────┤")
|
|
237
|
-
console.log("│ DATOS: │")
|
|
238
|
-
console.log("│ • accountNumber = \"001-234567\" │")
|
|
239
|
-
console.log("│ • ownerName = \"María González\" │")
|
|
240
|
-
console.log("│ • balance = 5000 │")
|
|
241
|
-
console.log("│ • isActive = true │")
|
|
242
|
-
console.log("├─────────────────────────────────────┤")
|
|
243
|
-
console.log("│ OPERACIONES: │")
|
|
244
|
-
console.log("│ • deposit(amount) │")
|
|
245
|
-
console.log("│ • withdraw(amount) │")
|
|
246
|
-
console.log("│ • getBalance() │")
|
|
247
|
-
console.log("│ • deactivate() │")
|
|
248
|
-
console.log("└─────────────────────────────────────┘")
|
|
212
|
+
await this.waitForEnter("Presiona Enter para continuar...")
|
|
249
213
|
|
|
250
|
-
console.log("
|
|
251
|
-
console.log("
|
|
252
|
-
console.log("
|
|
253
|
-
console.log("
|
|
214
|
+
console.log("4️⃣ '...que OPERAN SOBRE esos datos'")
|
|
215
|
+
console.log(" → Los procedimientos NO operan sobre datos ajenos")
|
|
216
|
+
console.log(" → Solo modifican/leen los datos del MISMO objeto")
|
|
217
|
+
console.log(" → Esta es la relación fundamental")
|
|
254
218
|
|
|
255
|
-
await this.waitForEnter("\nPresiona Enter para ver
|
|
219
|
+
await this.waitForEnter("\nPresiona Enter para ver por qué esto importa...")
|
|
256
220
|
|
|
257
221
|
console.clear()
|
|
258
|
-
console.log("
|
|
222
|
+
console.log("¿Por qué esta definición es fundamental?")
|
|
259
223
|
console.log("=" .repeat(50))
|
|
260
224
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
getTotal() {
|
|
285
|
-
return this.totalAmount
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
getItemCount() {
|
|
289
|
-
return this.items.reduce((sum, item) => sum + item.quantity, 0)
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
clear() {
|
|
293
|
-
this.items = []
|
|
294
|
-
this.totalAmount = 0
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// Uso
|
|
299
|
-
const cart = new ShoppingCart("user123")
|
|
300
|
-
cart.addItem({ id: 1, name: "Libro", price: 299 }, 2)
|
|
301
|
-
cart.addItem({ id: 2, name: "Café", price: 85 }, 1)
|
|
302
|
-
|
|
303
|
-
console.log(cart.getTotal()) // 683
|
|
304
|
-
console.log(cart.getItemCount()) // 3`
|
|
305
|
-
|
|
306
|
-
this.printCodeWithColors("Clase ShoppingCart", cartCode)
|
|
225
|
+
console.log("\n🎯 Sin entender qué ES un objeto,")
|
|
226
|
+
console.log(" no podemos entender los otros 6 enunciados:")
|
|
227
|
+
console.log("")
|
|
228
|
+
console.log("• Enunciado 1: ¿Cómo descomponemos en objetos")
|
|
229
|
+
console.log(" si no sabemos qué es un objeto?")
|
|
230
|
+
console.log("")
|
|
231
|
+
console.log("• Enunciado 2: ¿Cómo interactúan los objetos")
|
|
232
|
+
console.log(" si no entendemos su naturaleza?")
|
|
233
|
+
console.log("")
|
|
234
|
+
console.log("• Enunciado 3: ¿Por qué solicitudes son la única forma")
|
|
235
|
+
console.log(" de invocar procedimientos?")
|
|
236
|
+
console.log("")
|
|
237
|
+
console.log("• Enunciado 4: ¿Qué firmas tienen las operaciones")
|
|
238
|
+
console.log(" (los procedimientos) del objeto?")
|
|
239
|
+
console.log("")
|
|
240
|
+
console.log("• Enunciado 5: ¿Qué es la interfaz del objeto")
|
|
241
|
+
console.log(" sino el conjunto de sus operaciones?")
|
|
242
|
+
console.log("")
|
|
243
|
+
console.log("• Enunciado 6: ¿Por qué diseñar las interfaces primero")
|
|
244
|
+
console.log(" si no sabemos que exponen operaciones?")
|
|
307
245
|
|
|
308
246
|
await this.waitForEnter("\nPresiona Enter para la conclusión...")
|
|
309
247
|
}
|
|
310
248
|
|
|
311
249
|
async conclusion() {
|
|
312
250
|
console.clear()
|
|
313
|
-
console.log("🎓 Conclusión:
|
|
251
|
+
console.log("🎓 Conclusión: La Naturaleza del Objeto")
|
|
314
252
|
console.log("=" .repeat(50))
|
|
315
253
|
|
|
316
|
-
console.log("\n
|
|
317
|
-
console.log("
|
|
318
|
-
console.log("
|
|
319
|
-
|
|
320
|
-
console.log("
|
|
321
|
-
console.log("
|
|
322
|
-
|
|
323
|
-
console.log("
|
|
324
|
-
console.log("
|
|
325
|
-
|
|
326
|
-
console.log("
|
|
327
|
-
console.log("
|
|
328
|
-
|
|
329
|
-
console.log("
|
|
330
|
-
console.log("
|
|
331
|
-
|
|
332
|
-
console.log("
|
|
333
|
-
console.log("•
|
|
334
|
-
console.log("•
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
console.log("
|
|
338
|
-
console.log("
|
|
339
|
-
console.log("
|
|
340
|
-
console.log("
|
|
341
|
-
|
|
342
|
-
console.log("
|
|
343
|
-
console.log("
|
|
344
|
-
console.log("debemos entender QUÉ ES un objeto:")
|
|
345
|
-
console.log("datos + procedimientos, unidos e inseparables.")
|
|
254
|
+
console.log("\n📌 Lo que aprendimos:")
|
|
255
|
+
console.log("")
|
|
256
|
+
console.log("1. Un DATO describe el estado (información pasiva)")
|
|
257
|
+
console.log("2. Un PROCEDIMIENTO modifica o lee datos (acción activa)")
|
|
258
|
+
console.log("3. Un OBJETO une datos con sus procedimientos")
|
|
259
|
+
console.log("4. Esta unión no es arbitraria, es esencial")
|
|
260
|
+
|
|
261
|
+
console.log("\n💡 La intuición central:")
|
|
262
|
+
console.log("")
|
|
263
|
+
console.log("Los datos no existen aislados")
|
|
264
|
+
console.log("Los procedimientos no operan en el vacío")
|
|
265
|
+
console.log("El objeto es la unión natural de ambos")
|
|
266
|
+
|
|
267
|
+
console.log("\n🔗 Conexión con el resto del paradigma:")
|
|
268
|
+
console.log("")
|
|
269
|
+
console.log("Ahora que sabemos QUÉ es un objeto,")
|
|
270
|
+
console.log("podemos entender:")
|
|
271
|
+
console.log(" • Cómo descomponerlos (enunciado 1)")
|
|
272
|
+
console.log(" • Cómo se comunican (enunciados 2, 3)")
|
|
273
|
+
console.log(" • Cómo se diseñan (enunciados 4, 5, 6)")
|
|
274
|
+
|
|
275
|
+
console.log("\n💭 Reflexión final:")
|
|
276
|
+
console.log("")
|
|
277
|
+
console.log("Antes de diseñar sistemas orientados a objetos,")
|
|
278
|
+
console.log("debemos entender la naturaleza fundamental del objeto:")
|
|
279
|
+
console.log("")
|
|
280
|
+
console.log(" 'Un conjunto de datos y procedimientos")
|
|
281
|
+
console.log(" que operan sobre esos datos'")
|
|
346
282
|
|
|
347
283
|
await this.waitForEnter("\n✨ ¡Lección 7 completada! Presiona Enter para continuar...")
|
|
348
284
|
}
|
|
349
285
|
|
|
350
|
-
formatCode(code) {
|
|
351
|
-
const colors = {
|
|
352
|
-
keyword: '\x1b[35m',
|
|
353
|
-
property: '\x1b[32m',
|
|
354
|
-
string: '\x1b[33m',
|
|
355
|
-
comment: '\x1b[90m',
|
|
356
|
-
reset: '\x1b[0m'
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
return code
|
|
360
|
-
.replace(/\b(class|constructor|return|if|const|let|new|function)\b/g, `${colors.keyword}$1${colors.reset}`)
|
|
361
|
-
.replace(/\bthis\./g, `${colors.property}this.${colors.reset}`)
|
|
362
|
-
.replace(/'([^']*)'/g, `${colors.string}'$1'${colors.reset}`)
|
|
363
|
-
.replace(/"([^"]*)"/g, `${colors.string}"$1"${colors.reset}`)
|
|
364
|
-
.replace(/\/\/.*$/gm, `${colors.comment}$&${colors.reset}`)
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
printCodeWithColors(title, code) {
|
|
368
|
-
console.log(`\n${title}`)
|
|
369
|
-
console.log("━".repeat(50))
|
|
370
|
-
|
|
371
|
-
code.split('\n').forEach(line => {
|
|
372
|
-
const formattedLine = this.formatCode(line)
|
|
373
|
-
console.log(formattedLine)
|
|
374
|
-
})
|
|
375
|
-
|
|
376
|
-
console.log("━".repeat(50))
|
|
377
|
-
}
|
|
378
|
-
|
|
379
286
|
async waitForEnter(message) {
|
|
380
287
|
return new Promise((resolve) => {
|
|
381
288
|
this.rl.question(message, () => {
|
|
382
|
-
console.log("\n
|
|
289
|
+
console.log("\n")
|
|
383
290
|
resolve()
|
|
384
291
|
})
|
|
385
292
|
})
|