Foros del Web » Programación para mayores de 30 ;) » Programación General »

¿Es correcto este RETURN?

Estas en el tema de ¿Es correcto este RETURN? en el foro de Programación General en Foros del Web. Hola gentes!! Pongámonos en la siguiente situación (da lo mismo el lenguaje utilizado). Código: objeto = Algo("pepe"); function Algo(nombre){ objeto = document.getElementById('nombre'); if(objeto) return objeto; ...
  #1 (permalink)  
Antiguo 14/12/2005, 13:48
 
Fecha de Ingreso: diciembre-2003
Mensajes: 1.583
Antigüedad: 20 años, 11 meses
Puntos: 13
¿Es correcto este RETURN?

Hola gentes!!

Pongámonos en la siguiente situación (da lo mismo el lenguaje utilizado).

Código:
objeto = Algo("pepe");

function Algo(nombre){
   objeto = document.getElementById('nombre');
   if(objeto)
      return objeto;
   else
      return false;
}
¿Es incohrente que la función devuelva un valor del tipo object si se cumple la condición, o un valor del tipo boolean si no se cumple? ¿O es más coherente que en ambos casos devuelva un valor booleano (true/false)?
__________________
El conocimiento es libre: Movimiento por la Devolución
  #2 (permalink)  
Antiguo 14/12/2005, 14:26
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Exclamación

Cita:
Iniciado por frijolerou
Hola gentes!!

Pongámonos en la siguiente situación (da lo mismo el lenguaje utilizado).

Código:
objeto = Algo("pepe");
 
function Algo(nombre){
   objeto = document.getElementById('nombre');
   if(objeto)
      return objeto;
   else
      return false;
}
¿Es incohrente que la función devuelva un valor del tipo object si se cumple la condición, o un valor del tipo boolean si no se cumple? ¿O es más coherente que en ambos casos devuelva un valor booleano (true/false)?
Creo q' es más coherente q' en los 2 casos sea un mismo tipo de valor, ya q' la variable en la q' vas a devolver no puede ser de dos tipos al mismo tiempo...
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 14/12/2005, 14:28
 
Fecha de Ingreso: junio-2005
Ubicación: México, México
Mensajes: 429
Antigüedad: 19 años, 5 meses
Puntos: 1
Pues mira mas o menos viendo lo que estas haciendo depende mucho del lenguaje usado. Por lo que veo es JavaScript. Ahi no importa que tipo de objeto devuelve la funcion... Pero por ejemplo, si utilizas C/C++ realmente sí importa y mucho el tipo de objeto devuelto, ya que al declarar y definir la funcion tienes que indicar el tipo de dato de retorno. A diferencia de JavaScript no importa que tipo de dato se regrese en la funcion...
  #4 (permalink)  
Antiguo 14/12/2005, 15:13
 
Fecha de Ingreso: abril-2004
Mensajes: 317
Antigüedad: 20 años, 7 meses
Puntos: 0
Cita:
Iniciado por scrolling
Pues mira mas o menos viendo lo que estas haciendo depende mucho del lenguaje usado. Por lo que veo es JavaScript. Ahi no importa que tipo de objeto devuelve la funcion... Pero por ejemplo, si utilizas C/C++ realmente sí importa y mucho el tipo de objeto devuelto, ya que al declarar y definir la funcion tienes que indicar el tipo de dato de retorno. A diferencia de JavaScript no importa que tipo de dato se regrese en la funcion...
Exacto, en lenguajes fuertemente tipificados esto no posible.
  #5 (permalink)  
Antiguo 15/12/2005, 01:46
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Por supuesto que si es posible señores, solo que hay que saber como hacerlo. Aca les dejo un ejemplo (no tengan en cuenta errores tontos ya que lo hice muy apurado sino el concepto):

Código:
#include <windows.h>
#include <stdio.h>

class Persona
{
  public:
   Persona() 
   { 
     ZeroMemory(perName, 256);
     perAge = 0;
   }
   
   void setData(char *name, int age)
   {
     strcpy(perName, name);
     perAge = age; 
   }
   
   void printData()
   {
     printf("Nombre: %s Edad: %d\r\n", perName, perAge); 
   }
   
   char *getName() { return perName; }
  private:
    char perName[256];
    int perAge;
};

Persona personas[120];

Persona *Algo(char *Search) 
{
  for (int x = 0; x < 120; x++)
  {
    if (!strcmp(Search, personas[x].getName()))
    {
      return &personas[x];
    }
  }
  return 0;
}

void main()
{
  personas[0].setData("Juan", 50);
  personas[1].setData("Carlos", 51);
  personas[2].setData("Hector", 52);
  Persona *Busca = Algo("Fulgencio");
  if (Busca) { Busca->printData(); }
  Busca = Algo("Carlos");
  if (Busca) { Busca->printData(); }
}
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #6 (permalink)  
Antiguo 15/12/2005, 06:07
 
Fecha de Ingreso: febrero-2005
Mensajes: 396
Antigüedad: 19 años, 9 meses
Puntos: 1
A ver... respecto al último post, en realidad estás haciendo "trampa". Estas devolviendo punteros (que no son objetos en si) y devuelves un 0, que en realidad es un puntero como otro cualquiera. Dado que C es un chapuzas con los castings y tipos, 0 es considerado también como un valor "false" cuando se hacen comparaciones...

Pero en realidad no estás devolviendo objetos distintos.

Respecto a la pregunta original... es que eso de "independientemente del lenguaje" es el punto fuerte de tu pregunta... hay lenguajes que permiten que devuelvas lo que te de la gana, y luego tu apañatelas como puedas cuando leas el resultado de la llamada. Por ejemplo, en php puedes devolver lo que quieras y luego tienes que hilar fino a ver que comparación usas si quieres saber que se ha devuelto realmente. Y eso es fuente de muchos errores y chapuzas, para que engañarnos.

El caso de javascript es que es un lenguaje especialmente chapucero. Precisamente este tipo de cosas son las que hacen que mantener un pequeño codigo en javascript sea una pesadilla.


Hay muchos lenguajes que directamente no te permiten hacer eso (como por ejemplo java). Sin embargo, para suplir la posible potencialidad de este tipo de comportamientos se suelen ofrecer herramientas(como la herencia) para poder devolver tipos distintos (aunque emparentados).

Un saludo

Zerjillo
  #7 (permalink)  
Antiguo 15/12/2005, 08:20
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Cita:
Iniciado por Zerjillo
A ver... respecto al último post, en realidad estás haciendo "trampa". Estas devolviendo punteros (que no son objetos en si) y devuelves un 0, que en realidad es un puntero como otro cualquiera. Dado que C es un chapuzas con los castings y tipos, 0 es considerado también como un valor "false" cuando se hacen comparaciones...
Yo no estoy haciendo ninguna trampa, devuelvo un puntero a un objeto o devuelvo un puntero nulo.

Cita:
Iniciado por frijolerou
"¿Es incohrente que la función devuelva un valor del tipo object si se cumple la condición, o un valor del tipo boolean si no se cumple? ¿O es más coherente que en ambos casos devuelva un valor booleano (true/false)?"
El post no habla de objetos, ni punteros, ni referencias ni nada, incluso habla de otro lenguaje por lo tanto considero mi solucion absolutamente correcta.

¿Te quedas mas tranquilo si pongo una comparacion que no sea con ! sino con == 0? Asi no hacemos "trampa" con castings pero en realidad es exactamente lo mismo y se puede devolver el valor de una funcion con lo que quieras, es un registro (eax).

Ya nos contaras donde estan los objetos que devolves ademas de en la memoria ... espero que no devuelvas objetos por valor.

Cita:
Iniciado por Zerjillo
Pero en realidad no estás devolviendo objetos distintos.
¿Que pretendias devolver un objeto false? Eso no tiene ninguna utilidad real en el problema, yo devuelvo el objeto encontrado o 0 que marca la inexistencia del mismo.

Cita:
Iniciado por Zerjillo
Por ejemplo, en php puedes devolver lo que quieras y luego tienes que hilar fino a ver que comparación usas si quieres saber que se ha devuelto realmente. Y eso es fuente de muchos errores y chapuzas, para que engañarnos.
Para que engañarnos si como dije antes el resultado de una funcion se pasa en un registro del microprocesador, veamos el standard C y su funcion strstr, gran "chapuza" a tu juicio me imagino.
Bueno, no estoy para nada de acuerdo con que la solucion que comente sea una chapuza y tampoco strstr, es perfectamente valida porque solo necesitamos saber si devolvio un puntero al objeto o no. No hay ningun tipo de confusion con, valga la redundancia, los tipos.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #8 (permalink)  
Antiguo 15/12/2005, 14:39
 
Fecha de Ingreso: junio-2005
Ubicación: México, México
Mensajes: 429
Antigüedad: 19 años, 5 meses
Puntos: 1
Yo opino que lo que estuvo mal fue la pregunta original. Ya que el queria una respuesta independientemente del lenguaje usado, sin tomar en cuanta que habria algunos en los que sí era valido su return y en otros no...Yo tambien iba a responder refiriendome a las clases en C++, pero como el usuario solo preguntaba sobre SU return, pues solo le aclare eso, porque podria haber confusiones como la que hay ahorita aqui
  #9 (permalink)  
Antiguo 15/12/2005, 14:56
 
Fecha de Ingreso: diciembre-2003
Mensajes: 1.583
Antigüedad: 20 años, 11 meses
Puntos: 13
Gracias por sus respuestas:

Tiene razón scrolling, tal vez debí plantear la pregunta de una manera más concreta.

Al hablar de "independiente del lenguaje utilizado" quería dejar de la lado el tema de si estaba bien o mal desde el punto de vista de la sintaxis, ya que consideré probable que en algunos lenguajes no se podría modificar el tipo de dato de una variable.

mi pregunta iba enfocada más hacia un punto de vista "semántico" (si es que se puede llamar de esa manera). Y en ese aspecto Zerijillo acertó más o menos en lo que yo no me supe explicar:

Cita:
Iniciado por Zerijillo
hay lenguajes que permiten que devuelvas lo que te de la gana, y luego tu apañatelas como puedas cuando leas el resultado de la llamada. Por ejemplo, en php puedes devolver lo que quieras y luego tienes que hilar fino a ver que comparación usas si quieres saber que se ha devuelto realmente. Y eso es fuente de muchos errores y chapuzas, para que engañarnos.

El caso de javascript es que es un lenguaje especialmente chapucero. Precisamente este tipo de cosas son las que hacen que mantener un pequeño codigo en javascript sea una pesadilla.

Amigo Eternal, lo que trato de hacer es algo como esto:

Código:
function Algo(nombre){
    objeto = document.getelementById(nombre);
    if(objeto)
        return objeto;
    else
        return false;
}

objeto = Algo("pepe");
if(objeto){
    // Hacer algo con "objeto"
}
__________________
El conocimiento es libre: Movimiento por la Devolución
  #10 (permalink)  
Antiguo 15/12/2005, 15:32
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Cita:
Iniciado por frijolerou
Amigo Eternal, lo que trato de hacer es algo como esto
Eso es lo que hace mi codigo, devolver un puntero a un objeto o false (0) y despues comprobar que no sea false (0) para proceder a trabajar con ese puntero.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #11 (permalink)  
Antiguo 15/12/2005, 15:39
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Otra forma de hacerlo seria asi (siempre devolviendo true o false):

Código:
BOOL Algo(char *Search, Persona **ret) 
{
  for (int x = 0; x < 120; x++)
  {
    if (!strcmp(Search, personas[x].getName()))
    {
      *ret = &personas[x];
      return 1;
    }
  }
  return 0;
}

  Persona *Busca = 0;
  if (Algo("Fulgencio", &Busca))
  {
  Busca->printData();
  }
  if (Algo("Carlos", &Busca))
  {
     Busca->printData();
  }
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #12 (permalink)  
Antiguo 16/12/2005, 12:32
 
Fecha de Ingreso: junio-2005
Ubicación: México, México
Mensajes: 429
Antigüedad: 19 años, 5 meses
Puntos: 1
No es por meterme en esto y causar discusiones, pero la pregunta original no se refiere ni a C ni a C++, incluso el codigo esta en JavaScript... Asi que creo que aunque muestres que en C y en C++ se puede hacer, la pregunta original no iba hacia ese lado. La pregunta era mas general hacia los lenguajes no hacia como se puede lograr eso en uno determinado...
  #13 (permalink)  
Antiguo 16/12/2005, 13:32
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Cita:
Iniciado por scrolling
No es por meterme en esto y causar discusiones, pero la pregunta original no se refiere ni a C ni a C++, incluso el codigo esta en JavaScript... Asi que creo que aunque muestres que en C y en C++ se puede hacer, la pregunta original no iba hacia ese lado. La pregunta era mas general hacia los lenguajes no hacia como se puede lograr eso en uno determinado...
Si, el codigo esta en JavaScript pero hay una aclaracion que dice: "da lo mismo el lenguaje utilizado" entonces mostre una forma de hacerlo, valida a mi parecer, en un lenguaje que se dijo era imposible hacerlo.
Y en cuanto a lo general la forma de hacerlo me parece la ultima que mostre, devolver true o false (0 o 1) y mediante una referencia (o doble puntero) devolver el puntero al objeto.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #14 (permalink)  
Antiguo 16/12/2005, 13:57
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Exclamación

Bueno, vale lo q' dijo Eternal de q' es posible devolver punteros de memoria y demás no, pero lo q' realmente preguntó fue si era válido el Return expuesto en el primer Mensaje, y bueno, como ya llegamos a la conclusión de q' si hecho en JavaScript era posible y si en otros lenguajes (C/C++), pues no y ya nos dejamos de discusiones infundadas...
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #15 (permalink)  
Antiguo 16/12/2005, 19:11
Usuario baneado!
 
Fecha de Ingreso: febrero-2005
Mensajes: 116
Antigüedad: 19 años, 9 meses
Puntos: 0
Cita:
Iniciado por Zerjillo
Dado que C es un chapuzas con los castings y tipos, 0 es considerado también como un valor "false" cuando se hacen comparaciones...
Si te refieres a C++ (supongo), lo que dices es una autentica estupidez.

¿C++ desastroso con los castings? ¡¡Pero si tienes de varios tipos para determinar a la exactitud que quieres hacer!!

¿Tipos? ¡¡Pero si es fuertemente tipado!!

¿0 == false? No. En C++ el bool es un tipo implementado por el compilador, no un simple #define. En C, ahora también (último estándar).
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 23:08.