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+
1142/*
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- *
8143 * DIFICULTAD EXTRA (opcional):
9144 * 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
11146 * y el procesamiento de préstamos de libros.
147+
12148 * 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
14150 * 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
18154 * tomar prestados y devolver libros.
155+
19156 * Instrucciones:
20157 * 1. Diseña una clase que no cumple el SRP: Crea una clase Library que maneje
21158 * los tres aspectos mencionados anteriormente (registro de libros, registro de
22- * usuarios y procesamiento de préstamos).
159+ * Users y procesamiento de préstamos).
23160 * 2. Refactoriza el código: Separa las responsabilidades en diferentes clases
24161 * siguiendo el Principio de Responsabilidad Única.
25- */
162+ */
0 commit comments