Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-03-2013
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Poder: 23
ozsWizzard Va por buen camino
Cita:
Empezado por Neftali Ver Mensaje
Creo que alguien ha comentado el CreateOrNil. No suena muy bien, pero es descriptivo 100%. Recordemos que Delphi ya cuenta con un FreeAndNil.
Es por si ya te estabas decidiendo... Para que tengas un poco más de dudas...
He sido yo

Tampoco ha puesto el nombre que sugerí de "Instanciar", no le habrá gustado, jeje.

Por otra parte, con la forma en la que crea los objetos, este trozo de código que ha puesto Al, petaría (daría una excepción):

Código Delphi [-]
procedure TForm1.FormDestroy(Sender: TObject);
begin
  XFile1.Free;
  XFile2.Free;
  XFile3.Free;
end;
__________________
La Madurez se llama...
~~~Gaia~~~
Responder Con Cita
  #2  
Antiguo 07-03-2013
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 27
Delphius Va camino a la fama
Cita:
Empezado por ozsWizzard Ver Mensaje

Por otra parte, con la forma en la que crea los objetos, este trozo de código que ha puesto Al, petaría (daría una excepción):

Código Delphi [-]
procedure TForm1.FormDestroy(Sender: TObject);
begin
  XFile1.Free;
  XFile2.Free;
  XFile3.Free;
end;
¿Donde está el problema? Free es un método seguro. Si las instancias XFile1, XFile2 y XFile3 no fueran válidas (nil) Free lo detectará y no intentará liberar algo que ya fue liberado o bien nunca fue creado.

Un objeto se crea totalmente o no se crea nada. No hay términos medios.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 07-03-2013
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Poder: 23
ozsWizzard Va por buen camino
Tienes, razón, cuando es nil no peta, sorry.

Entonces me he molestado en hacer una Liberar que no sirve pa na...

Ahora, si se intenta liberar algo que nunca se creó pero que no está iniciado a nil, sí que peta. Lo siguiente peta.

Código Delphi [-]
procedure TFrmPruebas.Button1Click(Sender: TObject);
var
   q: TSqlQuery;
begin
   q.Free;
end;
__________________
La Madurez se llama...
~~~Gaia~~~

Última edición por ozsWizzard fecha: 07-03-2013 a las 15:23:40.
Responder Con Cita
  #4  
Antiguo 07-03-2013
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.141
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Me surgen muchas dudas con este asunto. Dudas que no van a ningún sitio, avisados quedáis. Al cabo de darle algunas vueltas me pregunto, ¿puede un objeto ser "nil"? Y me respondo: tal vez sí, cuando busquemos un objeto que puede o no haber sido creado, pero, no, si de lo que se trata es de crear dicho objeto. Es decir, yo veo el siguiente código "válido" y de hecho he escrito mucho código de esta forma:

Código Delphi [-]
var
  module : TMyModule;
begin
  module := MyModules.GetModule( 123 );  

  if module <> nil then
  begin
    // Module is a valid object for us
  end
  else
  begin
    // We can't found a module with ID 123
  end;
end;

En el código de arriba, puesto que no estamos creando un objeto sino tratando de asignar uno (posiblemente) existente, creo que el "nil" tiene toda la lógica, puesto que el método "GetModule" retornará "nil" si no puede encontrar un objeto o el objeto mismo.

Ahora bien, si de lo que se trata es de saber si un objeto se puede crear, correctamente, en base a ciertos argumentos, entonces yo escribiría un código similar a este:

Código Delphi [-]
var
  params : string;
  module : TMyModule;
begin
  params := 'My params';

  module := TModule.Create( params );

  if module.HasValidParams() then
  begin
    // We have a valid object here, with the right params
  end
  else
  begin
    // We have a valid object here, but with wrong params
  end;
end;

¿Se entiende por dónde voy? Nosotros pasamos los parámetros conque contemos (tal vez sean válidos, tal vez no lo sean) al constructor de nuestro objeto, y, este, por ejemplo, proporciona un método "HasValidParams", que, podremos usar para comprobar si el objeto de hecho se ha creado en condiciones... con los parámetros correctos.

De esta forma nos olvidamos del "nil", nos olvidamos con un método de clase que nos retorne una instancia del objeto mediante ciertos parámetros (¿podré usar el constructor sin parámetros o los necesitaré también?) y es el propio objeto, conocedor de los parámetros que necesita, quien nos dirá si está listo para usarse o no.

¿Cómo lo veis?
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 07-03-2013
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 27
Delphius Va camino a la fama
Muy bien dicho David, has ido a lo que yo quería hacer llamar la atención. Como tu has dicho:

Cita:
creo que el "nil" tiene toda la lógica,
Y yo por algo había comentado antes:

Cita:
Ahora bien, si en verdad nil es un resultado realmente válido (tiene un significado real y está aceptado en el contexto)
Al, es primordial entender ¿que significa para ti que el objeto sea nil? ¿Tiene algún propósito?

Porque como lo ha dejado en claro en el ejemplo David, si la idea es garantizar o evaluar si hay cierta consistencia, quien tiene la información para hacerlo es el creador o el objeto en si mismo. Esto conduce a que para hacer algo entonces se puede disponer de un método que lo compruebe, y ahora si ya en base a estos resultados decidir que o no hacer.

Y como dije antes, si nil no es una opción a considerar sino una situación fuera de lo esperado los lineamientos de la OO indican que lo sano es elevar excepción.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 07-03-2013
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.141
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Cita:
Empezado por Delphius Ver Mensaje
Muy bien dicho David, has ido a lo que yo quería hacer llamar la atención. Como tu has dicho:



Y yo por algo había comentado antes:



Al, es primordial entender ¿que significa para ti que el objeto sea nil? ¿Tiene algún propósito?

Porque como lo ha dejado en claro en el ejemplo David, si la idea es garantizar o evaluar si hay cierta consistencia, quien tiene la información para hacerlo es el creador o el objeto en si mismo. Esto conduce a que para hacer algo entonces se puede disponer de un método que lo compruebe, y ahora si ya en base a estos resultados decidir que o no hacer.

Y como dije antes, si nil no es una opción a considerar sino una situación fuera de lo esperado los lineamientos de la OO indican que lo sano es elevar excepción.

Saludos,
Yo apunté también lo propio (lo siento Delphius, no leí tus anteriores mensaje), pero, ¿serviría de algo lanzar la excepción en el constructor del objeto? Me refiero a si tiene sentido en el contexto en que nuestro amigo Al trabaja. Además no me queda muy claro el uso de excepciones tal que así:

Código Delphi [-]
try
  obj := TMyObject.Create();
except
  on E : Exception do
  begin
    // Manejamos la excepción, pero,...
  end;

  // ¿qué pasa con el código situado aquí debajo?

end;
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Encontrar objeto por su nombre, encontrar metodo, ejecutar metodo coso Trucos 7 02-09-2011 00:23:13
Cambiar el nombre de la clase. rauros Varios 2 02-08-2008 20:56:44
Crear formularios a partir de su nombre de clase kes .NET 6 21-02-2008 08:06:07
Crear Objeto por su nombre de clase jlrbotella OOP 2 08-01-2008 23:44:37
nombre de variables de una clase Mariana OOP 8 25-10-2005 17:48:34


La franja horaria es GMT +2. Ahora son las 12:10:46.


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