Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PHP (https://www.clubdelphi.com/foros/forumdisplay.php?f=15)
-   -   Retornar o no retornar desde un script principal (https://www.clubdelphi.com/foros/showthread.php?t=54556)

dec 23-03-2008 08:56:31

Retornar o no retornar desde un script principal
 
Hola,

¿Cómo va eso? Espero que bien. Pues aquí, que me ha surgido una duda, a ver si alguien podría ayudarme con ella. Si uno echa un vistazo al manual de PHP sobre "return()", puede que le pase lo que a mí, que no termina de verlo claro del todo, para según qué casos. Si te parece, pondré un ejemplo. Y nota que es un ejemplo "real", que estoy usando ahora mismo en cierto proyecto.

Imagina que existe un "script" "principal" (no requerido ni incluido, sino "solicitado", desde donde se incluyen y requieren otros "scripts"), digo, tal que así:

Código PHP:

<?php

require('gb-init.php');
$gbfe = new FrontEnd();

?>

Efectivamente, son dos líneas nada más. Primero se requieren ciertos archivos, y luego se crea una instancia del objeto "FrontEnd", como puede verse. No hay más. Puesto que nada más es necesario. Ahora bien, si concluimos que no hay más, ¿qué tal parecería este cambio?

Código PHP:

<?php

require('gb-init.php');
 return new 
FrontEnd();

?>

Aparentemente, todo va bien. No noto mejora en el proceso del "script", pero, la "idea" en este segundo caso, es que, ya que no vamos a utilizar la variable "$gbfe", ¿para qué guardar una instancia del objeto en la misma? ¿No sería, sino más rápido, más elegante, más correcto, mejor, retornar directamente la instancia de dicho objeto?

Ahora bien. Téngase en cuenta que la clase "FrontEnd()" se encarga, a partir de su constructor, de hacer lo que es menester hacer. De hecho, como digo, en ambos casos expuestos arriba el programa se comporta como se espera, al menos en las pocas pruebas que he hecho, lo reconozco. Pero, ¿qué implicaciones tienen la primera solución y la segunda? ¿Cómo lo veis vosotros?

Y nada más. Eso es lo que quería preguntaros, puesto que me ha surgido la duda, y pienso que tal vez podáis ayudarme. Así que gracias de antemano pataliebres, ¡y cuidado con las procesiones! ;)

dec 24-03-2008 16:13:58

Hola,

Pues nada. Aparte de dar un empujón a este hilo, quería decir que he optado por la segunda "solución", puesto que me parece la más acertada. No obstante sigue sin quedarme claro... ;)

keyboy 24-03-2008 21:47:31

Cita:

Empezado por dec
¿para qué guardar una instancia del objeto en la misma? ¿No sería, sino más rápido, más elegante, más correcto, mejor, retornar directamente la instancia de dicho objeto?

En mi opinión, cualquiera de las dos opciones es extraña. En la primera asignas el objeto creado a una variable que no se utiliza nunca, y en la segunda regresas el objeto creado, sí, pero ¿a quién? Realmente se va al limbo ¿no? Entonces, ¿por qué no simplemente poner?

Código PHP:

<?php
require('gb-init.php');
new 
FrontEnd();
?>

Porque en el fondo lo que hay es un objeto que nunca se utiliza.

Obviamente es poco lo que se puede decir a partir de un par de líneas sin conocer con más detalle lo que hace tu clase, pero a ojo de cubero (conste que no digo buen cubero) más bien da la impresión de que el constructor de la clase hace demasiadas cosas. Supongo que se encarga de preparar toda la página y mostrarla, pero en tal caso, quizá sería más adecuado separar la preparación de la visualización:

Código PHP:

<?php
require('gb-init.php');
$gbfe = new FrontEnd();
$gbfe->show();
?>

Pero, como digo, hablo en el aire. A fin de cuentas tampoco se trata de agregar un método tan sólo para justificar una variable. Quizá lo que está extraño es la clase en sí, pues podrías tener algo como:

Código PHP:

<?php
require('gb-init.php');
frontEnd();
?>

esto es, si lo único que usas de la clase (al menos externamente) es su constructor, ¿para qué tener una clase? ¿Porqué no convertir ese constructor en una función llana?

En fin, es sólo para que lo consideres.

Bye

dec 24-03-2008 22:06:48

Hola,

Gracias por tu respuesta keyboy. Lo que creo que voy a considerar es hacer de la clase "FrontEnd" una clase estática. De este modo podría hacerse algo como esto, muy cerca de la "función que tú dices", lejos de retornar nada, ni variable, ni objeto ni nada...

Código PHP:

<?php
require('gb-init.php');
FrontEnd::Response();
?>

Algo así creo que puede resultar curioso, y, desde luego, no se me hubiera ocurrido sino respondes keyboy. Efectivamente, un "script" puede retornar un valor, pero, en este caso no se utiliza. Lo de la variable lo descarto, de hecho ya está descartado, lo del "new FrontEnd()" tampoco me convence del todo. Y lo de la función,... bueno, me quedo en este caso con algo muy parecido: un método estático de la clase "FrontEnd()".

Pero sigo abierto a sugerencias. ¡Gracias otra vez keyboy! ;)

dec 24-03-2008 22:25:22

Hola,

Otra vez yo... dos cosas. Primero, que el asunto queda así, de momento:

Código PHP:


<?php

require('gb-init.php');
FrontEnd::DoResponse();

?>

Y la segunda, que, si quieres, keyboy (y quien quiera también) puedes echar un vistazo al proyecto en cuestión, ya digo, si te apetece, únicamente, puedes descargarlo desde aquí:

http://www.gesbit.com/download.php

Nota: Enlazo a la página de descargas, porque, el archivo se compone de la fecha actual, para evitar que el enlace quede "obsoleto", puesto que hago cambios prácticamente todos los días.

Nota 2: Creo que la solución de llamar a un método estático de la clase "FrontEnd", más aún, de hacer esta clase estática, ha sido una estupenda idea, gracias a ti keyboy, ya digo, puesto que, al fin y al cabo, no se precisa ninguna instancia de la clase "FrontEnd", ni en una variable, ni como resultado, ni se referencia a ella de ningún modo. Otra vez gracias. ;)

lucasarts_18 24-03-2008 23:11:25

Hola Dec:

Pues bien, pues los métodos estaticos se crearon precisamente para hacer uso de objetos no instanciados, en este caso no instanciar la clase y lanzarse directo a usar el método en cuestión.

Por otra parte ponerlo en una función no me parece lo más adecuado si tratas de mantener todo tu sistema POO.

Me quedo con la opción de que sea una clase con un método estático. Por cierto creo que la clase también debería ser estática.

Vamos, que no soy un experto....:p, faltaría la opinión de Román :D

EDITO: No había leído tu último Post DEC... :P

Saludos .-

dec 24-03-2008 23:41:12

Hola,

Cita:

Empezado por Lucas
Me quedo con la opción de que sea una clase con un método estático. Por cierto creo que la clase también debería ser estática.

Yo también me quedo con esa opción, solución, o como quiera llamarse. Al menos hasta que se me convenza de otra cosa. ;) Por otro lado, la clase no tiene que ser estática, si no me equivoco, siempre que desde el método estático no se haga referencia a la instancia de la misma, pues no estaría ahí disponible. En el caso del proyecto de que se trata aquí, efectivamente, la clase queda estática, con todos sus miembros estáticos, aunque todos ellos privados, menos uno, precisamente, el que se ve que uso arriba. :)

Gracias Lucas por tu respuesta. ;)


La franja horaria es GMT +2. Ahora son las 17:05:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi