1
+ //EJERCICIO
2
+ //Código sin seguir el principio de Responsabilidad Única
3
+ class CarNoSRP {
4
+ constructor ( model , year , price ) {
5
+ this . model = model ;
6
+ this . year = year ;
7
+ this . price = price ;
8
+
9
+ this . stock = 2 ;
10
+ this . status = this . setStatus ( ) ;
11
+ }
12
+
13
+ //Esta sería la simulación de una lógica que le muestre información al cliente y le permita adquirir un carro
14
+ describe ( ) {
15
+ console . log ( `${ this . model } (${ this . year } ): $${ this . price . toLocaleString ( ) } ` ) ;
16
+ }
17
+
18
+ getStatus ( ) {
19
+ console . log ( `El modelo ${ this . model } está ${ this . status } ` ) ;
20
+ }
21
+
22
+ buyCar ( payment ) {
23
+ if ( this . status === 'disponible' ) {
24
+ if ( this . validatePayment ( payment ) ) {
25
+ console . log ( `Felicidades! Ha adquirido un ${ this . model } totalmente nuevo!` ) ;
26
+ this . stock -- ;
27
+ this . setStatus ( ) ;
28
+ } else {
29
+ console . log ( 'Debe abonar el monto total del modelo para comprarlo' ) ;
30
+ }
31
+ } else {
32
+ console . log ( 'Modelo no disponible' ) ;
33
+ }
34
+ }
35
+
36
+ /*
37
+ Esta sería la simulación de una lógica que procese los pagos, gestione inventarios
38
+ o realice cualquier otra función que no interesa o no conviene que sepa el cliente
39
+ */
40
+ validatePayment ( payment ) {
41
+ return payment >= this . price ;
42
+ }
43
+
44
+ setStatus ( ) {
45
+ if ( this . stock > 0 ) {
46
+ this . status = 'disponible' ;
47
+ } else {
48
+ this . status = 'agotado' ;
49
+ }
50
+
51
+ return this . status ;
52
+ }
53
+
54
+ getStock ( ) {
55
+ console . log ( `Inventario actual del modelo ${ this . model } : ${ this . stock } ` ) ;
56
+ }
57
+ }
58
+
59
+ /*
60
+ Esto está mal por varias razones:
61
+
62
+ - Se complica la tarea de implementar procesos en otras clases si los necesitan.
63
+ - De la misma manera la clase vendrá con procesos que no necesita en todos los casos que será implementada.
64
+ - Complica el mantenimiento, al juntar demasiados procesos.
65
+ - Hace más difícil definir los test unitarios.
66
+ - El código es algo más ilegible, pues no queda claro para qué es la clase.
67
+
68
+ En general, el principio de responsabilidad única busca simplificar y facilitar el desarrollo,
69
+ lo cual es todavía más útil si se trabaja con código que luego será leído y editado por otras personas.
70
+ */
71
+
72
+ let car1 = new CarNoSRP ( 'Chevrolet Tracker' , 2022 , 20190 ) ;
73
+ car1 . describe ( ) ;
74
+ car1 . getStatus ( ) ;
75
+ car1 . buyCar ( 20000 ) ;
76
+ car1 . buyCar ( 20200 ) ;
77
+ car1 . getStock ( ) ;
78
+ car1 . buyCar ( 20190 ) ;
79
+ car1 . getStock ( ) ;
80
+ car1 . buyCar ( 30000 ) ;
81
+ car1 . buyCar ( 30000 ) ;
82
+ car1 . getStock ( ) ;
83
+
84
+ //Código siguiendo el principio de Responsabilidad Única
85
+ //Lógica de negocio
86
+ console . clear ( ) ;
87
+
88
+ const Inventory = {
89
+ list : [ ] ,
90
+
91
+ search : function ( itemName ) {
92
+ let result = undefined ;
93
+
94
+ this . list . forEach ( ( element ) => {
95
+ if ( element [ itemName ] ) {
96
+ result = element ;
97
+ }
98
+ } ) ;
99
+
100
+ return result ;
101
+ } ,
102
+
103
+ displayInventory : function ( ) {
104
+ console . log ( '\nINVENTARIO' ) ;
105
+ this . list . forEach ( ( element ) => {
106
+ console . log ( element ) ;
107
+ } ) ;
108
+ } ,
109
+ } ;
110
+
111
+ class Item {
112
+ constructor ( itemName , quantity = 0 ) {
113
+ this [ itemName ] = quantity ;
114
+ Inventory . list . push ( this ) ;
115
+ }
116
+
117
+ addQuantity ( itemName , addNum ) {
118
+ return ( this [ itemName ] = + addNum ) ;
119
+ }
120
+
121
+ substractQuantity ( iteName , substractNum ) {
122
+ return ( this [ iteName ] = - substractNum ) ;
123
+ }
124
+ }
125
+
126
+ class Car {
127
+ constructor ( model , year , price ) {
128
+ this . model = model ;
129
+ this . year = year ;
130
+ this . fullName = `${ model } ${ year } ` ;
131
+ this . price = price ;
132
+ this . stock = new Item ( this . fullName , 5 ) ;
133
+ }
134
+ }
135
+
136
+ new Car ( 'Ram Pickup' , 2021 , 40150 ) ;
137
+ new Car ( 'Chevrolet Silverado' , 2022 , 43990 ) ;
138
+
139
+ console . log ( Inventory . search ( 'Ram Pickup 2021' ) ) ;
140
+ //Lógica de cliente
141
+
1
142
/*
2
- * 26
3
- * EJERCICIO:
4
- * Explora el "Principio SOLID de Responsabilidad Única (Single Responsibility
5
- * Principle, SRP)" y crea un ejemplo simple donde se muestre su funcionamiento
6
- * de forma correcta e incorrecta.
7
- *
8
143
* DIFICULTAD EXTRA (opcional):
9
144
* Desarrolla un sistema de gestión para una biblioteca. El sistema necesita
10
- * manejar diferentes aspectos como el registro de libros, la gestión de usuarios
145
+ * manejar diferentes aspectos como el registro de libros, la gestión de Users
11
146
* y el procesamiento de préstamos de libros.
147
+
12
148
* Requisitos:
13
- * 1. Registrar libros: El sistema debe permitir agregar nuevos libros con
149
+ * 1. Registrar libros: El sistema debe permitir agregar nuevos libros con
14
150
* información básica como título, autor y número de copias disponibles.
15
- * 2. Registrar usuarios : El sistema debe permitir agregar nuevos usuarios con
16
- * información básica como nombre , número de identificación y correo electrónico.
17
- * 3. Procesar préstamos de libros: El sistema debe permitir a los usuarios
151
+ * 2. Registrar Users : El sistema debe permitir agregar nuevos Users con
152
+ * información básica como name , número de identificación y correo electrónico.
153
+ * 3. Procesar préstamos de libros: El sistema debe permitir a los Users
18
154
* tomar prestados y devolver libros.
155
+
19
156
* Instrucciones:
20
157
* 1. Diseña una clase que no cumple el SRP: Crea una clase Library que maneje
21
158
* los tres aspectos mencionados anteriormente (registro de libros, registro de
22
- * usuarios y procesamiento de préstamos).
159
+ * Users y procesamiento de préstamos).
23
160
* 2. Refactoriza el código: Separa las responsabilidades en diferentes clases
24
161
* siguiendo el Principio de Responsabilidad Única.
25
- */
162
+ */
0 commit comments