Skip to content

Commit a15a5f8

Browse files
authored
Merge pull request #7004 from Hequebo/hequebo29
#29 - C#
2 parents d7932f7 + a5ff3b4 commit a15a5f8

File tree

1 file changed

+253
-0
lines changed

1 file changed

+253
-0
lines changed

Roadmap/29 - SOLID ISP/c#/hequebo.cs

Lines changed: 253 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
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

Comments
 (0)