Skip to content

Commit 38da3a1

Browse files
committed
#26 - JavaScript
1 parent 1434b67 commit 38da3a1

File tree

1 file changed

+117
-113
lines changed

1 file changed

+117
-113
lines changed
+117-113
Original file line numberDiff line numberDiff line change
@@ -1,146 +1,84 @@
11
//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-
}
2+
/*
3+
CUANDO NO SE SIGUE EL PRINCIPIO DE RESPONSABILIDAD ÚNICA:
124
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-
}
5+
- Se complica la tarea de implementar procesos en otras clases.
6+
- De la misma manera la clase vendrá con métodos que no necesitará en todos los casos que será implementada.
7+
- Complica el mantenimiento, al juntar demasiados procesos.
8+
- Hace más difícil definir los test unitarios.
9+
- El código es algo más ilegible, pues no queda claro para qué es la clase.
1710
18-
getStatus() {
19-
console.log(`El modelo ${this.model} está ${this.status}`);
20-
}
11+
En general, este principio busca simplificar y facilitar el desarrollo, sobre todo si se trabaja con código que luego será leído y editado por otras personas.
12+
*/
2113

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-
}
14+
class UsersNoSRP {
15+
constructor(username, password, email, userID) {
16+
this.username = username;
17+
this.password = password;
18+
this.email = email;
19+
this.userID = userID;
3420
}
3521

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;
22+
registerUser() {
23+
//Registrar el usuario
4224
}
4325

44-
setStatus() {
45-
if (this.stock > 0) {
46-
this.status = 'disponible';
47-
} else {
48-
this.status = 'agotado';
49-
}
50-
51-
return this.status;
26+
validateUser() {
27+
//Validar la contraseña del usuario
5228
}
5329

54-
getStock() {
55-
console.log(`Inventario actual del modelo ${this.model}: ${this.stock}`);
30+
sendEmail() {
31+
//Enviar un email al ususario
5632
}
5733
}
5834

5935
/*
60-
Esto está mal por varias razones:
36+
PRINCIPIO DE RESPONSABILIDAD ÚNICA (SRP):
6137
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.
38+
"Una clase debe hacer una cosa y, por lo tanto, debe tener una sola razón para cambiar"
6739
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.
40+
Esto quiere decir que cada clase tiene un objetivo y una sola razón de ser. El único motivo por el que se debería modificar una clase es que este objetivo o la manera en que debe cumplirse sean modificados también.
7041
*/
7142

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);
43+
class User {
44+
constructor(username, password, email, userID) {
45+
this.username = username;
46+
this.password = password;
47+
this.email = email;
48+
this.userID = userID;
11549
}
11650

117-
addQuantity(itemName, addNum) {
118-
return (this[itemName] = +addNum);
119-
}
51+
//Lógica que necesite la creación de un usuario
52+
}
12053

121-
substractQuantity(iteName, substractNum) {
122-
return (this[iteName] = -substractNum);
54+
class UserRegister {
55+
constructor(user) {
56+
this.user = user;
12357
}
58+
59+
//Registrar al usuario
12460
}
12561

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);
62+
class UserValidation {
63+
constructor(user) {
64+
this.user = user;
13365
}
66+
67+
//Validar contraseñas o permisos del usuario
13468
}
13569

136-
new Car('Ram Pickup', 2021, 40150);
137-
new Car('Chevrolet Silverado', 2022, 43990);
70+
class EmailSender {
71+
constructor(emailAddress, emailObject, emailContent) {
72+
this.emailAddress = emailAddress;
73+
this.emailObject = emailObject;
74+
this.emailContent = emailContent;
75+
}
13876

139-
console.log(Inventory.search('Ram Pickup 2021'));
140-
//Lógica de cliente
77+
//Lógica para crear y enviar un correo
78+
}
14179

14280
/*
143-
* DIFICULTAD EXTRA (opcional):
81+
* DIFICULTAD EXTRA (opcional):
14482
* Desarrolla un sistema de gestión para una biblioteca. El sistema necesita
14583
* manejar diferentes aspectos como el registro de libros, la gestión de Users
14684
* y el procesamiento de préstamos de libros.
@@ -160,3 +98,69 @@ console.log(Inventory.search('Ram Pickup 2021'));
16098
* 2. Refactoriza el código: Separa las responsabilidades en diferentes clases
16199
* siguiendo el Principio de Responsabilidad Única.
162100
*/
101+
102+
class Library {
103+
userDataBase = [];
104+
bookDataBase = [];
105+
106+
registerNewBook(bookID, title, author, avalaibleCopies) {
107+
let newBook = {
108+
bookID: bookID,
109+
title: title,
110+
author: author,
111+
avalaibleCopies: avalaibleCopies,
112+
};
113+
114+
this.bookDataBase.push(newBook);
115+
}
116+
117+
registerNewUser(name, userID, emailAddress) {
118+
let newUser = {
119+
name: name,
120+
userID: userID,
121+
emailAddress: emailAddress,
122+
};
123+
124+
this.userDataBase.push(newUser);
125+
}
126+
127+
search(elementID, searchType) {
128+
let result;
129+
130+
if (searchType === 'book') {
131+
this.bookDataBase.forEach((element) => {
132+
if (element.bookID === elementID) {
133+
result = element;
134+
}
135+
});
136+
} else if (searchType === 'user') {
137+
this.userDataBase.forEach((element) => {
138+
if (element.userID === elementID) {
139+
result = element;
140+
}
141+
});
142+
}
143+
144+
return result;
145+
}
146+
147+
lendBook(userID, bookID) {
148+
let bookToLend = this.search(bookID, 'book');
149+
let userLender = this.search(userID, 'user');
150+
151+
if (bookToLend.avalaibleCopies > 0) {
152+
console.log(
153+
`Se le ha prestado el libro \"${bookToLend.title}\" de ${bookToLend.author} a ${userLender.name}`
154+
);
155+
bookToLend.avalaibleCopies--;
156+
} else {
157+
console.log('No hay copias disponibles');
158+
}
159+
}
160+
}
161+
162+
let myLibrary = new Library();
163+
164+
myLibrary.registerNewBook(1, 'Dracula', 'Bram Stoker', 3);
165+
myLibrary.registerNewUser('Juan', 1, '[email protected]');
166+
myLibrary.lendBook(1, 1);

0 commit comments

Comments
 (0)