Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Principio de sustitución de Liskov (LSP)

Estas en el tema de Principio de sustitución de Liskov (LSP) en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a tod@s, Estaba leyendo los cinco principios básicos de la POO llamados S.O.L.I.D y la verdad que no he tenido ningún problema para comprender ...
  #1 (permalink)  
Antiguo 01/08/2012, 04:37
Avatar de OsSk4R  
Fecha de Ingreso: octubre-2006
Ubicación: $this->home
Mensajes: 824
Antigüedad: 18 años
Puntos: 74
Principio de sustitución de Liskov (LSP)

Hola a tod@s,

Estaba leyendo los cinco principios básicos de la POO llamados S.O.L.I.D y la verdad que no he tenido ningún problema para comprender todos exceptuando el principio de sustitución de Liskov.
He estado leyendo varios artículos acerca del mismo y la verdad es que no soy capaz de entenderlo . Por más que lo leo sigo sin comprenderlo, en cambio los otros con un par de lecturas me han servido. ¡Ahora falta practicarlos a tope!

Bueno, si alguien es capaz de ponerme un ejemplo sencillo como si le hablara a un tonto seria perfecto.
Por otro lado, a la vez que leía sobre Liskov me he encontrado que hablan de "diseño por contrato" así que aprovecho también para preguntar sobre que trata exactamente eso, ya que tampoco lo comprendo. ¿Eso de pre-condiciones, post-condiciones?... que lio

Saludos y gracias,
  #2 (permalink)  
Antiguo 01/08/2012, 09:43
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Principio de sustitución de Liskov (LSP)

El principio de sustitución de Liskov, lo que habla es precisamente de eso, de que si tienes una clase Perro, y luego tienes una clase PastorAleman, puedes sustituir Perro por PastorAleman sin afectar el sistema, ya que PastorAleman es un Perro.

Lo que quiere decir es que cuando necesites aplicar la herencia de una de tus clases es porque hay una relación directa y familiar, o sea que la clase que hereda tiene todas las características de la clase padre y puedes sustituirla sin provocar un error en el sistema.

Esto te ayuda a que no quieras hacer "superobjetosglobales" desde donde todas tus clases hereden (como muchos principiantes tienden a hacerlo) si no que la herencia sea usada exactamente donde la necesitas y cuando sea necesario.

Lo del diseño por contrato, habla de que uses la mayor cantidad de interfaces posibles en tus diseños, una interfaz es eso un contrato de diseño, cuando tu implementas una interfaz, estas obligado a implementar los métodos de esa interfaz.

Lo que se refiere es que en tus clases en lugar de aceptar objetos concretos, acepten interfaces, así haces tu diseño más dinámico, y aparte con mucha escalabilidad a futuro, aparte de que puedes sustituir una clase por otra ya que ambas implementan la interfaz.

Saludos.
  #3 (permalink)  
Antiguo 01/08/2012, 10:51
Avatar de OsSk4R  
Fecha de Ingreso: octubre-2006
Ubicación: $this->home
Mensajes: 824
Antigüedad: 18 años
Puntos: 74
Respuesta: Principio de sustitución de Liskov (LSP)

Cita:
El principio de sustitución de Liskov, lo que habla es precisamente de eso, de que si tienes una clase Perro, y luego tienes una clase PastorAleman, puedes sustituir Perro por PastorAleman sin afectar el sistema, ya que PastorAleman es un Perro.

Lo que quiere decir es que cuando necesites aplicar la herencia de una de tus clases es porque hay una relación directa y familiar, o sea que la clase que hereda tiene todas las características de la clase padre y puedes sustituirla sin provocar un error en el sistema.

Esto te ayuda a que no quieras hacer "superobjetosglobales" desde donde todas tus clases hereden (como muchos principiantes tienden a hacerlo) si no que la herencia sea usada exactamente donde la necesitas y cuando sea necesario.
Más sencillo imposible. O sea, así ¿no? :
Código PHP:
Ver original
  1. <?php
  2. class Perro
  3. {
  4.     public function comer()
  5.     {
  6.         echo "Estoy comiendo";
  7.     }
  8.  
  9. }
  10.  
  11. class PastorAleman extends Perro
  12. {
  13.  
  14. }
  15.  
  16. class Caniche extends Perro
  17. {
  18.  
  19. }
  20.  
  21. $perro = new PastorAleman();
  22. $perro->comer();

Cita:
Lo del diseño por contrato, habla de que uses la mayor cantidad de interfaces posibles en tus diseños, una interfaz es eso un contrato de diseño, cuando tu implementas una interfaz, estas obligado a implementar los métodos de esa interfaz.

Lo que se refiere es que en tus clases en lugar de aceptar objetos concretos, acepten interfaces, así haces tu diseño más dinámico, y aparte con mucha escalabilidad a futuro, aparte de que puedes sustituir una clase por otra ya que ambas implementan la interfaz.

Saludos.
¡Perfecto una vez más!
La verdad es que al investigar el principio de segregación de interfaces me he dado cuenta de lo que dices, o sea, tienes razón en tener que utilizar la mayor cantidad de interfaces, ya que éstas, deben ser específicas y no genéricas...

En fin, una vez más enormes gracias GatorV por tu ayuda tan valiosa

Por cierto, esto de los principios S.O.L.I.D están pero que muy bien. Al verlos con detenimiento y comprenderlos te das cuenta de los útiles y necesarios que llegan a ser

Saludos y muchas gracias,
  #4 (permalink)  
Antiguo 01/08/2012, 15:20
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 16 años, 3 meses
Puntos: 165
Respuesta: Principio de sustitución de Liskov (LSP)

En este caso no sería mejor:


Código PHP:
Ver original
  1. interface interface_perro {
  2.  
  3. public function comer();
  4.  
  5. }
  6.  
  7. class Perro implements interface_perro{
  8.  
  9. public function comer() {
  10.     return 'Estoy comiendo...';
  11. }
  12.  
  13. }
__________________
Gracias por el Karma :D

empleo ofertas de trabajo
  #5 (permalink)  
Antiguo 01/08/2012, 15:39
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Principio de sustitución de Liskov (LSP)

¿Mejor para que en específico?
  #6 (permalink)  
Antiguo 02/08/2012, 01:20
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 16 años, 3 meses
Puntos: 165
Respuesta: Principio de sustitución de Liskov (LSP)

Para poder reemplazar la clase por cualquier otra que cumpla con la interfaz.
__________________
Gracias por el Karma :D

empleo ofertas de trabajo
  #7 (permalink)  
Antiguo 02/08/2012, 09:01
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Principio de sustitución de Liskov (LSP)

Pues sí, pero es lo mismo del ejemplo de OsSk4R, de hecho el ejemplo de OsSk4R es el más adecuado cuando hablas del princpio de sustitución de Liskov, ya que precisamente habla de clases concretas y cuando heredar.

Saludos.
  #8 (permalink)  
Antiguo 02/08/2012, 15:45
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 16 años, 3 meses
Puntos: 165
Respuesta: Principio de sustitución de Liskov (LSP)

Pero... las clases concretas deberían implementar una interfaz, no?
__________________
Gracias por el Karma :D

empleo ofertas de trabajo
  #9 (permalink)  
Antiguo 02/08/2012, 16:20
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Principio de sustitución de Liskov (LSP)

Claro pero para demostrar el punto no, el chiste es que sea didáctico, ya en la práctica, sí el diseño por interfaces es lo más adecuado

Etiquetas: principio, sustitución
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 14:28.