Академический Документы
Профессиональный Документы
Культура Документы
[SRP] Principio de
responsabilidad única
Descripción general
↑↑↑
[SRP] Principio de
responsabilidad única
↑↑↑
jms32.eresmas.net/web2008/documentos/informatica/documentacion/logica/OOP/Principios/Oop_Solid_SRP/2012_09_04_SOLID_SRP_PrincipioResponsabili… 1/13
22/03/13 [SRP] Principio de responsabilidad única
↑↑↑
[SRP] Principio de responsabilidad única
Este principio nos viene a decir que una clase sólo debería
tener una única razón para cambiar.
"Una clase debe tener una y solo una única causa por
la cual puede ser modificada."
"Cada clase debe ser responsable de realizar una
actividad del sistema
jms32.eresmas.net/web2008/documentos/informatica/documentacion/logica/OOP/Principios/Oop_Solid_SRP/2012_09_04_SOLID_SRP_PrincipioResponsabili… 2/13
22/03/13 [SRP] Principio de responsabilidad única
¿Y no sería más sencillo decir que una clase debería tener una
sola razón para existir en lugar de para cambiar? Cuidado,
porque esto nos podría llevar a hacer muy malos diseños de
sistemas. Llevado al pie de la letra podría encontrarme con
cientos de clases en mi sistema, cada una con una única
función. Lo que haría al sistema nada fácil de mantener.
El punto clave que nos dice las razones por la que una clase
puede cambiar va a depender del contexto en el que se va a
dar uso a esa clase. Pongamos por ejemplo una clase que
represente al motor de un coche. ¿Necesitamos conocer el
régimen de revoluciones del motor?, ¿el peso?, ¿número de
cilindros?, ¿presión del inyector de gasolina?, ¿o lo que nos
interesa es simplemente poder arrancarlo y esperar que haga
andar a un coche para llevaros de un sitio a otro? La respuesta
a estas preguntas va a depender del contexto en el cual
usemos la clase motor. No va a tener las mismas necesidades
sobre esta clase un fabricante de coches que un usuario que
usa el coche para ir de un sitio a otro. El fabricante de coches
va a notar un número mayor de responsabilidades en el motor
que el usuario del coche. Por tanto, para el fabricante, este
principio recomendaría dividir la clase motor en otras más
pequeñas que cumplan con las especificaciones de manera
individual.
↑↑↑
Veamos un ejemplo típico de violación
del SRP:
Si una clase tiene dos responsabilidades, entonces asume dos
motivos por los cuales puede ser modificada. Por ejemplo,
supongamos una clase llamada Factura, la cual dentro de un
contexto determinado ofrece un método para calcular el
importe total, tal y como muestra la siguiente figura.
jms32.eresmas.net/web2008/documentos/informatica/documentacion/logica/OOP/Principios/Oop_Solid_SRP/2012_09_04_SOLID_SRP_PrincipioResponsabili… 3/13
22/03/13 [SRP] Principio de responsabilidad única
Figura 01
↑↑↑
Detectando responsabilidades
Listado 01
class Factura
{
public string Codigo { get; set; }
public DateTime FechaEmision { get; set; }
public decimal ImporteFactura { get; set; }
public decimal ImporteIVA { get; set; }
public decimal ImporteDeduccion { get; set; }
public decimal ImporteTotal { get; set; }
public decimal PorcentajeDeduccion { get; set; }
jms32.eresmas.net/web2008/documentos/informatica/documentacion/logica/OOP/Principios/Oop_Solid_SRP/2012_09_04_SOLID_SRP_PrincipioResponsabili… 4/13
22/03/13 [SRP] Principio de responsabilidad única
ImporteIVA = ImporteFactura * 0.16m;
// Calculamos el total
ImporteTotal = (ImporteFactura - ImporteDeduccion) + ImporteIVA;
}
}
↑↑↑
Separando responsabilidades
jms32.eresmas.net/web2008/documentos/informatica/documentacion/logica/OOP/Principios/Oop_Solid_SRP/2012_09_04_SOLID_SRP_PrincipioResponsabili… 5/13
22/03/13 [SRP] Principio de responsabilidad única
Listado 2
class IvaNormal
{
private const decimal PORCENTAJE_IVA_NORMAL = 0.16m;
public readonly decimal PorcentajeIvaNormal
{
get
{
return PORCENTAJE_IVA_NORMAL;
}
}
class Deduccion
{
private decimal m_PorcentajeDeduccion;
jms32.eresmas.net/web2008/documentos/informatica/documentacion/logica/OOP/Principios/Oop_Solid_SRP/2012_09_04_SOLID_SRP_PrincipioResponsabili… 6/13
22/03/13 [SRP] Principio de responsabilidad única
Listado 3
class FacturaFactorizada
{
public string Codigo { get; set; }
public DateTime FechaEmision { get; set; }
public decimal ImporteFactura { get; set; }
public decimal ImporteIVA { get; set; }
public decimal ImporteDeduccion { get; set; }
public decimal ImporteTotal { get; set; }
public decimal PorcentajeDeduccion { get; set; }
↑↑↑
Otro Ejemplo
jms32.eresmas.net/web2008/documentos/informatica/documentacion/logica/OOP/Principios/Oop_Solid_SRP/2012_09_04_SOLID_SRP_PrincipioResponsabili… 7/13
22/03/13 [SRP] Principio de responsabilidad única
Figura 2
Figura 3
↑↑↑
Una forma de probar este principio
jms32.eresmas.net/web2008/documentos/informatica/documentacion/logica/OOP/Principios/Oop_Solid_SRP/2012_09_04_SOLID_SRP_PrincipioResponsabili… 9/13
22/03/13 [SRP] Principio de responsabilidad única
Figure 04
Figura 5
Figura 6
↑↑↑
Ampliando el abanico de
"responsabilidades"
Comentábamos anteriormente que no es fácil detectar las
responsabilidades, ya que generalmente tendemos a
agruparlas. No obstante, existen escenarios o casuísticas en
los que "se permite" una cierta flexibilidad. Robert C. Martin
expone un ejemplo utilizando la interfaz Modem:
Listado 4
interface Modem
{
void dial(int pNumber);
void hangup();
void send(char[] data);
char[] receive();
}
↑↑↑
Conclusión
Pensemos siempre en el ciclo de vida de una aplicación, y no
únicamente en su diseño y desarrollo. Toda aplicación sufre
modificaciones a causa de cambios en los requisitos o arreglo
de fallos existentes, y el equipo de desarrollo puede variar; si
a ello le sumamos que el código es difícil de mantener, los
costes de mantenimiento se dispararán, y cualquier
modificación se presentará como una causa potencial de
jms32.eresmas.net/web2008/documentos/informatica/documentacion/logica/OOP/Principios/Oop_Solid_SRP/2012_09_04_SOLID_SRP_PrincipioResponsabi… 11/13
22/03/13 [SRP] Principio de responsabilidad única
↑↑↑
Referencia Bibliográfica
↑↑↑
A.2.Enlaces
[Grupo de documentos]
[Documento Index]
[Documento Start]
[Imprimir el Documento]
¡ No Olvides ñadir éste sitio a tus marcadores favoritos !
Pulsa (Ctrl + D)
jms32.eresmas.net/web2008/documentos/informatica/documentacion/logica/OOP/Principios/Oop_Solid_SRP/2012_09_04_SOLID_SRP_PrincipioResponsabi… 12/13
22/03/13 [SRP] Principio de responsabilidad única
Codificación UTF-8
Fecha de creación No existe una fecha
Última actualización 2013-03-23T09:29:00Z
jms32.eresmas.net/web2008/documentos/informatica/documentacion/logica/OOP/Principios/Oop_Solid_SRP/2012_09_04_SOLID_SRP_PrincipioResponsabi… 13/13