Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 12-11-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por Al González Ver Mensaje
En Delphi es de lo más seguro, Donald.

Cuando el objeto es Nil y el método Free hace esta validación:

Código Delphi [-]if Self <> nil then

,

está preguntando si Nil es diferente de Nil, en cuyo caso llama a Destroy. De lo contrario no hace absolutamente nada. Si Free fuese un método virtual o hiciera alguna otra cosa con la "improbable" instancia, entonces sí sería inadecuado usarlo en esos casos.

Self es un parámetro implícito que llevan todos los métodos y equivale al puntero en sí de la instancia en cuestión. Nil, cuando el puntero está en blanco. No hay absolutamente ningún problema.

¿Ya convencido?
La verdad con tu explicación para nada ya que no me contas nada nuevo.
Estas explicándome que hace el código y que es self .
Lo que quiero saber es porque razón un puntero a la nada (nil) es seguro.

Saludos.
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal
Responder Con Cita
  #22  
Antiguo 12-11-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
De hecho (aunque no lo voy a jurar ) esto es seguro:

Código Delphi [-]
type
  TPersona = class
    procedure Saluda;
  end;

procedure TPersona.Saluda;
begin
  ShowMessage('Hola');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Persona: TPersona;

begin
  // No construyo el objeto
  Persona.Saluda;
end;

// Saludos
Responder Con Cita
  #23  
Antiguo 12-11-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por roman Ver Mensaje
A ver, borrón y cuenta nueva.

Creo que ya veo por donde va la preocupación de Donald. A él no le inquieta la llamada a Destroy, sino la misma llamada a nil.Free.
Exacto.

Cita:
Empezado por roman Ver Mensaje
Pero creo que hay que recordar que un objeto no es un record. ¿Qué pasa cuando se llama nil.Free? El compilador genera esta llamada:

Código:
mov eax, [eax + ...]
call TObject.Free
Esto es, la función que se llama es TObject.Free que vive en algún lugar de la tabla de métodos de la clase (no el objeto) TObject. Aquí no hay problema entonces, porque TObject existe independientemente de sus instancias. Y a Free se le pasa el parámetro Self que menciona Al, que es la instancia a la que se le aplica el método. Y es ya Free el que protege la llamada al destructor.

// Saludos
Tenes razón, aunque a simple vista parezca voladura.

Para agregar a la charla y enriquecerla , un post sobre los efectos colaterales de la forma en que esta implementado, sobre todo cuando usas tareas:

link

Saludos.
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal
Responder Con Cita
  #24  
Antiguo 12-11-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por roman Ver Mensaje
De hecho (aunque no lo voy a jurar ) esto es seguro:

Código Delphi [-]type TPersona = class procedure Saluda; end; procedure TPersona.Saluda; begin ShowMessage('Hola'); end; procedure TForm1.Button1Click(Sender: TObject); var Persona: TPersona; begin // No construyo el objeto Persona.Saluda; end;


// Saludos
Jeje, hasta que deje de serlo.

FPC se queja con ese código, por lo tanto prefiero escribir código seguro que experimenta con lo que se banca la VCL.

Saludos
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal
Responder Con Cita
  #25  
Antiguo 12-11-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por donald shimoda
prefiero escribir código seguro
Nosotros también, pero también preferimos no redundar. No hace falta evitar el caso nil por lo que expliqué arriba.

En el ejemplo anterior, la llamada Persona.Saluda realmente genera este código:

Código:
call TPersona.Saluda
Se llama a una función que existe, no hay una referencia a una memoria inválida.

Si tuviéramos

Código Delphi [-]
type
  TPersona = class
    Saludo: String;
    procedure Saluda;
  end;

procedure TPersona.Saluda;
begin
  ShowMessage(Saludo);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Persona: TPersona;

begin
  // No construyo el objeto
  Persona.Saluda;
end;

entonces sí que habría problemas, porque no ha sido asignada memoria a ningún objeto y por tanto el campo Persona.Saludo no existe aún.

// Saludos
Responder Con Cita
  #26  
Antiguo 12-11-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
... me están estressanndo



Sal%&(/% Invalid pointer operation.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #27  
Antiguo 12-11-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Por eso lo tengo comentado:

// Saludos

no vaya a ser...

// Saludos
Responder Con Cita
  #28  
Antiguo 12-11-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Al igual que lepe me dejaron frito el cerebro.

Leí el link que señala Donald y la verdad es que no lo entendí ¿Dónde está el problema?

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #29  
Antiguo 12-11-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por donald shimoda Ver Mensaje
...Lo que quiero saber es porque razón un puntero a la nada (nil) es seguro...
Ya, ahora veo, al igual que Román, que lo que te preocupa es en sí el uso de una falsa instancia cuando su apuntador es Nil.

Tratándose de objetos, debes recordar que el código compilado de las rutinas (métodos) se guarda en ubicaciones de memoria distintas a donde se alojan los campos de datos de una instancia. De hecho, por dentro, el bloque de memoria que ocupa una instancia de objeto es meramente una "estructura" del estilo Record, teniendo un primer "campo" invisible que guarda un apuntador a donde se encuentra definida la clase a la que pertenece, su herencia, métodos y otros elementos de RTTI.

El código compilado está disponible para el programa desde que arranca la aplicación, así que los métodos que el compilador incluyó en el programa ejecutable pueden (mas no necesariamente "deben") ser llamados sin necesidad de usar una instancia real de por medio, como bien lo ejemplificó Román más arriba.

Lo inseguro es hacer esto con un método que emplee uno de los campos de la instancia o algún otro dato de memoria cuya disponibilidad (existencia) dependa de que el objeto sea "real", como ya también lo ejemplificó Román.

El método Free no "toca" nada de la memoria de datos. Se limita a preguntar si Self es otra cosa distinta de Nil, para luego llamar al destructor con seguridad. Por ello es que no preocupa su uso con un objeto Nil. Fue concebido tal como es para que el programador no tuviese que preguntar si una variable objeto es Nil antes de intentar liberar dicho objeto.

Cita:
Empezado por donald shimoda Ver Mensaje
...un post sobre los efectos colaterales de la forma en que esta implementado, sobre todo cuando usas tareas:

link...
Esa referencia es harina de otro costal. Si no me equivoco (mi inglés es lento), habla del conflicto que presenta la función FreeAndNil cuando se intenta hacer referencia a la variable objeto durante la destrucción del mismo, momento en el cual tal variable ya tiene asignado un valor de Nil.

Cita:
Empezado por donald shimoda Ver Mensaje
...FPC se queja con ese código, por lo tanto prefiero escribir código seguro que experimenta con lo que se banca la VCL. ...
No le encuentro sentido a esto último que dices, ¿podrías explicarte, por favor?

Espero haber ayudado a esclarecer un poco el asunto.

Saludos a todos y no se estresen porque me estreso.

Al.

P.D. Cabe mencionar que la llamada a métodos virtuales con un objeto Nil sí es totalmente inviable y en todos los casos elevará una excepción. Porque, para hacer el late binding, se necesita conocer cuál es la clase real de la instancia, es decir, leer ese primer campo invisible que está alojado en los primeros cuatro bytes de la memoria del objeto. Siendo el objeto Nil (dirección de memoria 0), no hay tal dato. En todo caso el programa intentará leer los primeros cuatro bytes de la RAM, posición de memoria no accesible. Free NO es virtual, carecería de sentido si lo fuera.

Última edición por Al González fecha: 12-11-2008 a las 22:00:57.
Responder Con Cita
  #30  
Antiguo 12-11-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por Al González Ver Mensaje
Esa referencia es harina de otro costal. Si no me equivoco (mi inglés es lento), habla del conflicto que presenta la función FreeAndNil cuando se intenta hacer referencia a la variable objeto durante la destrucción del mismo, momento en el cual tal variable ya tiene asignado un valor de Nil.
A pesar de tu inglés entendiste bien. O casi, porque decís que es harina de otro costal?

Cita:
Empezado por Al González Ver Mensaje

No le encuentro sentido a esto último que dices, ¿podrías explicarte, por favor?

Al.
FPC no acepta el uso del código escrito por román, Probalo.

Saludos
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal
Responder Con Cita
  #31  
Antiguo 12-11-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Al González Ver Mensaje
Tratándose de objetos, debes recordar que el código compilado de las rutinas (métodos) se guarda en ubicaciones de memoria distintas a donde se alojan los campos de datos de una instancia. De hecho, por dentro, el bloque de memoria que ocupa una instancia de objeto es meramente una "estructura" del estilo Record, teniendo un primer "campo" invisible que guarda un apuntador a donde se encuentra definida la clase a la que pertenece, su herencia, métodos y otros elementos de RTTI.
No sé porqué, pues es sólo una esquema, pero eso que explicas Al, a mi se me quedó muy grabado con esta imagen




del libro Delphi in a Nutshell de Ray Lischner

Cita:
Empezado por Al González Ver Mensaje
No le encuentro sentido a esto último que dices, ¿podrías explicarte, por favor?
Bueno, Delphi también protesta:

Cita:
[Warning] Unit1.pas(41): Variable 'Persona' might not have been initialized
aunque no lo impide. Desde luego tiene sus riesgos usarlo regularmente como si fuese una característica del lenguaje. Pero en el caso que nos ocupa, como ya se ha visto, es perfectamente seguro.

// Saludos
Responder Con Cita
  #32  
Antiguo 12-11-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
¿ que es nil ?

jojojojo
__________________

Responder Con Cita
  #33  
Antiguo 12-11-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por ContraVeneno Ver Mensaje
¿ que es nil ?
Aquí su origen:

http://www.heideggeriana.com.ar/textos/nihilismo_3.htm

ja, ja, ja

// Saludos
Responder Con Cita
  #34  
Antiguo 12-11-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
changos, era broma maese Roman
__________________

Responder Con Cita
  #35  
Antiguo 12-11-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por Al González Ver Mensaje

Esa referencia es harina de otro costal. Si no me equivoco (mi inglés es lento), habla del conflicto que presenta la función FreeAndNil cuando se intenta hacer referencia a la variable objeto durante la destrucción del mismo, momento en el cual tal variable ya tiene asignado un valor de Nil.

No le encuentro sentido a esto último que dices, ¿podrías explicarte, por favor?

Espero haber ayudado a esclarecer un poco el asunto.

Saludos a todos y no se estresen porque me estreso.
Te agradezco Al, por aclarar (y aclararme de paso) las cosas. Ya mi brain estaba por hacer ¡PUM!. Y mi inglés es super lento... El haber leído singleton por aqui, y allí provocó unos cuantos corto circuitos. ¡Me mete patrones donde no hay!

Ahora si, a ver si la consola de mi cabeza empieza a mandar comandos PANIC OFF.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #36  
Antiguo 12-11-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por donald shimoda Ver Mensaje
...porque decís que es harina de otro costal?
Porque el punto de la discusión donde hiciste esa referencia («un post sobre los efectos colaterales de la forma en que esta implementado, sobre todo cuando usas tareas») era que no entendías o no dabas por válido el uso del método Free con un objeto Nil. Como si ese artículo de Miller pudiera llevarnos a concluir que la práctica del "ObjetoNil.Free" fuese algo desaconsejable.

Cita:
Empezado por donald shimoda Ver Mensaje
...FPC no acepta el uso del código escrito por román, Probalo...
Quizá pregunte una estupidez, pero ¿qué es FPC? Google me llevó a la página del Fútbol Profesional Colombiano.

Mi pregunta se refería a eso de «prefiero escribir código seguro que experimenta con lo que se banca la VCL».

En espera de tus apreciaciones.

Saludos.

Al González.
Responder Con Cita
  #37  
Antiguo 12-11-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por Al González Ver Mensaje
Porque el punto de la discusión donde hiciste esa referencia («un post sobre los efectos colaterales de la forma en que esta implementado, sobre todo cuando usas tareas») era que no entendías o no dabas por válido el uso del método Free con un objeto Nil. Como si ese artículo de Miller pudiera llevarnos a concluir que la práctica del "ObjetoNil.Free" fuese algo desaconsejable.
No, como bien dice el texto lo que trae complicaciones es la manera en que esta implementado FreeAndNil, si no se toman las medidas del caso al accesarlo desde varias tareas.

Cita:
Empezado por Al González Ver Mensaje
Quizá pregunte una estupidez, pero ¿qué es FPC? Google me llevó a la página del Fútbol Profesional Colombiano.
Free Pascal Compiler.

Cita:
Empezado por Al González Ver Mensaje
Mi pregunta se refería a eso de «prefiero escribir código seguro que experimenta con lo que se banca la VCL».
Exacto, me refería a que prefiero escribir código que cualquier compilador pascal acepte, no solo Delphi.

Saludos.
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal
Responder Con Cita
  #38  
Antiguo 12-11-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por roman Ver Mensaje
...No sé porqué, pues es sólo una esquema, pero eso que explicas Al, a mi se me quedó muy grabado con esta imagen




del libro Delphi in a Nutshell de Ray Lischner...
Un bello esquema, sin duda. Si mal no recuerdo yo lo aprendí de la ayuda de Turbo Pascal y después lo reforcé con la ayuda de Delphi. Me parecía entonces muy interesante todo lo que los ingenieros de software hacían para abrirle paso en la historia a la fabulosa POO que hoy día disfrutamos.

Además, leer tanto texto sin Internet y un diccionario en la mano me ayudó a conseguir mis primeras nociones reales del idioma inglés.

Un abrazo esquemático y textual.

Al González.
Responder Con Cita
  #39  
Antiguo 12-11-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por donald shimoda Ver Mensaje
No, como bien dice el texto lo que trae complicaciones es la manera en que esta implementado FreeAndNil, si no se toman las medidas del caso al accesarlo desde varias tareas...
Bueno, eso mismo ya se había mencionado. Y aunque no se trate de una aplicación multihilo el problema es susceptible de presentarse según comenté más arriba. Pero sigo sin comprender qué tiene que ver esto con tu desapego al uso de ObjetoNil.Free.

Cita:
Empezado por donald shimoda Ver Mensaje
... Free Pascal Compiler.
Exacto, me refería a que prefiero escribir código que cualquier compilador pascal acepte, no solo Delphi...
Sabía que te causaría gracia, romper el hielo no es malo.

Ahora sé qué es FPC. Pero entonces acláranos una cosa por favor, ¿Free Pascal Compiler no acepta ese uso del método Free, que en Delphi es de lo más estable, tradicional, útil y seguro?

Y si realmente sí es aceptado por FPC, al contrario de lo que das a entender, ¿no sería mejor que externaras tus conclusiones claras y reales respecto al empleo del método Free con objetos Nil, una vez consideradas las explicaciones dadas en mensajes anteriores? De lo contrario, algunos lectores futuros del este hilo podrían albergar dudas respecto a la validez y seguridad de usar ObjetoNil.Free. En buen plan.

Un abrazo por la verdad.

Al González.
Responder Con Cita
  #40  
Antiguo 12-11-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por Al González Ver Mensaje
Pero sigo sin comprender qué tiene que ver esto con tu desapego al uso de ObjetoNil.Free.
Nada amigo, solo fue un comentario relacionado al tema, hasta donde quieres llegar?

Cita:
Empezado por Al González Ver Mensaje
Sabía que te causaría gracia, romper el hielo no es malo.

Ahora sé qué es FPC. Pero entonces acláranos una cosa por favor, ¿Free Pascal Compiler no acepta ese uso del método Free, que en Delphi es de lo más estable, tradicional, útil y seguro?

Y si realmente sí es aceptado por FPC, al contrario de lo que das a entender, ¿no sería mejor que externaras tus conclusiones claras y reales respecto al empleo del método Free con objetos Nil, una vez consideradas las explicaciones dadas en mensajes anteriores? De lo contrario, algunos lectores futuros del este hilo podrían albergar dudas respecto a la validez y seguridad de usar ObjetoNil.Free. En buen plan.

Un abrazo por la verdad.

Al González.
Ja, y siempre se llega a lo mismo. Gracias maestro.
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal
Responder Con Cita
Respuesta



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
Buenas prácticas de programación elcigarra OOP 18 07-11-2008 17:05:27
Siete prácticas para un óptimo y rápido desarrollo de software poliburro Noticias 5 30-07-2008 16:48:55
buenas maneras... BlueSteel Humor 23 13-06-2008 08:11:21
Buenas Noticias faustoffp Noticias 0 04-09-2006 06:33:06
Ayuda Practicas En Delphi MARIAM23 Varios 1 22-07-2006 01:19:34


La franja horaria es GMT +2. Ahora son las 01:09:03.


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
Copyright 1996-2007 Club Delphi