1+ /*
2+ * Principio de Responsabilidad Única (SRP)
3+ *
4+ * El Principio de Responsabilidad Única es el primer principio de SOLID y establece que una clase
5+ * debe tener una, y solo una, razón para cambiar. En otras palabras, una clase debe tener una
6+ * única responsabilidad bien definida.
7+ *
8+ * Este principio promueve la modularidad, facilita el mantenimiento y mejora la legibilidad del código.
9+ * Cuando una clase tiene múltiples responsabilidades, se vuelve más difícil de entender, modificar y probar.
10+ */
11+
12+ // Definiciones de datos comunes
13+ data class Book (val title : String , val author : String , var availableCopies : Int )
14+ data class User (val name : String , val id : String , val email : String )
15+ data class Loan (val user : User , val book : Book )
16+
17+ // Versión que no cumple con SRP
18+ class LibraryWithoutSRP {
19+ private val books = mutableListOf<Book >()
20+ private val users = mutableListOf<User >()
21+ private val loans = mutableListOf<Loan >()
22+
23+ fun addBook (title : String , author : String , copies : Int ) {
24+ books.add(Book (title, author, copies))
25+ }
26+
27+ fun registerUser (name : String , id : String , email : String ) {
28+ users.add(User (name, id, email))
29+ }
30+
31+ fun loanBook (userId : String , bookTitle : String ) {
32+ val user = users.find { it.id == userId }
33+ val book = books.find { it.title == bookTitle }
34+ if (user != null && book != null && book.availableCopies > 0 ) {
35+ loans.add(Loan (user, book))
36+ book.availableCopies--
37+ }
38+ }
39+
40+ fun returnBook (userId : String , bookTitle : String ) {
41+ val loan = loans.find { it.user.id == userId && it.book.title == bookTitle }
42+ if (loan != null ) {
43+ loans.remove(loan)
44+ loan.book.availableCopies++
45+ }
46+ }
47+ }
48+
49+ // Versión refactorizada que cumple con SRP
50+ class BookManager {
51+ private val books = mutableListOf<Book >()
52+
53+ fun addBook (title : String , author : String , copies : Int ) {
54+ books.add(Book (title, author, copies))
55+ }
56+
57+ fun findBook (title : String ): Book ? = books.find { it.title == title }
58+ }
59+
60+ class UserManager {
61+ private val users = mutableListOf<User >()
62+
63+ fun registerUser (name : String , id : String , email : String ) {
64+ users.add(User (name, id, email))
65+ }
66+
67+ fun findUser (id : String ): User ? = users.find { it.id == id }
68+ }
69+
70+ class LoanManager {
71+ private val loans = mutableListOf<Loan >()
72+
73+ fun loanBook (user : User , book : Book ) {
74+ if (book.availableCopies > 0 ) {
75+ loans.add(Loan (user, book))
76+ book.availableCopies--
77+ }
78+ }
79+
80+ fun returnBook (user : User , book : Book ) {
81+ val loan = loans.find { it.user == user && it.book == book }
82+ if (loan != null ) {
83+ loans.remove(loan)
84+ book.availableCopies++
85+ }
86+ }
87+ }
88+
89+ class Library (
90+ private val bookManager : BookManager ,
91+ private val userManager : UserManager ,
92+ private val loanManager : LoanManager
93+ ) {
94+ fun addBook (title : String , author : String , copies : Int ) {
95+ bookManager.addBook(title, author, copies)
96+ }
97+
98+ fun registerUser (name : String , id : String , email : String ) {
99+ userManager.registerUser(name, id, email)
100+ }
101+
102+ fun loanBook (userId : String , bookTitle : String ) {
103+ val user = userManager.findUser(userId)
104+ val book = bookManager.findBook(bookTitle)
105+ if (user != null && book != null ) {
106+ loanManager.loanBook(user, book)
107+ }
108+ }
109+
110+ fun returnBook (userId : String , bookTitle : String ) {
111+ val user = userManager.findUser(userId)
112+ val book = bookManager.findBook(bookTitle)
113+ if (user != null && book != null ) {
114+ loanManager.returnBook(user, book)
115+ }
116+ }
117+ }
118+
119+ // Uso del sistema refactorizado
120+ fun main () {
121+ val bookManager = BookManager ()
122+ val userManager = UserManager ()
123+ val loanManager = LoanManager ()
124+ val library = Library (bookManager, userManager, loanManager)
125+
126+ library.addBook(" 1984" , " George Orwell" , 5 )
127+ library.registerUser(" EulogioEP" , " 001" , " eulogioep@email.com" )
128+ library.loanBook(" 001" , " 1984" )
129+ library.returnBook(" 001" , " 1984" )
130+ }
0 commit comments