@icarusmx/creta 0.10.0 → 0.10.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/lessons/lesson1-system-decomposition.js +151 -159
- package/package.json +1 -1
|
@@ -14,16 +14,11 @@ export class Lesson1SystemDecomposition {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
async start() {
|
|
17
|
-
console.log("
|
|
17
|
+
console.log("LECCIÓN 1: Descomposición de Sistemas")
|
|
18
18
|
console.log("=" .repeat(50))
|
|
19
|
-
console.log("
|
|
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")
|
|
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í.")
|
|
25
20
|
|
|
26
|
-
await this.waitForEnter("\nPresiona Enter para comenzar
|
|
21
|
+
await this.waitForEnter("\nPresiona Enter para comenzar...")
|
|
27
22
|
|
|
28
23
|
await this.practicalExercise()
|
|
29
24
|
await this.conclusion()
|
|
@@ -33,53 +28,33 @@ export class Lesson1SystemDecomposition {
|
|
|
33
28
|
|
|
34
29
|
async practicalExercise() {
|
|
35
30
|
console.clear()
|
|
36
|
-
console.log("
|
|
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")
|
|
31
|
+
console.log("Comenzaremos con dos definiciones de sistema y posteriormente")
|
|
40
32
|
console.log("ejemplificaremos la descomposición en objetos.")
|
|
41
33
|
|
|
42
|
-
await this.waitForEnter("\nPresiona Enter para
|
|
34
|
+
await this.waitForEnter("\nPresiona Enter para continuar...")
|
|
43
35
|
|
|
44
36
|
await this.step1_SystemDefinitions()
|
|
45
37
|
await this.step2_ApplyDefinitions()
|
|
46
|
-
await this.
|
|
47
|
-
await this.step4_ObjectIdentification()
|
|
38
|
+
await this.step3_ObjectIdentification()
|
|
48
39
|
}
|
|
49
40
|
|
|
50
41
|
async step1_SystemDefinitions() {
|
|
51
42
|
console.clear()
|
|
52
|
-
console.log("
|
|
53
|
-
console.log("
|
|
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")
|
|
43
|
+
console.log("DEFINICIÓN 1:")
|
|
44
|
+
console.log("El sistema es una totalidad deductiva de discurso")
|
|
62
45
|
|
|
63
|
-
console.log("\
|
|
64
|
-
console.log("
|
|
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")
|
|
46
|
+
console.log("\nDEFINICIÓN 2:")
|
|
47
|
+
console.log("El sistema es un conjunto de cosas que relacionadas")
|
|
48
|
+
console.log("entre sí ordenadamente contribuyen a un determinado propósito")
|
|
70
49
|
|
|
71
|
-
await this.waitForEnter("\
|
|
50
|
+
await this.waitForEnter("\nPresiona Enter para ver la biblioteca digital...")
|
|
72
51
|
}
|
|
73
52
|
|
|
74
53
|
async step2_ApplyDefinitions() {
|
|
75
54
|
console.clear()
|
|
76
|
-
console.log("
|
|
77
|
-
console.log("=" .repeat(45))
|
|
78
|
-
console.log("Vamos a analizar una \"Biblioteca Digital\" desde ambos enfoques:")
|
|
55
|
+
console.log("Sistema: Biblioteca Digital")
|
|
79
56
|
|
|
80
|
-
console.log("\
|
|
81
|
-
console.log("Las reglas lógicas que gobiernan el dominio:")
|
|
82
|
-
console.log("")
|
|
57
|
+
console.log("\nReglas del dominio:")
|
|
83
58
|
console.log("• Un libro puede estar disponible o prestado")
|
|
84
59
|
console.log("• Un usuario puede tener máximo N libros prestados")
|
|
85
60
|
console.log("• Un préstamo tiene fecha de inicio y vencimiento")
|
|
@@ -87,11 +62,9 @@ export class Lesson1SystemDecomposition {
|
|
|
87
62
|
console.log("• Un libro prestado no puede prestarse a otro usuario")
|
|
88
63
|
console.log("• Los préstamos vencidos generan multas")
|
|
89
64
|
|
|
90
|
-
await this.waitForEnter("\nPresiona Enter para ver
|
|
65
|
+
await this.waitForEnter("\nPresiona Enter para ver los componentes...")
|
|
91
66
|
|
|
92
|
-
console.log("\
|
|
93
|
-
console.log("Componentes que colaboran hacia el propósito de 'gestionar conocimiento':")
|
|
94
|
-
console.log("")
|
|
67
|
+
console.log("\nComponentes que colaboran:")
|
|
95
68
|
console.log("• Catálogo de libros disponibles")
|
|
96
69
|
console.log("• Sistema de usuarios registrados")
|
|
97
70
|
console.log("• Proceso de préstamos y devoluciones")
|
|
@@ -99,146 +72,165 @@ export class Lesson1SystemDecomposition {
|
|
|
99
72
|
console.log("• Búsqueda y recomendaciones")
|
|
100
73
|
console.log("• Reportes de uso y estadísticas")
|
|
101
74
|
|
|
102
|
-
await this.waitForEnter("\
|
|
75
|
+
await this.waitForEnter("\nPresiona Enter para ver la descomposición...")
|
|
103
76
|
}
|
|
104
77
|
|
|
105
|
-
async
|
|
78
|
+
async step3_ObjectIdentification() {
|
|
106
79
|
console.clear()
|
|
107
|
-
console.log("
|
|
108
|
-
|
|
109
|
-
console.log("
|
|
110
|
-
|
|
111
|
-
console.log("
|
|
112
|
-
console.log("
|
|
113
|
-
console.log("
|
|
114
|
-
console.log("
|
|
115
|
-
console.log("
|
|
116
|
-
console.log("
|
|
117
|
-
console.log("
|
|
118
|
-
|
|
119
|
-
console.log("
|
|
120
|
-
console.log("
|
|
121
|
-
console.log("
|
|
122
|
-
console.log("
|
|
123
|
-
console.log("
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
80
|
+
console.log("Descomposición en objetos:")
|
|
81
|
+
|
|
82
|
+
console.log("\nclass Book {")
|
|
83
|
+
console.log(" constructor(title, author, isbn) {")
|
|
84
|
+
console.log(" this.title = title")
|
|
85
|
+
console.log(" this.author = author")
|
|
86
|
+
console.log(" this.isbn = isbn")
|
|
87
|
+
console.log(" this.isLoaned = false")
|
|
88
|
+
console.log(" }")
|
|
89
|
+
console.log("")
|
|
90
|
+
console.log(" isAvailable() {")
|
|
91
|
+
console.log(" return !this.isLoaned")
|
|
92
|
+
console.log(" }")
|
|
93
|
+
console.log("")
|
|
94
|
+
console.log(" markAsLoaned() {")
|
|
95
|
+
console.log(" this.isLoaned = true")
|
|
96
|
+
console.log(" }")
|
|
97
|
+
console.log("")
|
|
98
|
+
console.log(" markAsReturned() {")
|
|
99
|
+
console.log(" this.isLoaned = false")
|
|
100
|
+
console.log(" }")
|
|
101
|
+
console.log("}")
|
|
127
102
|
|
|
128
|
-
|
|
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:")
|
|
103
|
+
await this.waitForEnter("\nPresiona Enter para ver User...")
|
|
133
104
|
|
|
134
|
-
console.log("\
|
|
135
|
-
console.log("(
|
|
105
|
+
console.log("\nclass User {")
|
|
106
|
+
console.log(" constructor(name, email, maxLoans = 3) {")
|
|
107
|
+
console.log(" this.name = name")
|
|
108
|
+
console.log(" this.email = email")
|
|
109
|
+
console.log(" this.maxLoans = maxLoans")
|
|
110
|
+
console.log(" this.currentLoans = []")
|
|
111
|
+
console.log(" }")
|
|
112
|
+
console.log("")
|
|
113
|
+
console.log(" canBorrow() {")
|
|
114
|
+
console.log(" return this.currentLoans.length < this.maxLoans")
|
|
115
|
+
console.log(" }")
|
|
136
116
|
console.log("")
|
|
137
|
-
console.log("
|
|
138
|
-
console.log("
|
|
139
|
-
console.log("
|
|
140
|
-
console.log("
|
|
117
|
+
console.log(" addLoan(loan) {")
|
|
118
|
+
console.log(" this.currentLoans.push(loan)")
|
|
119
|
+
console.log(" }")
|
|
120
|
+
console.log("")
|
|
121
|
+
console.log(" removeLoan(loan) {")
|
|
122
|
+
console.log(" const index = this.currentLoans.indexOf(loan)")
|
|
123
|
+
console.log(" if (index > -1) this.currentLoans.splice(index, 1)")
|
|
124
|
+
console.log(" }")
|
|
125
|
+
console.log("}")
|
|
141
126
|
|
|
142
|
-
await this.waitForEnter("\nPresiona Enter para ver
|
|
127
|
+
await this.waitForEnter("\nPresiona Enter para ver Loan...")
|
|
143
128
|
|
|
144
|
-
console.log("\
|
|
145
|
-
console.log("(
|
|
129
|
+
console.log("\nclass Loan {")
|
|
130
|
+
console.log(" constructor(user, book, durationDays = 14) {")
|
|
131
|
+
console.log(" this.user = user")
|
|
132
|
+
console.log(" this.book = book")
|
|
133
|
+
console.log(" this.startDate = new Date()")
|
|
134
|
+
console.log(" this.dueDate = new Date(Date.now() + durationDays * 24 * 60 * 60 * 1000)")
|
|
135
|
+
console.log(" this.returned = false")
|
|
136
|
+
console.log(" }")
|
|
146
137
|
console.log("")
|
|
147
|
-
console.log("
|
|
148
|
-
console.log("
|
|
149
|
-
console.log("
|
|
150
|
-
console.log("
|
|
138
|
+
console.log(" isOverdue() {")
|
|
139
|
+
console.log(" return !this.returned && new Date() > this.dueDate")
|
|
140
|
+
console.log(" }")
|
|
141
|
+
console.log("")
|
|
142
|
+
console.log(" calculateFine() {")
|
|
143
|
+
console.log(" if (!this.isOverdue()) return 0")
|
|
144
|
+
console.log(" const daysLate = Math.ceil((new Date() - this.dueDate) / (24 * 60 * 60 * 1000))")
|
|
145
|
+
console.log(" return daysLate * 5 // $5 por día")
|
|
146
|
+
console.log(" }")
|
|
147
|
+
console.log("")
|
|
148
|
+
console.log(" returnBook() {")
|
|
149
|
+
console.log(" this.returned = true")
|
|
150
|
+
console.log(" this.book.markAsReturned()")
|
|
151
|
+
console.log(" this.user.removeLoan(this)")
|
|
152
|
+
console.log(" }")
|
|
153
|
+
console.log("}")
|
|
151
154
|
|
|
152
|
-
await this.waitForEnter("\nPresiona Enter para ver
|
|
155
|
+
await this.waitForEnter("\nPresiona Enter para ver Library...")
|
|
153
156
|
|
|
154
|
-
console.log("\
|
|
157
|
+
console.log("\nclass Library {")
|
|
158
|
+
console.log(" constructor() {")
|
|
159
|
+
console.log(" this.books = []")
|
|
160
|
+
console.log(" this.users = []")
|
|
161
|
+
console.log(" this.loans = []")
|
|
162
|
+
console.log(" }")
|
|
155
163
|
console.log("")
|
|
156
|
-
console.log("
|
|
157
|
-
console.log("
|
|
158
|
-
console.log("
|
|
159
|
-
console.log(" markAsLoaned() → void")
|
|
160
|
-
console.log("}")
|
|
164
|
+
console.log(" lendBook(user, book) {")
|
|
165
|
+
console.log(" if (!user.canBorrow()) return null")
|
|
166
|
+
console.log(" if (!book.isAvailable()) return null")
|
|
161
167
|
console.log("")
|
|
162
|
-
console.log("
|
|
163
|
-
console.log("
|
|
164
|
-
console.log("
|
|
165
|
-
console.log("
|
|
166
|
-
console.log("
|
|
168
|
+
console.log(" const loan = new Loan(user, book)")
|
|
169
|
+
console.log(" book.markAsLoaned()")
|
|
170
|
+
console.log(" user.addLoan(loan)")
|
|
171
|
+
console.log(" this.loans.push(loan)")
|
|
172
|
+
console.log(" return loan")
|
|
173
|
+
console.log(" }")
|
|
167
174
|
console.log("")
|
|
168
|
-
console.log("
|
|
169
|
-
console.log("
|
|
170
|
-
console.log("
|
|
171
|
-
console.log("
|
|
172
|
-
console.log("}")
|
|
175
|
+
console.log(" returnBook(loan) {")
|
|
176
|
+
console.log(" loan.returnBook()")
|
|
177
|
+
console.log(" return loan.calculateFine()")
|
|
178
|
+
console.log(" }")
|
|
173
179
|
console.log("")
|
|
174
|
-
console.log("
|
|
175
|
-
console.log("
|
|
176
|
-
console.log("
|
|
177
|
-
console.log(" returnBook(loan) → boolean")
|
|
180
|
+
console.log(" getOverdueLoans() {")
|
|
181
|
+
console.log(" return this.loans.filter(loan => loan.isOverdue())")
|
|
182
|
+
console.log(" }")
|
|
178
183
|
console.log("}")
|
|
179
184
|
|
|
180
|
-
await this.waitForEnter("\nPresiona Enter para ver
|
|
185
|
+
await this.waitForEnter("\nPresiona Enter para ver la interacción...")
|
|
181
186
|
|
|
182
187
|
console.clear()
|
|
183
|
-
console.log("
|
|
184
|
-
console.log("
|
|
185
|
-
console.log("
|
|
186
|
-
console.log("
|
|
187
|
-
console.log("
|
|
188
|
-
console.log("
|
|
189
|
-
console.log("
|
|
190
|
-
console.log("
|
|
191
|
-
|
|
192
|
-
console.log("
|
|
193
|
-
console.log("
|
|
194
|
-
console.log("
|
|
195
|
-
console.log("
|
|
196
|
-
console.log("
|
|
197
|
-
|
|
198
|
-
console.log("
|
|
199
|
-
console.log("
|
|
200
|
-
console.log("
|
|
201
|
-
console.log("
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
await this.waitForEnter("\nPresiona Enter para continuar con la conclusión...")
|
|
188
|
+
console.log("Ejemplo de uso:")
|
|
189
|
+
console.log("")
|
|
190
|
+
console.log("const library = new Library()")
|
|
191
|
+
console.log("const book = new Book('1984', 'George Orwell', '978-0451524935')")
|
|
192
|
+
console.log("const user = new User('Ana García', 'ana@email.com')")
|
|
193
|
+
console.log("")
|
|
194
|
+
console.log("// Los objetos interactúan entre sí")
|
|
195
|
+
console.log("const loan = library.lendBook(user, book)")
|
|
196
|
+
console.log("console.log(book.isAvailable()) // false")
|
|
197
|
+
console.log("console.log(user.canBorrow()) // true (2 préstamos disponibles)")
|
|
198
|
+
console.log("")
|
|
199
|
+
console.log("// Simular libro vencido")
|
|
200
|
+
console.log("loan.dueDate = new Date(Date.now() - 24 * 60 * 60 * 1000)")
|
|
201
|
+
console.log("console.log(loan.isOverdue()) // true")
|
|
202
|
+
console.log("console.log(loan.calculateFine()) // 5")
|
|
203
|
+
console.log("")
|
|
204
|
+
console.log("// Devolver libro")
|
|
205
|
+
console.log("const fine = library.returnBook(loan)")
|
|
206
|
+
console.log("console.log(book.isAvailable()) // true")
|
|
207
|
+
|
|
208
|
+
await this.waitForEnter("\nPresiona Enter para la conclusión...")
|
|
206
209
|
}
|
|
207
210
|
|
|
208
211
|
async conclusion() {
|
|
209
212
|
console.clear()
|
|
210
|
-
console.log("
|
|
213
|
+
console.log("CONCLUSIÓN")
|
|
211
214
|
console.log("=" .repeat(50))
|
|
212
|
-
console.log("
|
|
213
|
-
console.log("
|
|
214
|
-
console.log("2.
|
|
215
|
-
|
|
216
|
-
console.log("
|
|
217
|
-
console.log("
|
|
218
|
-
|
|
219
|
-
console.log("
|
|
220
|
-
console.log("•
|
|
221
|
-
|
|
222
|
-
console.log("
|
|
223
|
-
console.log("
|
|
224
|
-
|
|
225
|
-
console.log("\
|
|
226
|
-
console.log("• Lección 2: Cómo estos objetos
|
|
227
|
-
console.log("• Lección 3:
|
|
228
|
-
console.log("• Lección 4-6: Cómo definir esas interacciones
|
|
229
|
-
|
|
230
|
-
|
|
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...")
|
|
215
|
+
console.log("Vimos cómo un sistema puede entenderse desde dos perspectivas:")
|
|
216
|
+
console.log("1. Como totalidad deductiva de discurso (reglas lógicas)")
|
|
217
|
+
console.log("2. Como conjunto de cosas que colaboran hacia un propósito")
|
|
218
|
+
|
|
219
|
+
console.log("\nLa biblioteca digital se descompuso en objetos que:")
|
|
220
|
+
console.log("• Book - maneja su propio estado de disponibilidad")
|
|
221
|
+
console.log("• User - controla sus límites de préstamo")
|
|
222
|
+
console.log("• Loan - calcula multas y fechas de vencimiento")
|
|
223
|
+
console.log("• Library - coordina las interacciones entre todos")
|
|
224
|
+
|
|
225
|
+
console.log("\nCada objeto encapsula parte de las reglas del sistema")
|
|
226
|
+
console.log("y colabora con otros para cumplir el propósito general.")
|
|
227
|
+
|
|
228
|
+
console.log("\nConexión con lecciones siguientes:")
|
|
229
|
+
console.log("• Lección 2: Cómo estos objetos interactúan")
|
|
230
|
+
console.log("• Lección 3: El mecanismo de las solicitudes")
|
|
231
|
+
console.log("• Lección 4-6: Cómo definir esas interacciones")
|
|
232
|
+
|
|
233
|
+
await this.waitForEnter("\nLección 1 completada. Presiona Enter para salir...")
|
|
242
234
|
}
|
|
243
235
|
|
|
244
236
|
async waitForEnter(message) {
|