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" ,
" [email protected] " )
128
+ library.loanBook(" 001" , " 1984" )
129
+ library.returnBook(" 001" , " 1984" )
130
+ }
0 commit comments