Skip to content

Commit 17856ae

Browse files
committed
#26 - JavaScript
1 parent 02fd2f1 commit 17856ae

File tree

1 file changed

+120
-138
lines changed

1 file changed

+120
-138
lines changed

Roadmap/26 - SOLID SRP/javascript/RicJDev.js

Lines changed: 120 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ CUANDO NO SE SIGUE EL PRINCIPIO DE RESPONSABILIDAD ÚNICA:
1111
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.
1212
*/
1313

14-
class UsersNoSRP {
15-
constructor(username, password, email, userID) {
14+
class Users {
15+
constructor(username, password, email, id) {
1616
this.username = username;
1717
this.password = password;
1818
this.email = email;
19-
this.userID = userID;
19+
this.id = id;
2020
}
2121

2222
registerUser() {
@@ -40,15 +40,15 @@ PRINCIPIO DE RESPONSABILIDAD ÚNICA (SRP):
4040
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.
4141
*/
4242

43-
class UserRegister {
44-
constructor(username, password, email, userID) {
43+
class User {
44+
constructor(username, password, email, id) {
4545
this.username = username;
4646
this.password = password;
4747
this.email = email;
48-
this.userID = userID;
48+
this.id = id;
4949
}
5050

51-
//Crear y registrar al usuario
51+
//Crear al usuario
5252
}
5353

5454
class UserValidation {
@@ -59,217 +59,199 @@ class UserValidation {
5959
//Validar contraseñas o permisos del usuario
6060
}
6161

62-
class EmailSender {
62+
class EmailService {
6363
constructor(emailAddress, emailObject, emailContent) {
6464
this.emailAddress = emailAddress;
6565
this.emailObject = emailObject;
6666
this.emailContent = emailContent;
6767
}
6868

69-
//Lógica para enviar un correo
69+
//Enviar un correo
7070
}
7171

7272
//EXTRA
73-
class Library {
74-
userDataBase = [];
75-
bookDataBase = [];
76-
pendingLenders = [];
73+
class LibraryNoSRP {
74+
#users = [];
75+
#books = [];
76+
#loans = [];
7777

78-
//1. Registrar libros
79-
registerNewBook(title, author, avalaibleCopies) {
78+
registerBook(title, author, avalaibleCopies) {
8079
let newBook = {
81-
bookID: this.bookDataBase.length + 1,
80+
id: this.#books.length + 1,
8281
title: title,
8382
author: author,
8483
avalaibleCopies: avalaibleCopies,
8584
};
8685

87-
this.bookDataBase.push(newBook);
86+
this.#books.push(newBook);
8887
}
8988

90-
//2. Registrar users
91-
registerNewUser(name, emailAddress) {
89+
registerUser(name, emailAddress) {
9290
let newUser = {
93-
userID: this.userDataBase.length + 1,
91+
id: this.#users.length + 1,
9492
name: name,
9593
emailAddress: emailAddress,
9694
};
9795

98-
this.userDataBase.push(newUser);
96+
this.#users.push(newUser);
9997
}
10098

101-
//3. Sistema de gestión de préstamos
102-
search(arr, item) {
103-
let result;
104-
105-
arr.forEach((arrObject) => {
106-
Object.keys(arrObject).forEach((element) => {
107-
if (arrObject[element] === item) {
108-
result = arrObject;
109-
}
110-
});
111-
});
112-
113-
return result;
99+
#searchByID(arr, item) {
100+
return arr.find((obj) => obj.id === item);
114101
}
115102

116-
lendBook(userID, bookID) {
117-
let pendingLender = this.search(this.userDataBase, userID);
118-
let bookToLend = this.search(this.bookDataBase, bookID);
103+
loanBook(userID, bookID) {
104+
let user = this.#searchByID(this.#users, userID);
105+
let book = this.#searchByID(this.#books, bookID);
119106

120-
if (pendingLender) {
121-
if (bookToLend) {
122-
if (bookToLend.avalaibleCopies > 0) {
123-
console.log(
124-
`Se le ha prestado el libro \"${bookToLend.title}\", de ${bookToLend.author}, a ${pendingLender.name}`
125-
);
107+
let loan = {
108+
id: this.#loans.length + 1,
109+
userID: user.id,
110+
bookID: book.id,
111+
};
112+
113+
if (user && book) {
114+
if (book.avalaibleCopies > 0) {
115+
console.log(`Se ha prestado el libro \"${book.title}\" a ${user.name}`);
126116

127-
bookToLend.avalaibleCopies--;
117+
book.avalaibleCopies--;
128118

129-
this.pendingLenders.push(pendingLender);
130-
} else {
131-
console.log('No hay copias disponibles');
132-
}
119+
this.#loans.push(loan);
133120
} else {
134-
console.log('No existe el libro solictado');
121+
console.log('No hay copias disponibles');
135122
}
136123
} else {
137-
console.log('No existe el usuario');
124+
console.log('No existe el usuario o el libro solicitado');
138125
}
139126
}
140127

141-
receiveBook(userID, bookID) {
142-
let pendingLender = this.search(this.pendingLenders, userID);
143-
let bookReceived = this.search(this.bookDataBase, bookID);
128+
returnBook(userID, bookID) {
129+
let loan = this.#loans.find((obj) => {
130+
return obj.userID === userID && obj.bookID === bookID;
131+
});
144132

145-
if (pendingLender) {
146-
console.log(`${pendingLender.name} ha regresado el libro \"${bookReceived.title}\"`);
133+
if (loan) {
134+
let user = this.#searchByID(this.#users, loan.userID);
135+
let book = this.#searchByID(this.#books, loan.bookID);
147136

148-
bookReceived.avalaibleCopies++;
137+
console.log(`${user.name} ha regresado el libro \"${book.title}\"`);
138+
139+
book.avalaibleCopies++;
149140

150-
this.pendingLenders.splice(this.pendingLenders.indexOf(pendingLender), 1);
141+
this.#loans.splice(this.#loans.indexOf(loan), 1);
151142
} else {
152143
console.log('Ese préstamo no está en el registro');
153144
}
154145
}
155146
}
156147

157-
let myLibrary = new Library();
148+
let libraryNoSRP = new LibraryNoSRP();
158149

159-
myLibrary.registerNewBook('Dracula', 'Bram Stoker', 3);
160-
myLibrary.lendBook(1, 1);
161-
myLibrary.registerNewUser('Juan', 'juanloquillo16@gmail.com');
162-
myLibrary.lendBook(1, 2);
163-
myLibrary.lendBook(1, 1);
164-
myLibrary.receiveBook(1, 1);
165-
myLibrary.receiveBook(1, 1);
150+
libraryNoSRP.registerBook('Dracula', 'Bram Stoker', 3);
151+
libraryNoSRP.registerUser('Juan', 'juanloquillo16@gmail.com');
152+
153+
libraryNoSRP.loanBook(1, 1);
154+
155+
libraryNoSRP.returnBook(1, 1);
156+
libraryNoSRP.returnBook(1, 1);
166157

167158
//REFACTORIZANDO
168-
//1. Registrar libros
169159
class Book {
170-
constructor(title, author, avalaibleCopies, dataBase = myLibraryDataBase) {
171-
this.bookID = dataBase.books.length + 1;
160+
constructor(title, author, avalaibleCopies) {
172161
this.title = title;
173162
this.author = author;
174163
this.avalaibleCopies = avalaibleCopies;
175-
176-
dataBase.books.push(this);
177164
}
178165
}
179166

180-
//2. Registrar users
181167
class LibraryUser {
182-
constructor(name, emailAddress, dataBase = myLibraryDataBase) {
183-
this.userID = dataBase.users.length + 1;
168+
constructor(name, emailAddress) {
184169
this.name = name;
185170
this.emailAddress = emailAddress;
186-
187-
dataBase.users.push(this);
188171
}
189172
}
190173

191-
//3. Sistema de gestión de préstamos
192-
class PendingLender {
193-
constructor(user, bookID, dataBase = myLibraryDataBase) {
194-
this.userID = user.userID;
195-
this.name = user.name;
196-
this.emailAddress = user.emailAddress;
197-
this.bookID = bookID;
174+
class LoansService {
175+
loans = [];
176+
177+
loanBook(user, book) {
178+
let loan = {
179+
userID: user.id,
180+
bookID: book.id,
181+
};
182+
183+
if (book.avalaibleCopies > 0) {
184+
loan.id = this.loans.length + 1;
185+
this.loans.push(loan);
186+
book.avalaibleCopies--;
187+
188+
console.log(`Se le ha prestado el libro \"${book.title}\" a ${user.name}`);
189+
}
198190
}
199-
}
200191

201-
function search(arr, item) {
202-
let result;
192+
returnBook(user, book) {
193+
let result;
203194

204-
arr.forEach((arrObject) => {
205-
Object.keys(arrObject).forEach((element) => {
206-
if (arrObject[element] === item) {
207-
result = arrObject;
195+
this.loans.forEach((loan) => {
196+
if (loan.userID === user.id && loan.bookID === book.id) {
197+
result = loan;
208198
}
209199
});
210-
});
211200

212-
return result;
201+
if (result) {
202+
this.loans.splice(this.loans.indexOf(result, 1));
203+
book.avalaibleCopies++;
204+
console.log(`${user.name} ha regresado el libro \"${book.title}\"`);
205+
} else {
206+
console.log('Préstamo no registrado');
207+
}
208+
}
213209
}
214210

215-
class LibraryDataBase {
216-
books = [];
217-
users = [];
218-
pendingLenders = [];
219-
}
211+
class Library {
212+
#users = [];
213+
#books = [];
214+
#loans = new LoansService();
220215

221-
class LendingManager {
222-
constructor(dataBase = myLibraryDataBase) {
223-
this.dataBase = dataBase;
216+
addUser(user) {
217+
user.id = this.#users.length + 1;
218+
this.#users.push(user);
224219
}
225220

226-
lendBook(userID, bookID) {
227-
let pendingLender = search(this.dataBase.users, userID);
228-
let bookToLend = search(this.dataBase.books, bookID);
229-
230-
if (pendingLender) {
231-
if (bookToLend) {
232-
if (bookToLend.avalaibleCopies > 0) {
233-
console.log(
234-
`Se le ha prestado el libro \"${bookToLend.title}\", de ${bookToLend.author}, a ${pendingLender.name}`
235-
);
236-
bookToLend.avalaibleCopies--;
237-
238-
this.dataBase.pendingLenders.push(new PendingLender(pendingLender, bookToLend.bookID));
239-
} else {
240-
console.log('No hay copias disponibles');
241-
}
242-
} else {
243-
console.log('No existe el libro solictado');
244-
}
245-
} else {
246-
console.log('No existe el usuario');
247-
}
221+
addBook(book) {
222+
book.id = this.#books.length + 1;
223+
this.#books.push(book);
248224
}
249225

250-
receiveBook(userID, bookID) {
251-
let pendingLender = search(this.dataBase.pendingLenders, userID);
252-
let book = search(this.dataBase.books, bookID);
226+
#searchByID(database, itemID) {
227+
return database.find((obj) => obj.id === itemID);
228+
}
253229

254-
if (pendingLender) {
255-
console.log(`${pendingLender.name} ha regresado el libro \"${book.title}\"`);
230+
loanBook(userID, bookID) {
231+
let user = this.#searchByID(this.#users, userID);
232+
let book = this.#searchByID(this.#books, bookID);
256233

257-
book.avalaibleCopies++;
258-
this.dataBase.pendingLenders.splice(this.dataBase.pendingLenders.indexOf(pendingLender), 1);
234+
if (user && book) {
235+
this.#loans.loanBook(user, book);
259236
} else {
260-
console.log('Ese préstamo no está en el registro');
237+
console.log('No existe el libro o el usuario solicitados');
261238
}
262239
}
240+
241+
returnBook(userID, bookID) {
242+
let user = this.#searchByID(this.#users, userID);
243+
let book = this.#searchByID(this.#books, bookID);
244+
245+
this.#loans.returnBook(user, book);
246+
}
263247
}
264248

265-
const myLibraryDataBase = new LibraryDataBase();
266-
const myLendingManager = new LendingManager();
249+
const library = new Library();
250+
251+
library.addUser(new LibraryUser('Lissa', 'lissalunita2003@gmail.com'));
252+
library.addBook(new Book('La Milla Verde', 'Stephen King', 4));
267253

268-
new Book('Christine', 'Stephen King', 5);
269-
new Book("El Misterio de Salem's Lot", 'Stephen King', 3);
270-
new LibraryUser('Ana', 'anitalahuerfanita2233@gmail.com');
271-
new LibraryUser('Julia', 'soyjuliaparasiempre@gmail.com');
254+
library.loanBook(1, 1);
272255

273-
myLendingManager.lendBook('Ana', 1);
274-
myLendingManager.receiveBook('Ana', 1);
275-
myLendingManager.lendBook('Julia', 'Libro inexistente');
256+
library.returnBook(1, 1);
257+
library.returnBook(1, 1);

0 commit comments

Comments
 (0)