@icarusmx/creta 1.1.1 → 1.2.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/lessons/lesson7-object-definition.js +198 -290
- package/package.json +1 -1
|
@@ -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,369 +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?")
|
|
105
|
-
|
|
106
|
-
console.log("\n3️⃣ Difícil de escalar:")
|
|
83
|
+
console.log("\n🔍 Un procedimiento es una secuencia de pasos que MODIFICA o LEE datos")
|
|
107
84
|
|
|
108
|
-
|
|
109
|
-
let balance1 = 5000
|
|
110
|
-
let balance2 = 3000
|
|
111
|
-
let accountNumber1 = "001"
|
|
112
|
-
let accountNumber2 = "002"
|
|
85
|
+
await this.waitForEnter("\nPresiona Enter para ver ejemplos conceptuales...")
|
|
113
86
|
|
|
114
|
-
|
|
115
|
-
|
|
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")
|
|
116
100
|
|
|
117
|
-
this.
|
|
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)
|
|
184
|
+
console.log("\n💎 'Un objeto es un conjunto de datos y procedimientos")
|
|
185
|
+
console.log(" que operan sobre esos datos'")
|
|
195
186
|
|
|
196
|
-
|
|
197
|
-
account1.deposit(500)
|
|
198
|
-
account2.withdraw(200)
|
|
187
|
+
await this.waitForEnter("\nPresiona Enter para desglosar la definición...")
|
|
199
188
|
|
|
200
|
-
console.log(
|
|
201
|
-
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("")
|
|
202
195
|
|
|
203
|
-
|
|
204
|
-
account1.deactivate()
|
|
205
|
-
console.log(account1.isActive) // false
|
|
206
|
-
console.log(account2.isActive) // true ← No afectado`
|
|
196
|
+
await this.waitForEnter("Presiona Enter para continuar...")
|
|
207
197
|
|
|
208
|
-
|
|
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("")
|
|
209
203
|
|
|
210
|
-
await this.waitForEnter("
|
|
211
|
-
}
|
|
204
|
+
await this.waitForEnter("Presiona Enter para continuar...")
|
|
212
205
|
|
|
213
|
-
|
|
214
|
-
console.
|
|
215
|
-
console.log("
|
|
216
|
-
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("")
|
|
217
211
|
|
|
218
|
-
|
|
219
|
-
console.log(" Datos: let balance = 5000")
|
|
220
|
-
console.log(" Procedimiento: function deposit(amount) { balance += amount }")
|
|
221
|
-
console.log(" ❌ Separados, sin relación formal")
|
|
212
|
+
await this.waitForEnter("Presiona Enter para continuar...")
|
|
222
213
|
|
|
223
|
-
console.log("
|
|
224
|
-
console.log("
|
|
225
|
-
console.log("
|
|
226
|
-
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")
|
|
227
218
|
|
|
228
|
-
await this.waitForEnter("\nPresiona Enter para ver
|
|
219
|
+
await this.waitForEnter("\nPresiona Enter para ver por qué esto importa...")
|
|
229
220
|
|
|
230
221
|
console.clear()
|
|
231
|
-
console.log("
|
|
222
|
+
console.log("¿Por qué esta definición es fundamental?")
|
|
232
223
|
console.log("=" .repeat(50))
|
|
233
224
|
|
|
234
|
-
console.log("\n
|
|
235
|
-
console.log("
|
|
236
|
-
console.log("
|
|
237
|
-
console.log("
|
|
238
|
-
console.log("
|
|
239
|
-
console.log("
|
|
240
|
-
console.log("
|
|
241
|
-
console.log("
|
|
242
|
-
console.log("
|
|
243
|
-
console.log("
|
|
244
|
-
console.log("
|
|
245
|
-
console.log("
|
|
246
|
-
console.log("
|
|
247
|
-
console.log("
|
|
248
|
-
console.log("
|
|
249
|
-
|
|
250
|
-
console.log("
|
|
251
|
-
console.log("
|
|
252
|
-
console.log("
|
|
253
|
-
console.log("
|
|
254
|
-
|
|
255
|
-
await this.waitForEnter("\nPresiona Enter para ver otro ejemplo...")
|
|
256
|
-
|
|
257
|
-
console.clear()
|
|
258
|
-
console.log("🎮 Ejemplo 2: Sistema de Carrito de Compras")
|
|
259
|
-
console.log("=" .repeat(50))
|
|
260
|
-
|
|
261
|
-
const cartCode = `class ShoppingCart {
|
|
262
|
-
// DATOS del carrito
|
|
263
|
-
constructor(userId) {
|
|
264
|
-
this.userId = userId
|
|
265
|
-
this.items = []
|
|
266
|
-
this.totalAmount = 0
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// PROCEDIMIENTOS que operan sobre estos datos
|
|
270
|
-
addItem(product, quantity) {
|
|
271
|
-
const item = { product, quantity, price: product.price * quantity }
|
|
272
|
-
this.items.push(item)
|
|
273
|
-
this.totalAmount += item.price
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
removeItem(productId) {
|
|
277
|
-
const itemIndex = this.items.findIndex(i => i.product.id === productId)
|
|
278
|
-
if (itemIndex > -1) {
|
|
279
|
-
this.totalAmount -= this.items[itemIndex].price
|
|
280
|
-
this.items.splice(itemIndex, 1)
|
|
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
|
-
|
|
341
|
-
console.log("
|
|
342
|
-
console.log("
|
|
343
|
-
console.log("
|
|
344
|
-
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'")
|
|
345
282
|
|
|
346
283
|
await this.waitForEnter("\n✨ ¡Lección 7 completada! Presiona Enter para continuar...")
|
|
347
284
|
}
|
|
348
285
|
|
|
349
|
-
formatCode(code) {
|
|
350
|
-
const colors = {
|
|
351
|
-
keyword: '\x1b[35m',
|
|
352
|
-
property: '\x1b[32m',
|
|
353
|
-
string: '\x1b[33m',
|
|
354
|
-
comment: '\x1b[90m',
|
|
355
|
-
reset: '\x1b[0m'
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
return code
|
|
359
|
-
.replace(/\b(class|constructor|return|if|const|let|new|function)\b/g, `${colors.keyword}$1${colors.reset}`)
|
|
360
|
-
.replace(/\bthis\./g, `${colors.property}this.${colors.reset}`)
|
|
361
|
-
.replace(/'([^']*)'/g, `${colors.string}'$1'${colors.reset}`)
|
|
362
|
-
.replace(/"([^"]*)"/g, `${colors.string}"$1"${colors.reset}`)
|
|
363
|
-
.replace(/\/\/.*$/gm, `${colors.comment}$&${colors.reset}`)
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
printCodeWithColors(title, code) {
|
|
367
|
-
console.log(`\n${title}`)
|
|
368
|
-
console.log("━".repeat(50))
|
|
369
|
-
|
|
370
|
-
code.split('\n').forEach(line => {
|
|
371
|
-
const formattedLine = this.formatCode(line)
|
|
372
|
-
console.log(formattedLine)
|
|
373
|
-
})
|
|
374
|
-
|
|
375
|
-
console.log("━".repeat(50))
|
|
376
|
-
}
|
|
377
|
-
|
|
378
286
|
async waitForEnter(message) {
|
|
379
287
|
return new Promise((resolve) => {
|
|
380
288
|
this.rl.question(message, () => {
|
|
381
|
-
console.log("\n
|
|
289
|
+
console.log("\n")
|
|
382
290
|
resolve()
|
|
383
291
|
})
|
|
384
292
|
})
|