@@ -11,12 +11,12 @@ CUANDO NO SE SIGUE EL PRINCIPIO DE RESPONSABILIDAD ÚNICA:
1111En 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):
4040Esto 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
5454class 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
169159class 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
181167class 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