Se que mi pregunta es básica y para la gran mayoria bastante simple, pero me resuena en mi cabeza y no consigo sacarla.
A veces nos encontramos con algunas ideas que debemos enfocar, sabemos que hay diferentes caminos, pero mi pregunta es: ¿Cuando debo crear una nueva clase como objeto independiente y cuando debo crear una nueva clase extendiendo a otra?
Para mí, esta claro que si tengo una clase "user" con toda la información del usuario, y quiero crear un sistema de login (almacenamiento de login, sistema de intentos, ip...) creare una clase "login" que extiende "user", de esta forma, puedo crear el objeto login y usar los datos de user ya que login extiende a user, bueno, un ejemplo mas que claro bajo mi opinión.
Pero aquí viene mi duda, quiero crear un objeto llamado módulos (los módulos de mi backend), pero también tendré los submódulos y los subsubmodulos (que llamare tipos), evidentmentemente, a nivel de tabla tengo claro que módulo-submódulo-tipo pero a nivel de objeto no lo tengo claro, no se si es mejor tener 3 classes independientes que interactuan o una clase módulo, una submódulo que extiende a módulo y una tipo que extiende a submódulo.
Mi otra pregunta es más simple, si tengo una clase "clase1" con una variable llamada $name y una clase que extiende a la anterior "clase2 extends clase1", ¿en esta segunda clase puedo tener una variable llamada $name? El problema es que al crear un objeto nuevo, si en la creación del objeto paso un identificador, automáticamente genero el objeto con todos los datos, los cuales vuelvo en variables que, por supuesto, tienen el mismo nombre que los campos en la base de datos, entonces si dos clases, una padre y la otra hijo, tienen un campo llamado "status", ¿se pisan? Deduzco que si, pero quizñas hay alguna forma para eludir este problema
Hola, si la variable es publica o protected si, de lo contrario si es private no puede "sobreescribirse".
http://ca3.php.net/manual/es/language.oop5.visibility.php
Hola Michel, yo vengo del mundo de Java pero en cuestiones de POO las cosas son similares entre lenguajes.
Cuando extiendes una clase extiendes su funcionalidad, es decir si tienes una clase user que almacena los datos de un usuario perfecto, pero no siempre los usuarios son iguales, por ejemplo un moderador de un foro del cual necesites almacenar los mensajes moderados, por un lado, la clase user no necesitaría almacenar los mensajes moderados, y por otro, no necesitamos repetir todo el código de la clase user en una nueva llamada moderador, es por ello que moderador extendería de user y podríamos utilizar los parámetros nombre, contraseña, étc, y además mensajes moderados.
Cuando creas el sistema de Login, la clase Login no va a extender de User, sino que va a utilizar un objeto de tipo user, aunque hay varias formas de realizar el proceso de login.
Entiendo lo que dices con los módulos, pero no alcanzo a ver el funcionamiento que quieres darle, podría ser una opción u otra dependiendo del escenario.
Sobre tu última pregunta, ¿puedes tener en la segunda clase la variable $name? no es que si puedes, es que ya la tienes. Y lo mismo sobre el campo status. ¿por qué tener 2 variables con el mismo nombre? por lo que o deberían tener distinto nombre ya que almacenan cosas distintas, o una clase no debería extender de la otra porque el diseño esta mal planteado.
Es normal que tengas muchas dudas sobre este tema, ya que es complejo, hay libros enteros dedicados a ello, y una vez asentados todos los conceptos lo verás con muchísima más claridad y te parecerá muy fácil.
Hola, Michel
Hay un principio de diseño que dice: Favorece la composición sobre la herencia. Así que la herencia úsala como último recurso. Tu me dirás, que vale, pero ¿ cuándo crear una herencia o cuando no ?. Ese criterio te lo da la experiencia. Aquí algunos casos:
Es normal hacer herencia cuando en el modelado de datos dos entidades están relacionadas. Para que se entienda: Si tienes dos tipos de usuario: Empresa y particular. Lo más lógico es que crees una clase User y luego tengas dos clases que hereden de ella. Una empresa o particular es un usuario, ¿ no ?
También cuando a nivel de programación una funcionalidad está ligada a nivel jerárquico con otra. Por ejemplo, podrías tener una clase que sea Modulo( o Plugin ) y la clase Login derivaría de ella. Un login es un módulo, ¿ no ?.
Pues muchas gracias por las respuestas, así me va quedando mas claro, no tenia ni idea del principio de herencia que comentaste Manuel, pero pienso seguirlo!!
Si puedes, échale un vistazo a estos dos libros.
http://shop.oreilly.com/product/9780596007126.do
http://www.amazon.es/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612
No se trata de extender una clase o crear una nueva. Se trata de aplicar un patrón que funcione para tu aplicación, luego si necesitas extender, crear o componer dependerá del problema que quieras solucionar a través de la aplicación del patrón.
He visto que ahora php integrar traits
tambien ayuda a separar con coherencia y quizas a dar un mayor peso a extender, como modelo de compartir metodos clases buscando la abstraccion, y quizas dejar traits para separar en piezas una clase "muy larga".
http://php.net/manual/es/language.oop5.traits.php
A veces nos encontramos con algunas ideas que debemos enfocar, sabemos que hay diferentes caminos, pero mi pregunta es: ¿Cuando debo crear una nueva clase como objeto independiente y cuando debo crear una nueva clase extendiendo a otra?
Para mí, esta claro que si tengo una clase "user" con toda la información del usuario, y quiero crear un sistema de login (almacenamiento de login, sistema de intentos, ip...) creare una clase "login" que extiende "user", de esta forma, puedo crear el objeto login y usar los datos de user ya que login extiende a user, bueno, un ejemplo mas que claro bajo mi opinión.
Pero aquí viene mi duda, quiero crear un objeto llamado módulos (los módulos de mi backend), pero también tendré los submódulos y los subsubmodulos (que llamare tipos), evidentmentemente, a nivel de tabla tengo claro que módulo-submódulo-tipo pero a nivel de objeto no lo tengo claro, no se si es mejor tener 3 classes independientes que interactuan o una clase módulo, una submódulo que extiende a módulo y una tipo que extiende a submódulo.
Mi otra pregunta es más simple, si tengo una clase "clase1" con una variable llamada $name y una clase que extiende a la anterior "clase2 extends clase1", ¿en esta segunda clase puedo tener una variable llamada $name? El problema es que al crear un objeto nuevo, si en la creación del objeto paso un identificador, automáticamente genero el objeto con todos los datos, los cuales vuelvo en variables que, por supuesto, tienen el mismo nombre que los campos en la base de datos, entonces si dos clases, una padre y la otra hijo, tienen un campo llamado "status", ¿se pisan? Deduzco que si, pero quizñas hay alguna forma para eludir este problema
Muchas gracias por vuestra ayuda!
12/03/2015 16:34
http://ca3.php.net/manual/es/language.oop5.visibility.php
Entiendo que es esto lo que me preguntas.
Saludos
13/03/2015 10:34
Cuando extiendes una clase extiendes su funcionalidad, es decir si tienes una clase user que almacena los datos de un usuario perfecto, pero no siempre los usuarios son iguales, por ejemplo un moderador de un foro del cual necesites almacenar los mensajes moderados, por un lado, la clase user no necesitaría almacenar los mensajes moderados, y por otro, no necesitamos repetir todo el código de la clase user en una nueva llamada moderador, es por ello que moderador extendería de user y podríamos utilizar los parámetros nombre, contraseña, étc, y además mensajes moderados.
Cuando creas el sistema de Login, la clase Login no va a extender de User, sino que va a utilizar un objeto de tipo user, aunque hay varias formas de realizar el proceso de login.
Entiendo lo que dices con los módulos, pero no alcanzo a ver el funcionamiento que quieres darle, podría ser una opción u otra dependiendo del escenario.
Sobre tu última pregunta, ¿puedes tener en la segunda clase la variable $name? no es que si puedes, es que ya la tienes. Y lo mismo sobre el campo status. ¿por qué tener 2 variables con el mismo nombre? por lo que o deberían tener distinto nombre ya que almacenan cosas distintas, o una clase no debería extender de la otra porque el diseño esta mal planteado.
Es normal que tengas muchas dudas sobre este tema, ya que es complejo, hay libros enteros dedicados a ello, y una vez asentados todos los conceptos lo verás con muchísima más claridad y te parecerá muy fácil.
Un Saludo!
16/03/2015 10:50
Hay un principio de diseño que dice: Favorece la composición sobre la herencia. Así que la herencia úsala como último recurso. Tu me dirás, que vale, pero ¿ cuándo crear una herencia o cuando no ?. Ese criterio te lo da la experiencia. Aquí algunos casos:
Es normal hacer herencia cuando en el modelado de datos dos entidades están relacionadas. Para que se entienda: Si tienes dos tipos de usuario: Empresa y particular. Lo más lógico es que crees una clase User y luego tengas dos clases que hereden de ella. Una empresa o particular es un usuario, ¿ no ?
También cuando a nivel de programación una funcionalidad está ligada a nivel jerárquico con otra. Por ejemplo, podrías tener una clase que sea Modulo( o Plugin ) y la clase Login derivaría de ella. Un login es un módulo, ¿ no ?.
Sobre la segunda pregunta no la entiendo bien.
Un saludo
13/03/2015 19:33
16/03/2015 20:02
24/03/2015 14:51
http://shop.oreilly.com/product/9780596007126.do
http://www.amazon.es/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612
No se trata de extender una clase o crear una nueva. Se trata de aplicar un patrón que funcione para tu aplicación, luego si necesitas extender, crear o componer dependerá del problema que quieras solucionar a través de la aplicación del patrón.
24/03/2015 19:09
06/04/2015 13:32
tambien ayuda a separar con coherencia y quizas a dar un mayor peso a extender, como modelo de compartir metodos clases buscando la abstraccion, y quizas dejar traits para separar en piezas una clase "muy larga".
http://php.net/manual/es/language.oop5.traits.php