PDA

Ver la Versión Completa : Retornar o no retornar desde un script principal


dec
23-03-2008, 08:56:31
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()" (http://us.php.net/manual/es/function.return.php), 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í:


<?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?


<?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
¿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?


<?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:


<?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:


<?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...


<?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:



<?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,


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. ;)