1
+ /*
2
+ * El principio de Segregación de Interfaces dice que
3
+ * "Los clientes no deben de ser forzados a depender
4
+ * de métodos que no utilizan". Esto evita crear interfaces
5
+ * con demasiados métodos que no todas las clases que implementen
6
+ * la interfas van a utilizar, por lo que estos métodos no tendrán
7
+ * implementación. Es un principio parecido al de Sustitución de
8
+ * Liskov pero enfocado a las interfaces.
9
+ */
10
+
11
+ // Incorrecto
12
+ /*
13
+ * Creamos una interfaz que contiene varios métodos
14
+ * para realizar un CRUD para diferentes tipos de
15
+ * entidades
16
+ */
17
+ interface ICrud < T >
18
+ {
19
+ public List < T > GetList ( ) ;
20
+ public T Get ( int id ) ;
21
+ public void Add ( T entity ) ;
22
+ public void Update ( T entity ) ;
23
+ public void Delete ( T entity ) ;
24
+
25
+ }
26
+ /*
27
+ * Este primer servicio encargado de la clase User
28
+ * implementa todas las operaciones de la interfaz
29
+ * ICrud
30
+ */
31
+ class UserService : ICrud < User >
32
+ {
33
+ public List < User > GetList ( )
34
+ {
35
+ Console . WriteLine ( "Se obtiene lista de usuarios" ) ;
36
+ return new List < User > ( ) ;
37
+ }
38
+ public User Get ( int id )
39
+ {
40
+ Console . WriteLine ( "Se obtiene usuario" ) ;
41
+ return new User ( ) ;
42
+ }
43
+ public void Add ( User user ) => Console . WriteLine ( $ "Se agrega nuevo usuario { user . Name } .- { user . Name } ") ;
44
+ public void Update ( User user ) => Console . WriteLine ( $ "Se actualiza usuario { user . Id } .- { user . Name } ") ;
45
+ public void Delete ( User user ) => Console . WriteLine ( $ "Se elimina usuario { user . Id } .- { user . Name } ") ;
46
+ }
47
+ /*
48
+ * El siguiente servicio encargado de las transacción
49
+ * realmente solo implementa los métodos de obtener y
50
+ * agregar nuevas transacciones que por lógica de
51
+ * negocio no es posible modificarlas o eliminarlas
52
+ */
53
+ class TransactionsService : ICrud < Transaction >
54
+ {
55
+ public List < Transaction > GetList ( )
56
+ {
57
+ Console . WriteLine ( "Se obtiene lista de transacciones" ) ;
58
+ return new List < Transaction > ( ) ;
59
+ }
60
+ public Transaction Get ( int id )
61
+ {
62
+ Console . WriteLine ( "Se obtiene transacción" ) ;
63
+ return new Transaction ( ) ;
64
+ }
65
+ public void Add ( Transaction transaction )
66
+ {
67
+ Console . WriteLine ( "Se guardó transacción" ) ;
68
+ }
69
+
70
+ /*
71
+ * Los métodos Delete() y Update() arrojarán una excepción ya
72
+ * que no se tiene una implementación debido a reglas de negocio
73
+ */
74
+ public void Delete ( Transaction transaction )
75
+ {
76
+ throw new NotImplementedException ( ) ;
77
+ }
78
+ public void Update ( Transaction transaction )
79
+ {
80
+ throw new NotImplementedException ( ) ;
81
+ }
82
+ }
83
+ // Correcto
84
+ /*
85
+ * Separamos la interfaz anterior en dos, una que
86
+ * contenga los método que ambos servicio implementan
87
+ * y otra que contenga los métodos de actualizar y
88
+ * eliminar
89
+ */
90
+ interface IBasicCrud < T >
91
+ {
92
+ public List < T > GetList ( ) ;
93
+ public T Get ( int id ) ;
94
+ public void Add ( T entity ) ;
95
+ }
96
+ interface IEditableCrud < T >
97
+ {
98
+ public void Update ( T entity ) ;
99
+ public void Delete ( T entity ) ;
100
+ }
101
+ /*
102
+ * Ahora los nuevos servicios pueden implementar la intrefaz
103
+ * que contenga solo los métodos requeridos
104
+ */
105
+ class UserServiceISP : IBasicCrud < User > , IEditableCrud < User >
106
+ {
107
+ public List < User > GetList ( )
108
+ {
109
+ Console . WriteLine ( "Se obtiene lista de usuarios" ) ;
110
+ return new List < User > ( ) ;
111
+ }
112
+ public User Get ( int id )
113
+ {
114
+ Console . WriteLine ( "Se obtiene usuario" ) ;
115
+ return new User ( ) ;
116
+ }
117
+ public void Add ( User user ) => Console . WriteLine ( $ "Se agrega nuevo usuario { user . Name } .- { user . Name } ") ;
118
+ public void Update ( User user ) => Console . WriteLine ( $ "Se actualiza usuario { user . Id } .- { user . Name } ") ;
119
+ public void Delete ( User user ) => Console . WriteLine ( $ "Se elimina usuario { user . Id } .- { user . Name } ") ;
120
+ }
121
+ class TransactionServiceISP : IBasicCrud < Transaction >
122
+ {
123
+ public List < Transaction > GetList ( )
124
+ {
125
+ Console . WriteLine ( "Se obtiene lista de transacciones" ) ;
126
+ return new List < Transaction > ( ) ;
127
+ }
128
+ public Transaction Get ( int id )
129
+ {
130
+ Console . WriteLine ( "Se obtiene transacción" ) ;
131
+ return new Transaction ( ) ;
132
+ }
133
+ public void Add ( Transaction transaction )
134
+ {
135
+ Console . WriteLine ( "Se guardó transacción" ) ;
136
+ }
137
+ }
138
+
139
+ /*
140
+ * Las siguientes clases representan modelos en la base de
141
+ * datos, uno para una tabla de usuarios y otra para
142
+ * transacciones realizadas en el sistema.
143
+ */
144
+ class User
145
+ {
146
+ public int Id { get ; set ; }
147
+ public string Name { get ; set ; }
148
+ public string Email { get ; set ; }
149
+ }
150
+ class Transaction
151
+ {
152
+ public int Id { get ; set ; }
153
+ public int UserId { get ; set ; }
154
+ public DateTime Date { get ; set ; }
155
+ }
156
+ // Ejercicio Extra
157
+ interface IPrinter
158
+ {
159
+ public void Print ( string doc ) ;
160
+ }
161
+ interface IColorPrinter
162
+ {
163
+ public void PrintColor ( string doc ) ;
164
+ }
165
+ interface IScanner
166
+ {
167
+ public void Scan ( string doc ) ;
168
+ }
169
+ interface IFax
170
+ {
171
+ public void SendFax ( string doc ) ;
172
+ }
173
+
174
+ class Printer : IPrinter
175
+ {
176
+ public void Print ( string doc ) => Console . WriteLine ( $ "Imprimiendo documento { doc } en blanco y negro...") ;
177
+ }
178
+ class ColorPrinter : IColorPrinter
179
+ {
180
+ public void PrintColor ( string doc ) => Console . WriteLine ( $ "Imprimiendo documento { doc } a color...") ;
181
+ }
182
+ class MultiFunctionPrinter : IPrinter , IColorPrinter , IScanner , IFax
183
+ {
184
+ public void Print ( string doc ) => Console . WriteLine ( $ "Imprimiendo documento { doc } en blanco y negro...") ;
185
+ public void PrintColor ( string doc ) => Console . WriteLine ( $ "Imprimiendo documento { doc } a color...") ;
186
+ public void Scan ( string doc ) => Console . WriteLine ( $ "Esanenado documento { doc } ...") ;
187
+ public void SendFax ( string doc ) => Console . WriteLine ( $ "Envíando documento { doc } por fax...") ;
188
+
189
+ }
190
+ class Program
191
+ {
192
+ static void Main ( string [ ] args )
193
+ {
194
+ Console . WriteLine ( "----Principio de Segregación de Interfaces----" ) ;
195
+ Console . WriteLine ( "---Incorrecto---" ) ;
196
+ // Incorrecto
197
+ UserService userService = new UserService ( ) ;
198
+ var userList = userService . GetList ( ) ;
199
+ var user = userService . Get ( 1 ) ;
200
+ userService . Add ( new User ( ) ) ;
201
+ userService . Update ( user ) ;
202
+ userService . Delete ( user ) ;
203
+
204
+ TransactionsService transactionsService = new TransactionsService ( ) ;
205
+ var transactionList = transactionsService . GetList ( ) ;
206
+ var transaction = transactionsService . Get ( 1 ) ;
207
+ transactionsService . Add ( new Transaction ( ) ) ;
208
+ try
209
+ {
210
+ transactionsService . Update ( transaction ) ;
211
+ }
212
+ catch ( Exception ex )
213
+ {
214
+ Console . WriteLine ( ex . Message ) ;
215
+ }
216
+ try
217
+ {
218
+ transactionsService . Delete ( transaction ) ;
219
+ }
220
+ catch ( Exception ex )
221
+ {
222
+ Console . WriteLine ( ex . Message ) ;
223
+ }
224
+
225
+ Console . WriteLine ( "---Correcto---" ) ;
226
+ UserServiceISP userServiceISP = new UserServiceISP ( ) ;
227
+ userList = userServiceISP . GetList ( ) ;
228
+ user = userServiceISP . Get ( 1 ) ;
229
+ userServiceISP . Add ( new User ( ) ) ;
230
+ userServiceISP . Update ( user ) ;
231
+ userServiceISP . Delete ( user ) ;
232
+
233
+ TransactionServiceISP transactionServiceISP = new TransactionServiceISP ( ) ;
234
+ transactionList = transactionServiceISP . GetList ( ) ;
235
+ transaction = transactionServiceISP . Get ( 1 ) ;
236
+ transactionServiceISP . Add ( new Transaction ( ) ) ;
237
+
238
+ // Ejercicio Extra
239
+ Console . WriteLine ( "---Ejercicio Extra---" ) ;
240
+ Printer printer = new Printer ( ) ;
241
+ printer . Print ( "holamundo.pdf" ) ;
242
+
243
+ ColorPrinter colorPrinter = new ColorPrinter ( ) ;
244
+ colorPrinter . PrintColor ( "holamundo.pdf" ) ;
245
+
246
+ MultiFunctionPrinter multiFunctionPrinter = new MultiFunctionPrinter ( ) ;
247
+ multiFunctionPrinter . Print ( "holamundo.pdf" ) ;
248
+ multiFunctionPrinter . PrintColor ( "holamundo.pdf" ) ;
249
+ multiFunctionPrinter . Scan ( "holamundo.pdf" ) ;
250
+ multiFunctionPrinter . SendFax ( "holamundo.txt" ) ;
251
+ Console . ReadLine ( ) ;
252
+ }
253
+ }
0 commit comments