Foros del Web » Programando para Internet » PHP »

Esta forma de programar es correcta

Estas en el tema de Esta forma de programar es correcta en el foro de PHP en Foros del Web. Esta forma de programar es correcta, es decir yo tengo la idea de que hay que usar polimorfismo o herencia o lo que sea para ...
  #1 (permalink)  
Antiguo 04/08/2014, 22:56
Avatar de jor_0203  
Fecha de Ingreso: octubre-2011
Ubicación: mexico
Mensajes: 760
Antigüedad: 12 años, 6 meses
Puntos: 8
Esta forma de programar es correcta

Esta forma de programar es correcta, es decir yo tengo la idea de que hay que usar polimorfismo o herencia o lo que sea para llamar a otra clase, pero se me ocurrió esta forma de llamar a la otra clase, entonces les pregunto esto se puede o no se debe llamar de esta forma

Código PHP:
Ver original
  1. class A
  2. {
  3.     function i()
  4.     {
  5.      echo "esta forma de llamar es correcta de llamar a la otra clase";
  6.     }
  7. }
Código PHP:
Ver original
  1. class B
  2. {
  3.     function v()
  4.     {
  5.      $f=new A();  //pregunto esto es correcto, gracias
  6.      $f->i();
  7.     }
  8. }

Código PHP:
Ver original
  1. $dd=new B();
  2. $dd->v();
  #2 (permalink)  
Antiguo 05/08/2014, 00:28
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Esta forma de programar es correcta

No. Para eso solo necesitas extender a la otra clase, o sea, B heredaría de A.

Código PHP:
Ver original
  1. class B extends A{
  2.     //...
  3. }

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 05/08/2014, 00:33
Avatar de jor_0203  
Fecha de Ingreso: octubre-2011
Ubicación: mexico
Mensajes: 760
Antigüedad: 12 años, 6 meses
Puntos: 8
Respuesta: Esta forma de programar es correcta

Cita:
Iniciado por Alexis88 Ver Mensaje
No. Para eso solo necesitas extender a la otra clase, o sea, B heredaría de A.

Código PHP:
Ver original
  1. class B extends A{
  2.     //...
  3. }

Saludos
haber si te entendí, esto no es correcto, pero pregunto por que ya que en java
se utiliza
http://chuwiki.chuidiang.org/index.p...a_a_otra_clase

y esto me tiene un muy confundido
  #4 (permalink)  
Antiguo 05/08/2014, 08:36
Avatar de alex171294  
Fecha de Ingreso: agosto-2014
Mensajes: 10
Antigüedad: 9 años, 8 meses
Puntos: 2
Información Respuesta: Esta forma de programar es correcta

Cita:
Iniciado por jor_0203 Ver Mensaje
haber si te entendí, esto no es correcto, pero pregunto por que ya que en java
se utiliza
[url]http://chuwiki.chuidiang.org/index.php?title=Llamar_desde_una_clase_java_a_otra _clase[/url]

y esto me tiene un muy confundido
esto podría funcionar en el caso de que necesitaras varias instancias de la clase a dentro de una sola instancia de la clase b.

de lo contrario como dice el amigo si, deberías extender para utilizar las funciones de la clase.

En realidad esto es válido dependiendo del contexto y uso que le des, ten en cuenta que tu clase de momento depende de la segunda clase y genera una dependencia bastante dura, que quizá podría solucionarse hasta con un Factory.

En cualquier caso todo depende de como lo uses.

saludos!

pd: no miré el code de java, soy todo un malote (?
  #5 (permalink)  
Antiguo 05/08/2014, 11:10
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Esta forma de programar es correcta

Cita:
Esta forma de programar es correcta, es decir yo tengo la idea de que hay que usar polimorfismo o herencia o lo que sea para llamar a otra clase, pero se me ocurrió esta forma de llamar a la otra clase, entonces les pregunto esto se puede o no se debe llamar de esta forma
La respuesta es claro que se puede, Pero lo que se recomienda es que no se realice de esa forma por que, como lo comentaron anteriormente acopla las clases reduciendo su reutilización, aparte de ocultar la dependencia.
Puedes usar los patrones de creación o la inversión de control (Inyección de dependencias) para reducir el acoplamiento.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #6 (permalink)  
Antiguo 06/08/2014, 00:02
Avatar de jor_0203  
Fecha de Ingreso: octubre-2011
Ubicación: mexico
Mensajes: 760
Antigüedad: 12 años, 6 meses
Puntos: 8
Respuesta: Esta forma de programar es correcta

Cita:
Iniciado por alex171294 Ver Mensaje
esto podría funcionar en el caso de que necesitaras varias instancias de la clase a dentro de una sola instancia de la clase b.

de lo contrario como dice el amigo si, deberías extender para utilizar las funciones de la clase.

En realidad esto es válido dependiendo del contexto y uso que le des, ten en cuenta que tu clase de momento depende de la segunda clase y genera una dependencia bastante dura, que quizá podría solucionarse hasta con un Factory.

En cualquier caso todo depende de como lo uses.

saludos!

pd: no miré el code de java, soy todo un malote (?
porque el patrón factory, porque dices que es una dependencia dura, yo he visto que en uml no todo es herencia y lo usan con otra flechas.

y mil gracias por tu aporte
  #7 (permalink)  
Antiguo 06/08/2014, 00:06
Avatar de jor_0203  
Fecha de Ingreso: octubre-2011
Ubicación: mexico
Mensajes: 760
Antigüedad: 12 años, 6 meses
Puntos: 8
Respuesta: Esta forma de programar es correcta

Cita:
Iniciado por hhs Ver Mensaje
La respuesta es claro que se puede, Pero lo que se recomienda es que no se realice de esa forma por que, como lo comentaron anteriormente acopla las clases reduciendo su reutilización, aparte de ocultar la dependencia.
Puedes usar los patrones de creación o la inversión de control (Inyección de dependencias) para reducir el acoplamiento.

una pregunta, así no se programa realmente cuando llamo a otra clases, es forzoso
saber patrones de diseño para tener una idea.
  #8 (permalink)  
Antiguo 06/08/2014, 01:44
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Esta forma de programar es correcta

Depende de lo quieras hacer, esto:
Código PHP:
Ver original
  1. class A
  2. {
  3.     function i()
  4.     {
  5.         return "Hola";
  6.     }
  7. }
  8. class B
  9. {
  10.     function v()
  11.     {
  12.         $f=new A();
  13.         return $f->i();
  14.     }
  15. }
  16.  
  17. $dd=new B();
  18. echo $dd->v();
Si lo haces porque lo que quieres es que un metodo de B se comporte como uno de A, esta mal.
Hay (a menos) tres alternativas:
1)
Código PHP:
Ver original
  1. class A
  2. {
  3.     function i()
  4.     {
  5.         return "Hola";
  6.     }
  7. }
  8.  
  9. $f=new A();
  10. echo $f->i();

2)
Código PHP:
Ver original
  1. class A
  2. {
  3.     function i()
  4.     {
  5.         return "Hola";
  6.     }
  7. }
  8. class B
  9. {
  10.     function v($f)
  11.     {
  12.         return $f->i();
  13.     }
  14. }
  15.  
  16. $dd=new B();
  17. $f=new A();
  18. echo $dd->v($f);

3)
Código PHP:
Ver original
  1. class A
  2. {
  3.     function i()
  4.     {
  5.         return "Hola";
  6.     }
  7. }
  8. class B extends A
  9. {
  10.     function v() // Metodo alias
  11.     {
  12.        return $this->i();
  13.     }
  14. }
  15.  
  16. $dd=new B();
  17. echo $dd->v();

Sin embargo, la tercer opcion es la mas peligrosa de todas, en el sentido de que solo debes extender una clase, si hay una relacion de Generalizacion entre ambas, por ejemplo, imaginate un Tablero y una Casilla, el tablero conoce a la casilla y la casilla conoce al tablero, pero la casilla no es una extencion del tablero, por lo tanto no lo hereda.

Código PHP:
Ver original
  1. class Tablero
  2. {
  3.     private $casillas = [];
  4.  
  5.     function setCasillaRoja($nro)
  6.     {
  7.         if(!isset($this->casillas[$nro]))
  8.             $this->casillas[$nro] = new Casilla();
  9.  
  10.         return $this->casillas[$nro]->setColor("Rojo");
  11.     }
  12. }
  13. class Casilla
  14. {
  15.     private $color;
  16.  
  17.     function setColor($color)
  18.     {
  19.          if($this->color == $color)
  20.             return "El color no cambio";
  21.          
  22.          $this->color = $color;
  23.          return "El color se cambio";
  24.     }
  25. }
  26.  
  27. $board=new Tablero();
  28. echo $board->setCasillaRoja(1);
  29. echo $board->setCasillaRoja(2);
  30. echo $board->setCasillaRoja(1);

Del codigo anterior la unica linea en discucion es:
Código PHP:
Ver original
  1. $this->casillas[$nro] = new Casilla();

Entonces hay que pensar en el contexto, la pregunta de oro es: ¿Para cuantas cosas quiero que me sirvan esta clases?

Las posibles respuestas son:

1) Solo para este juego en particular.
2) Para todos los juegos que se me ocurran con este tipo de tablero.
3) Para todos los juegos de tablero del mundo.

Si la respuesta es la 1 o la 2, entonces el codigo esta bien y no hay que cambiar nada.

Si la respuesta es la tercera, entonces estamos en un problema, porque no todos los juegos de tablero tienen las mismas casillas, hay que hacer uso del patron Factory o/y usar interfaces.

Los problemas no surgen cuando queres hacer andar algo, sino cuando queres que ese algo te sirva para todo, entonces tenes que hacer abstracciones, muchas y variadas (Eso son los patrones de diseño ni mas ni menos, tecnicas de abstraccion para diferentes problematicas).

Se dice comunmente que usar patrones y buscar siempre algoritmos que sirvan para todo (genericos) es mejor, sin embargo, esto muchas veces no es verdad, te doy un simple ejemplo: PDO.

Si usas PDO puedes usar cualquier motor de base de datos, pero las consultas demoran mas que con un controlador nativo, pretende que cambiando una linea de configuracion puedas pasar de una base de datos FireBird a SQlite sin nada mas, y sin embargo, tienes que reescribir todas las sentencias (o gran parte de ellas, volviendo al ejemplo, el tablero del Monopoly no es el mismo tablero que el del Ajedrez, sus casillas no son las mismas, ni siquiera se comportan igual, entonces ¿Tiene sentido implementar patrones, usar interfaces, traits y demas artilugios solo para tener una clase Tablero bien abstracta que sepa jugar al ajedrez y al monopoly?

Personalmente no le veo el sentido, prefiero que las clases se acoplen y funcionen rapido.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #9 (permalink)  
Antiguo 06/08/2014, 02:27
Avatar de jor_0203  
Fecha de Ingreso: octubre-2011
Ubicación: mexico
Mensajes: 760
Antigüedad: 12 años, 6 meses
Puntos: 8
Respuesta: Esta forma de programar es correcta

Cita:
Iniciado por NSD Ver Mensaje
Depende de lo quieras hacer, esto:
Código PHP:
Ver original
  1. class A
  2. {
  3.     function i()
  4.     {
  5.         return "Hola";
  6.     }
  7. }
  8. class B
  9. {
  10.     function v()
  11.     {
  12.         $f=new A();
  13.         return $f->i();
  14.     }
  15. }
  16.  
  17. $dd=new B();
  18. echo $dd->v();
Si lo haces porque lo que quieres es que un metodo de B se comporte como uno de A, esta mal.
Hay (a menos) tres alternativas:
1)
Código PHP:
Ver original
  1. class A
  2. {
  3.     function i()
  4.     {
  5.         return "Hola";
  6.     }
  7. }
  8.  
  9. $f=new A();
  10. echo $f->i();

2)
Código PHP:
Ver original
  1. class A
  2. {
  3.     function i()
  4.     {
  5.         return "Hola";
  6.     }
  7. }
  8. class B
  9. {
  10.     function v($f)
  11.     {
  12.         return $f->i();
  13.     }
  14. }
  15.  
  16. $dd=new B();
  17. $f=new A();
  18. echo $dd->v($f);

3)
Código PHP:
Ver original
  1. class A
  2. {
  3.     function i()
  4.     {
  5.         return "Hola";
  6.     }
  7. }
  8. class B extends A
  9. {
  10.     function v() // Metodo alias
  11.     {
  12.        return $this->i();
  13.     }
  14. }
  15.  
  16. $dd=new B();
  17. echo $dd->v();

Sin embargo, la tercer opcion es la mas peligrosa de todas, en el sentido de que solo debes extender una clase, si hay una relacion de Generalizacion entre ambas, por ejemplo, imaginate un Tablero y una Casilla, el tablero conoce a la casilla y la casilla conoce al tablero, pero la casilla no es una extencion del tablero, por lo tanto no lo hereda.

Código PHP:
Ver original
  1. class Tablero
  2. {
  3.     private $casillas = [];
  4.  
  5.     function setCasillaRoja($nro)
  6.     {
  7.         if(!isset($this->casillas[$nro]))
  8.             $this->casillas[$nro] = new Casilla();
  9.  
  10.         return $this->casillas[$nro]->setColor("Rojo");
  11.     }
  12. }
  13. class Casilla
  14. {
  15.     private $color;
  16.  
  17.     function setColor($color)
  18.     {
  19.          if($this->color == $color)
  20.             return "El color no cambio";
  21.          
  22.          $this->color = $color;
  23.          return "El color se cambio";
  24.     }
  25. }
  26.  
  27. $board=new Tablero();
  28. echo $board->setCasillaRoja(1);
  29. echo $board->setCasillaRoja(2);
  30. echo $board->setCasillaRoja(1);

Del codigo anterior la unica linea en discucion es:
Código PHP:
Ver original
  1. $this->casillas[$nro] = new Casilla();

Entonces hay que pensar en el contexto, la pregunta de oro es: ¿Para cuantas cosas quiero que me sirvan esta clases?

Las posibles respuestas son:

1) Solo para este juego en particular.
2) Para todos los juegos que se me ocurran con este tipo de tablero.
3) Para todos los juegos de tablero del mundo.

Si la respuesta es la 1 o la 2, entonces el codigo esta bien y no hay que cambiar nada.

Si la respuesta es la tercera, entonces estamos en un problema, porque no todos los juegos de tablero tienen las mismas casillas, hay que hacer uso del patron Factory o/y usar interfaces.

Los problemas no surgen cuando queres hacer andar algo, sino cuando queres que ese algo te sirva para todo, entonces tenes que hacer abstracciones, muchas y variadas (Eso son los patrones de diseño ni mas ni menos, tecnicas de abstraccion para diferentes problematicas).

Se dice comunmente que usar patrones y buscar siempre algoritmos que sirvan para todo (genericos) es mejor, sin embargo, esto muchas veces no es verdad, te doy un simple ejemplo: PDO.

Si usas PDO puedes usar cualquier motor de base de datos, pero las consultas demoran mas que con un controlador nativo, pretende que cambiando una linea de configuracion puedas pasar de una base de datos FireBird a SQlite sin nada mas, y sin embargo, tienes que reescribir todas las sentencias (o gran parte de ellas, volviendo al ejemplo, el tablero del Monopoly no es el mismo tablero que el del Ajedrez, sus casillas no son las mismas, ni siquiera se comportan igual, entonces ¿Tiene sentido implementar patrones, usar interfaces, traits y demas artilugios solo para tener una clase Tablero bien abstracta que sepa jugar al ajedrez y al monopoly?

Personalmente no le veo el sentido, prefiero que las clases se acoplen y funcionen rapido.
realmente que interesante explicación estoy analizando punto por punto de lo que dices, pero porque en java
en el enlace que esta en esta pagina hay gente que si lo hace, cual es el fin, porque lo hacen si esta mal.
es decir, porque instaciar adentro de una clase o la pregunta seria, como ocupar esto de instanciar adentro de una clase
para que esto sea valido

Última edición por jor_0203; 06/08/2014 a las 02:35
  #10 (permalink)  
Antiguo 06/08/2014, 09:48
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Esta forma de programar es correcta

Cita:
realmente que interesante explicación estoy analizando punto por punto de lo que dices, pero porque en java
en el enlace que esta en esta pagina hay gente que si lo hace, cual es el fin, porque lo hacen si esta mal.
es decir, porque instaciar adentro de una clase o la pregunta seria, como ocupar esto de instanciar adentro de una clase
para que esto sea valido
1) Java no es PHP. Java posee herramientas y características restrictivas propias de un lenguaje tipado, el programador Java piensa diferente del programador PHP, conceptos que en Java son vitales como el de getter y setter, en PHP son triviales(existe __get y __set), no deterministas (un objeto puede adquirir o perder propiedades dinamicamente) y permisivos (si intentas hacer uso de una propiedad privada funcionara igual que si fuera publica, solo emitira un pequeño warning que puede ser suprimido).
En Java un objeto es un Objeto, un array es un Array, un String es un String y un numero es un numero, en PHP un Objeto puede comportarse como un array, un Array puede comportrse como un objeto, los numeros y string pueden comportarse como objetos o arrays y un objeto o un array pueden comportarse como string o numeros. Muchas cosas que en java soy de uso cotidiano, no existen en php, o existen de forma mucho mas flexible, por ejemplo en php no existe la sobrecarga tipada como en java aunque se puede emular bastante bien, debes aprovechar esta flexibilidad del lenguaje siempre que sea posible

Son pocos los conceptos que se pueden portar de Java a PHP, y son menos aun los que se deben implementar de igual forma.

Respondiendo a tu pregunta, no esta mal que lo hagan asi, y tampoco esta bien, depende del contexto.

En respuestas anteriores te hablaron de acoplamiento y generalización, te dieron ejemplos y mencionaron patrones de diseño, esto esta muy bien, es la via correcta a caminar, pero, sin abusar.

No peques de perfeccionista, si vas a construir un tablero con casillas, asegurate de que sea suficientemente abstracto como para que te sirva para jugar al ajedrez, a las damas y al 3 en raya, para eso tendras que implementar algun patron como inyeccion de dependencias y factory, tal vez tambien quieras usar interfaces o traits(por lo explicdo en el punto 1, no soy partidario del uso de interfaces, pero hay pocos casos en los que son utiles en PHP) pero no quieras que te sirva tambien para jugar el Monopoly, a la oca o al pictograma.

Evita que las clases se acoplen, pero no mas de lo necesario, piensa siempre en la claridad del codigo y en la eficiencia, debes lograr el equilibrio entre ambos, y si para lograrlo las clases deben acoplarse, que lo hagan.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #11 (permalink)  
Antiguo 06/08/2014, 22:50
Avatar de jor_0203  
Fecha de Ingreso: octubre-2011
Ubicación: mexico
Mensajes: 760
Antigüedad: 12 años, 6 meses
Puntos: 8
Respuesta: Esta forma de programar es correcta

Cita:
Iniciado por NSD Ver Mensaje
1) Java no es PHP. Java posee herramientas y características restrictivas propias de un lenguaje tipado, el programador Java piensa diferente del programador PHP, conceptos que en Java son vitales como el de getter y setter, en PHP son triviales(existe __get y __set), no deterministas (un objeto puede adquirir o perder propiedades dinamicamente) y permisivos (si intentas hacer uso de una propiedad privada funcionara igual que si fuera publica, solo emitira un pequeño warning que puede ser suprimido).
En Java un objeto es un Objeto, un array es un Array, un String es un String y un numero es un numero, en PHP un Objeto puede comportarse como un array, un Array puede comportrse como un objeto, los numeros y string pueden comportarse como objetos o arrays y un objeto o un array pueden comportarse como string o numeros. Muchas cosas que en java soy de uso cotidiano, no existen en php, o existen de forma mucho mas flexible, por ejemplo en php no existe la sobrecarga tipada como en java aunque se puede emular bastante bien, debes aprovechar esta flexibilidad del lenguaje siempre que sea posible

Son pocos los conceptos que se pueden portar de Java a PHP, y son menos aun los que se deben implementar de igual forma.

Respondiendo a tu pregunta, no esta mal que lo hagan asi, y tampoco esta bien, depende del contexto.

En respuestas anteriores te hablaron de acoplamiento y generalización, te dieron ejemplos y mencionaron patrones de diseño, esto esta muy bien, es la via correcta a caminar, pero, sin abusar.

No peques de perfeccionista, si vas a construir un tablero con casillas, asegurate de que sea suficientemente abstracto como para que te sirva para jugar al ajedrez, a las damas y al 3 en raya, para eso tendras que implementar algun patron como inyeccion de dependencias y factory, tal vez tambien quieras usar interfaces o traits(por lo explicdo en el punto 1, no soy partidario del uso de interfaces, pero hay pocos casos en los que son utiles en PHP) pero no quieras que te sirva tambien para jugar el Monopoly, a la oca o al pictograma.

Evita que las clases se acoplen, pero no mas de lo necesario, piensa siempre en la claridad del codigo y en la eficiencia, debes lograr el equilibrio entre ambos, y si para lograrlo las clases deben acoplarse, que lo hagan.
mil gracias que genial comentario
eres un dios en la programación

Etiquetas: correcta, forma
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:38.