1
+ import java .util .ArrayList ;
2
+ import java .util .List ;
3
+ import java .util .Optional ;
4
+ import java .util .function .Consumer ;
5
+
6
+ public interface diegosilval {
7
+ static void main (String ... args ) {
8
+ System .out .println ("** Usando una clase para todo **" );
9
+ var libraryUtil = new LibraryUtil ();
10
+ libraryUtil .
addUser (
"01" ,
"Alex" ,
"[email protected] " );
11
+ libraryUtil .
addUser (
"02" ,
"Bob" ,
"[email protected] " );
12
+ libraryUtil .
addUser (
"03" ,
"Cark" ,
"[email protected] " );
13
+
14
+ libraryUtil .addBook ("To Kill a Mockingbird" , "Harper Lee" , 2 );
15
+ libraryUtil .addBook ("1984" , "George Orwell" , 1 );
16
+ libraryUtil .addBook ("Pride and Prejudice" , "Jane Austen" , 0 );
17
+
18
+ libraryUtil .bookBorrow ("1984" , "01" ).ifPresentOrElse (showBorrowSuccess , showBorrowFail );
19
+ libraryUtil .bookBorrow ("To Kill a Mockingbird" , "02" ).ifPresentOrElse (showBorrowSuccess , showBorrowFail );
20
+ libraryUtil .bookBorrow ("1984" , "03" ).ifPresentOrElse (showBorrowSuccess , showBorrowFail );
21
+
22
+ // Usando SRP
23
+ System .out .println ("** Usando una clase por cada responsabilidad" );
24
+ var usersRepository = new UsersRepository ();
25
+ var booksRepository = new BooksRepository ();
26
+ var srpLibraryUtil = new SrpLibraryUtil (usersRepository , booksRepository ); // inyectando
27
+ usersRepository .
addUser (
"01" ,
"Alex" ,
"[email protected] " );
28
+ usersRepository .
addUser (
"02" ,
"Bob" ,
"[email protected] " );
29
+ usersRepository .
addUser (
"03" ,
"Cark" ,
"[email protected] " );
30
+
31
+ booksRepository .addBook ("To Kill a Mockingbird" , "Harper Lee" , 2 );
32
+ booksRepository .addBook ("1984" , "George Orwell" , 1 );
33
+ booksRepository .addBook ("Pride and Prejudice" , "Jane Austen" , 0 );
34
+
35
+ srpLibraryUtil .bookBorrow ("1984" , "01" ).ifPresentOrElse (showBorrowSuccess , showBorrowFail );
36
+ srpLibraryUtil .bookBorrow ("To Kill a Mockingbird" , "02" ).ifPresentOrElse (showBorrowSuccess , showBorrowFail );
37
+ srpLibraryUtil .bookBorrow ("1984" , "03" ).ifPresentOrElse (showBorrowSuccess , showBorrowFail );
38
+
39
+ }
40
+
41
+ static Consumer <BookLoan > showBorrowSuccess = (bookLoan ) -> {
42
+ System .out .println (String .format ("Se prestó correctamente %s a %s" , bookLoan .getBook ().getTitle (),
43
+ bookLoan .getUser ().getName ()));
44
+ };
45
+ static Runnable showBorrowFail = () -> System .err .println (
46
+ "El usuario no existe, el nombre del libro no existe, o no existen libros disponibles para prestar" );
47
+
48
+ }
49
+
50
+ /**
51
+ * Book Class
52
+ */
53
+ class Book {
54
+ private String title ;
55
+ private String author ;
56
+ private int available ;
57
+
58
+ public Book () {
59
+ }
60
+
61
+ public Book (String title , String author , int available ) {
62
+ this .title = title ;
63
+ this .author = author ;
64
+ this .available = available ;
65
+ }
66
+
67
+ public String getTitle () {
68
+ return title ;
69
+ }
70
+
71
+ public void setTitle (String title ) {
72
+ this .title = title ;
73
+ }
74
+
75
+ public String getAuthor () {
76
+ return author ;
77
+ }
78
+
79
+ public void setAuthor (String author ) {
80
+ this .author = author ;
81
+ }
82
+
83
+ public int getAvailable () {
84
+ return available ;
85
+ }
86
+
87
+ public void setAvailable (int available ) {
88
+ this .available = available ;
89
+ }
90
+
91
+ public void addAvailable (int delta ) {
92
+ this .available += delta ;
93
+ }
94
+
95
+ public void removeAvailable (int delta ) {
96
+ this .available -= delta ;
97
+ }
98
+
99
+ }
100
+
101
+ /**
102
+ * User Class
103
+ */
104
+ class User {
105
+ private String name ;
106
+ private String id ;
107
+ private String email ;
108
+
109
+ public User () {
110
+ }
111
+
112
+ public User (String name , String id , String email ) {
113
+ this .name = name ;
114
+ this .id = id ;
115
+ this .email = email ;
116
+ }
117
+
118
+ public String getName () {
119
+ return name ;
120
+ }
121
+
122
+ public void setName (String name ) {
123
+ this .name = name ;
124
+ }
125
+
126
+ public String getId () {
127
+ return id ;
128
+ }
129
+
130
+ public void setId (String id ) {
131
+ this .id = id ;
132
+ }
133
+
134
+ public String getEmail () {
135
+ return email ;
136
+ }
137
+
138
+ public void setEmail (String email ) {
139
+ this .email = email ;
140
+ }
141
+
142
+ }
143
+
144
+ class BookLoan {
145
+ private final Book book ;
146
+ private final User user ;
147
+
148
+ public BookLoan (Book book , User user ) {
149
+ this .book = book ;
150
+ this .user = user ;
151
+ }
152
+
153
+ public Book getBook () {
154
+ return book ;
155
+ }
156
+
157
+ public User getUser () {
158
+ return user ;
159
+ }
160
+
161
+ }
162
+
163
+ class LibraryUtil {
164
+ private List <Book > books = new ArrayList <>();
165
+ private List <User > users = new ArrayList <>();
166
+ private List <BookLoan > bookLoans = new ArrayList <>();
167
+
168
+ public void addBook (String title , String author , int available ) {
169
+ books .add (new Book (title , author , available ));
170
+ }
171
+
172
+ public void addUser (String id , String name , String email ) {
173
+ users .add (new User (name , id , email ));
174
+ }
175
+
176
+ public Optional <BookLoan > bookBorrow (String title , String userId ) {
177
+ var user = users .stream ().filter (aUser -> aUser .getId ().equals (userId )).findFirst ();
178
+ if (user .isEmpty ())
179
+ return Optional .empty ();
180
+ var book = books .stream ().filter (aBook -> aBook .getTitle ().equalsIgnoreCase (title )).findFirst ();
181
+ if (book .isEmpty () || book .get ().getAvailable () == 0 )
182
+ return Optional .empty ();
183
+ book .get ().removeAvailable (1 );
184
+ var bookLoan = new BookLoan (book .get (), user .get ());
185
+ bookLoans .add (bookLoan );
186
+ return Optional .of (bookLoan );
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Clase LibraryUtil aplicando SRP
192
+ */
193
+ class SrpLibraryUtil {
194
+ private final UsersRepository usersRepository ;
195
+ private final BooksRepository booksRepository ;
196
+ private List <BookLoan > bookLoans = new ArrayList <>();
197
+
198
+ public SrpLibraryUtil (UsersRepository usersRepository , BooksRepository booksRepository ) {
199
+ this .usersRepository = usersRepository ;
200
+ this .booksRepository = booksRepository ;
201
+ }
202
+
203
+ public Optional <BookLoan > bookBorrow (String title , String userId ) {
204
+ var user = usersRepository .findById (userId );
205
+ var book = booksRepository .findByTitle (title );
206
+ if (user .isEmpty () || book .isEmpty ())
207
+ return Optional .empty ();
208
+ book .get ().removeAvailable (1 );
209
+ var bookLoan = new BookLoan (book .get (), user .get ());
210
+ bookLoans .add (bookLoan );
211
+ return Optional .of (bookLoan );
212
+ }
213
+
214
+ }
215
+
216
+ /**
217
+ * Repositorio de usuarios
218
+ */
219
+ class UsersRepository {
220
+ private List <User > users = new ArrayList <>();
221
+
222
+ public void addUser (String id , String name , String email ) {
223
+ users .add (new User (name , id , email ));
224
+ }
225
+
226
+ public Optional <User > findById (String userId ) {
227
+ return users .stream ().filter (aUser -> aUser .getId ().equals (userId )).findFirst ();
228
+ }
229
+ }
230
+
231
+ class BooksRepository {
232
+ private List <Book > books = new ArrayList <>();
233
+
234
+ public void addBook (String title , String author , int available ) {
235
+ books .add (new Book (title , author , available ));
236
+ }
237
+
238
+ public Optional <Book > findByTitle (String title ) {
239
+ return books .stream ().filter (aBook -> aBook .getTitle ().equalsIgnoreCase (title ) && aBook .getAvailable () > 0 )
240
+ .findFirst ();
241
+ }
242
+ }
0 commit comments