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" , "alex@mail.com" );
11+ libraryUtil .addUser ("02" , "Bob" , "bob@mnail.com" );
12+ libraryUtil .addUser ("03" , "Cark" , "carl@mnail.com" );
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" , "alex@mail.com" );
28+ usersRepository .addUser ("02" , "Bob" , "bob@mnail.com" );
29+ usersRepository .addUser ("03" , "Cark" , "carl@mnail.com" );
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