Estaba repasando la documentación de PHP sobre constructores y subclases, y me encontré con que no se puede definir varios constructores para una misma clase...
Quizá estoy confundido, esto es realmente así?
¿Porque? ¿Que opinan ustedes?
| ||||
Respuesta: ¿Así que PHP5 no adminte multiples constructores? Hola chitoso, Es lo correcto, pero puedes "emular" la funcionalidad usando func_get_args() para obtener valores dinamicos. La razón es debido a que PHP es un lenguaje que no forza la definición de variables, es decir, no es necesario que una variable sea un int o un string, por lo que tu puedes crear tu constructor y dentro del constructor realizar la logica de ver que tipo de dato es y hacer cierta tarea. Saludos. |
| ||||
Respuesta: ¿Así que PHP5 no adminte multiples constructores? Es así, es distinto a Java, no puedes tener múltiples métodos con nombres iguales pero con firmas distintas (diferencias en los parámetros). De todas formas, es una práctica bastante discutida, ya que no siempre ayuda a terminar con un buen diseño, ya que en vez de tener un solo método que hace una tarea concreta tienes múltiples métodos que parecen ser el mismo pero que en realidad hacen cosas distintas... entonces... son métodos iguales o distintos? deberían llamarse igual? Sugerencias para estos casos:
"La información básica para crear el usuario es id y nombre", posteriormente asignas la clave y el email si cuentas con ellos. |
| ||||
Respuesta: ¿Así que PHP5 no adminte multiples constructores? ¿Porque decepcionar?, Como bien indica Enrique puede llegar a crear problemas de diseño, y en el caso que los necesites es perfectamente posible hacerlo usando func_get_args(). Decepcionante sería que no hubiera ni una sola manera de hacerlo. Saludos. |
| ||||
Respuesta: ¿Así que PHP5 no adminte multiples constructores? Claro, es discutible por las razones que vos decis... Ahora, prefiero hacer varios métodos del estilo "crearUsuarioEnBlanco()", "crearUsuarioConTodosLosDatos($x, $y, $z...)", "crearUsuarioIdYClave($x, $y)" que llamen al consructor, haga sets de la información extra y devuelva un Usuario, antes que emular el comportamiento de un constructor en Java, con func_get_args(). GatorV, si, si no se pudiera hacer de ninguna manera sería como para ponerse a llorar... Pero, es lo que sentí, pensé que era un comportamiento tan básico, que me olvidé que por las características de php, no iba a poder ser posible. Aunque creo que ahora que está disponible Type Hinting, se podría implementar... |
| ||||
Respuesta: ¿Así que PHP5 no adminte multiples constructores? Cita: Mmmm... por qué tan rebuscado? El mejor diseño es el más simple (y es escalable )Claro, es discutible por las razones que vos decis... Ahora, prefiero hacer varios métodos del estilo "crearUsuarioEnBlanco()", "crearUsuarioConTodosLosDatos($x, $y, $z...)", "crearUsuarioIdYClave($x, $y)" que llamen al consructor, haga sets de la información extra y devuelva un Usuario, antes que emular el comportamiento de un constructor en Java, con func_get_args(). Crea un solo constructor simple y luego asigna los valores por "set". Si tus aplicaciones necesitan que les devuelvas los objetos de tipo "Usuario" ya cargados, crea entonces una "Fabrica de Usuarios" (una clase aparte o un método dentro de la clase Usuarios que se llame "factory") y que reciba valores dinámicos por un parámetro objeto o un array, y posteriormente le devuelves la instancia ya cargada (que hiciste internamente con un constructor simple y asignando con set). Es un camino ampliamente recorrido y seguro, para que vamos a caminar por el precipicio innecesariamente? Cita: No entendí esta parte, por qué lo dices? Aunque creo que ahora que está disponible Type Hinting, se podría implementar... Última edición por enriqueplace; 13/08/2008 a las 09:19 Razón: mal redactado |
| ||||
Respuesta: ¿Así que PHP5 no adminte multiples constructores? Al contrario Type Hinting, te crearia el problema ya que forzas que un parámetro sea de determinado tipo, en lugar de que sea una variable dinamica. Lo mejor es que hagas lo que te dice Enrique, el patrón Factory se encarga justo de eso. Saludos. |
| ||||
Respuesta: ¿Así que PHP5 no adminte multiples constructores? Si, conozco el patrón de diseño y me parece una solución válida. Pero lo que dije es que antes que preguntar por la cantidad de argumentos que se pasan y chequear por el tipo, preferiría hacer 2 métodos diferentes, porque me parece que queda mucho mas claro y más sencillo. Lo segundo lo dije porque con type hinting sería posible tener dos constructores y definir el tipo en la firma... no? __construct( boolean $a) __construct( String $s) |
| ||||
Respuesta: ¿Así que PHP5 no adminte multiples constructores? Hola chitoso, Tu mismo viste las limitantes, no es posible tener dos constructores, como te digo debes de usar las variables dinamicas y comprobar como por ejemplo con is_array, is_boolean, is_string, etc. Saludos. |
| ||||
Respuesta: ¿Así que PHP5 no adminte multiples constructores? Cita: Será más sencillo, pero no más claro. Lo "sencillo" es mantener el "diseño sencillo".Si, conozco el patrón de diseño y me parece una solución válida. Pero lo que dije es que antes que preguntar por la cantidad de argumentos que se pasan y chequear por el tipo, preferiría hacer 2 métodos diferentes, porque me parece que queda mucho mas claro y más sencillo. Cita: Es lo mismo, ahí tienes dos metodos iguales pero con distintas firmas, y eso es lo que no soporta PHP y sí hace Java. Lo segundo lo dije porque con type hinting sería posible tener dos constructores y definir el tipo en la firma... no? __construct( boolean $a) __construct( String $s) Manten el diseño simple, deja tranquilo al pobre constructor, por favor |
| ||||
Respuesta: ¿Así que PHP5 no adminte multiples constructores? Bueno, bueno, no me reten más, que uno solo quiere aprender, chee! jejeje, no, fuera de bromas, gracias a los dos. Saludos, Ignacio |
| ||||
Respuesta: ¿Así que PHP5 no adminte multiples constructores? De todas formas, sugerencia, no hay que atar el código a la implementación, cuanto más abstracto más económico será mantener el mismo. Por eso me preocupa mucho cuando usan funciones que te dicen de que clase es un objeto que recibes, ya que vuelves a caer en los problemas de diseño habituales, cuando aquí habría que usar "el patrón estratégico más importante de la POO", o sea, el polimorfismo. |
| ||||
Respuesta: ¿Así que PHP5 no adminte multiples constructores? Cita: 1- Frases como mas abstractos mejor, es erroneo, cuanto mas abstraes, en general mas complejidad tenes y mas dificil es de mantener.
Iniciado por enriqueplace De todas formas, sugerencia, no hay que atar el código a la implementación, cuanto más abstracto más económico será mantener el mismo. Por eso me preocupa mucho cuando usan funciones que te dicen de que clase es un objeto que recibes, ya que vuelves a caer en los problemas de diseño habituales, cuando aquí habría que usar "el patrón estratégico más importante de la POO", o sea, el polimorfismo. 2- Las clases no tienen funciones, a los sumo Metodos 3- El polimorfismo no es un patron, muchos de los patrones que existen basan su idea en el polimorfismo Algo que si es un patron son la forma en que escribis los comentarios, como citando constantemenete frases de algun libro de por ahi. Lo malo que no parecen tuyas, y muchas veces pecas de sobervio. Saludos. Última edición por pablofmorales; 25/08/2008 a las 12:57 |
| ||||
Respuesta: ¿Así que PHP5 no adminte multiples constructores? Bueno, veo que sale un cangrejo debajo de la piedra.... Me voy a tomar 5 valiosos minutos para responderte, así te das cuenta que pierdes otra oportunidad de escuchar y no hablar sin pensar antes. Cita: ¿"Erróneo"? (que atrevido), lee sobre principios de diseño y el cálculo de las abstracciones de clases y paquetes (existen fórmulas para calcularlo), ahí se explica claramente qué es lo más conveniente. Cita: Comprensión lectora "cero", repito cita: "Por eso me preocupa mucho cuando usan funciones que te dicen de que clase es un objeto que recibes"2- Las clases no tienen funciones, a los sumo Metodos Lo comentaba porque mi estimado GatorV (al cual admiro su calidad de código) tiene la costumbre de usar funciones (del lenguaje) como get_class lo cual -en mi opinión y de los libros- es peligroso, ya que empiezas a preguntar si es de tal o cual clase, lo que te lleva a atar tu código "a la implementación" ("es de clase Persona? es de clase Usuario? ... ah, tengo que agregar otro if porque me agregaron una variante más) y no a un "buen diseño" que contenga los "focos de cambio" de todo sistema (Principio de Diseño "Abierto / Cerrado"). Cita: El polimorfismo es un "patrón estratégico" (no lo busques en el GOF porque significará que no entendiste la frase). 3- El polimorfismo no es un patron, muchos de los patrones que existen basan su idea en el polimorfismo Cita: Evidentemente la única intención de tu participación es pura y llanamente un ataque personal (además de conocerte en personal, he tenido la mala suerte de trabajar con tú codigo, que de objetos no tiene nada).Algo que si es un patron son la forma en que escribis los comentarios, como citando constantemenete frases de algun libro de por ahi. Lo malo que no parecen tuyas, y muchas veces pecas de sobervio. Consejo: lee, lee libros (no creas todo lo que hay en Internet, menos copies sin razonar y sin citar, todos los entrecomillados son "citas"), y principalmente, lee libros sobre diseño POO, así no salen las burradas como las que publicas que tanto mal le hacen a los novatos que quieren aprender PHP (que las leen y pueden pensar que son ciertas). Si lees libros, no cometerás burradas. ... ahí van mis preciados 5 minutos del día. |
| ||||
Respuesta: ¿Así que PHP5 no adminte multiples constructores? Cita: Jjajaja, digna respuesta tuya.
Iniciado por enriqueplace Bueno, veo que sale un cangrejo debajo de la piedra.... Me voy a tomar 5 valiosos minutos para responderte, así te das cuenta que pierdes otra oportunidad de escuchar y no hablar sin pensar antes. ¿"Erróneo"? (que atrevido), lee sobre principios de diseño y el cálculo de las abstracciones de clases y paquetes (existen fórmulas para calcularlo), ahí se explica claramente qué es lo más conveniente. Comprensión lectora "cero", repito cita: "Por eso me preocupa mucho cuando usan funciones que te dicen de que clase es un objeto que recibes" Lo comentaba porque mi estimado GatorV (al cual admiro su calidad de código) tiene la costumbre de usar funciones (del lenguaje) como get_class lo cual -en mi opinión y de los libros- es peligroso, ya que empiezas a preguntar si es de tal o cual clase, lo que te lleva a atar tu código "a la implementación" ("es de clase Persona? es de clase Usuario? ... ah, tengo que agregar otro if porque me agregaron una variante más) y no a un "buen diseño" que contenga los "focos de cambio" de todo sistema (Principio de Diseño "Abierto / Cerrado"). El polimorfismo es un "patrón estratégico" (no lo busques en el GOF porque significará que no entendiste la frase). Evidentemente la única intención de tu participación es pura y llanamente un ataque personal (además de conocerte en personal, he tenido la mala suerte de trabajar con tú codigo, que de objetos no tiene nada). Consejo: lee, lee libros (no creas todo lo que hay en Internet, menos copies sin razonar y sin citar, todos los entrecomillados son "citas"), y principalmente, lee libros sobre diseño POO, así no salen las burradas como las que publicas que tanto mal le hacen a los novatos que quieren aprender PHP (que las leen y pueden pensar que son ciertas). Si lees libros, no cometerás burradas. ... ahí van mis preciados 5 minutos del día. Como siempre pensas que todos somos enriqueplace, asi que respondes como si el que habla fueras vos. Es gracioso, y mucho este tipo de respuesta. Primero no se donde sacaste que el polimorfismo es un patron estrategico, si usas la palabra patron en sistemas, te referis a como solucionar problemas de disenio (no tengo las init_us, por eso no uso enies). No estas validando nada de lo que decis con fuentes concretas, y solo insultas para imponer tu idea. Suerte Capo. Fijate que hace mucho no participo en este foro, por el exceso de importancia que te dan. Pero hoy no solo participe en este post, sino en otros donde no tenes mensajes ;) Aprovecha los proximos 5" Valiosos de tu vida para hacer algo con ella. Suerte capo
__________________ blog |
| ||||
Respuesta: ¿Así que PHP5 no adminte multiples constructores? Cita: Por si no sabías, sí existe un patrón llamado "Polimorfismo". Que no es el mismo tipo de partón que el Singleton, o el Factory, por ejemplo.La verdad, arruinaste un post interesante con datos erroneos, citas fuera de contexto y ataques infantiles. Espero que con todas las aclaraciones que hicimos, aún le sirva a otro y no se confunda. Saludos, Ignacio
__________________ Pasión por la Música |
| ||||
Respuesta: ¿Así que PHP5 no adminte multiples constructores? Cita: Patrones hay muchos, y con cualquier nombre, el se referia a que el polimorfismo es un patron, y eso es lo erroneo.
Iniciado por chitoso Por si no sabías, sí existe un patrón llamado "Polimorfismo". Que no es el mismo tipo de partón que el Singleton, o el Factory, por ejemplo. La verdad, arruinaste un post interesante con datos erroneos, citas fuera de contexto y ataques infantiles. Espero que con todas las aclaraciones que hicimos, aún le sirva a otro y no se confunda. Saludos, Ignacio No creo haber agredido a nadie, el post de el tiene un tono muchisimo mas alto que el mio, y no veo que hayas dicho nada. Y creo que cuando alguien dice algo equivocado esta bueno la correccion, porque sino pasa, que cualquiera que lee entra y ve que el polimorfismo es un patron, y se lo cree, y mas si el que lo dice es un consultor it. Todos nos equivocamos ;), esta bueno marcar los errores. Estamos constantemente aprendiendo y sino fuera asi la vida no tendria sentido. Lo unico es que hay que saber hacer una critica, sin pecar de sobervio. Saludos
__________________ blog |
| ||||
"Polimorfismo, un patrón estratégico" Para terminar de cerrar la explicación sobre la frase (ya que nuestro moderador se apuró a cerrar el hilo de tan culta discusión ), no me gustaría dejar un tema colgado como este, ya que luego volvemos a desinformar con afirmaciones sin ningún sustento. Por sentido común no se puede asociar a la palabra "patrón" solo a "diseño" (sistemas), pero tampoco se puede excluir el significado genérico de la palabra para usarla en el contexto del desarrollo de sistemas. Existen "Patrones de Diseño", pero existen otros "patrones". Solo con leer la Wikipedia pasa de Patrones de Diseño a sugerir leer GRASP: Cito: "En diseño orientado a objetos, GRASP son patrones generales de software para asignación de responsabilidades, es el acrónimo de "General Responsibility Assignment Software Patterns" Si seguimos más abajo (y repito, también se puede encontrar en libros sobre el tema), dentro de los "patrones" aparece: "Siempre que se tenga que llevar a cabo una reponsabilidad que dependa del tipo, se tiene que hacer uso del polimorfismo." Nota: retomo el tema porque creo que la explicación permitirá a otros entender que el polimorfismo es un patrón, pero no un patrón de diseño como los que aparecen en el GOF. |
| ||||
Respuesta: "Polimorfismo, un patrón estratégico" un poco rebuscada la explicacion, sin embargo no explicas porque una clase tiene "funciones" Y ademas, el comentario sigue siendo, el polimorfismo no es un patron. Si vamos al significado de la palabra patron, dice multiples formas. Y sigo con el argumento, que no sos claro. Por que si yo te digo ahora, que php es un patron en este contexto es erroneo, como lo es tu definicion de polimorfismo.
__________________ blog |
| |||
"Polimorfismo, un patrón estratégico" Enrique, Tendrias que leer el libro Design Patterns de GoF [1] (en inglés obligatorio). Mas alla de patrones de diseño o no patrones de diseño, la etimologia de patron refiere a algo que se repite y por repeticion uno generaliza con un nombre conceptual. El polimorfismo es un feature del paradigma de objetos, no es un patron, es algo buscado, deseado y se usa de manera arbitraria. La unica relacion que veo entre patron, estrategia y polimorfismo es el patron strategy [2], ¿sera que te estas confundiendo con eso? ¿O sera que te parece patron por que se usa mucho? pero bue, en ese es por que el paradigma de objetos te dice "Usa polimorfismo!!" No me parece que se pueda considerar como patron el uso de features (no en este contexto, por ahi en el de neural nets [3] si, sobre todo [4], pero es irse demasiado por las ramas ya) [1] http://en.wikipedia.org/wiki/Design_Patterns http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612 [2] http://en.wikipedia.org/wiki/Strategy_pattern [3] http://en.wikipedia.org/wiki/Neural_network http://www.amazon.com/Neural-Networks-Pattern-Recognition-Christopher/dp/0198538642 [4] http://en.wikipedia.org/wiki/Self-organizing_map Gerardo Romay |
| ||||
Respuesta: "Polimorfismo, un patrón estratégico" Lo conozco y lo he leído, ahora mi pregunta es... leiste la parte que dice "GRASP"? Tengo muy claro los patrones de diseño y qué es el polimorfismo, y no me baso en solo la Wikipedia para hablar. El término es usado por más de un escrito o persona, y lo he llegado a escuchar en más de un curso o charla en mis años que llevo en esto. ¿Cual es el verdadero punto? ¿cual es tú verdadero punto? No voy a entrar a discutir juegos de palabras, si no te gusta el término, corrije la wikipedia y algún libro más sobre el tema y te copio algún mail de un par de docentes de universidades que también acuñan el término una y otra vez. Todos nos podemos equivocar, pero no es el caso, y creo que la explicación fue más que clara. |