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
  #1  
Antiguo 04-12-2014
Avatar de BDWONG
BDWONG BDWONG is offline
Miembro
NULL
 
Registrado: nov 2013
Posts: 113
Poder: 11
BDWONG Va por buen camino
El mejor momento para liberar un objeto

Bueno no sabia que poner de titulo, asi que si algún moderador encuentra uno mejor que explique mi pregunta que lo modifique por favor.

Bueno mi pregunta es que yo tengo un programa que tiene un clase(objeto) que contiene metodos para cifrar texto plano ejemplo : xor, rotn,reverse, rc4 etc.

mi pregunta viene a que si que cuando llamo al objeto TCifrado y quiero utilizar sus metodos es necesario que al momento de llamar que cree el objeto y en ese mismo instante despues de utilizarlo libere el objeto o la otra opcion que se me viene a la cabeza es que cree el objeto en el formcreate y libere el objeto al cerrar el form

La verdad es algo sin mucho sentido pero imagínense que tenga 20 métodos diferentes y aveces puedo ocupar uno u otro
espero sus respuestas saludos...

Aqui la clase

Código Delphi [-]
interface
type
TCifrado=class(TObject)
  public
  function C_xor(cadena:string):string;
  function Rotn(cadena:string; N:integer):string;
  function Reverse(cadena:string):String;


end;


implementation



{ TCifrado }

function TCifrado.C_xor(cadena: string): string;
var i:integer;
sfinal:string;
begin
     sfinal:='';
     for i :=1  to length(cadena) do
     begin
        sfinal:=sfinal+chr(ord(cadena[i]) xor length(cadena));
     end;

    SetLength(result, length(cadena));
    result:=sfinal;
end;

function TCifrado.Reverse(cadena: string): String;
var
sfinal:String;
i:integer;
begin
   sfinal:='';
   for  i:=length(cadena) downto 1  do
   begin
     sfinal:=sfinal+cadena[i];
   end;

   SetLength(result, length(cadena));
   result:=sfinal;
end;

function TCifrado.Rotn(cadena: string; N: integer): string;
var
i:integer;
sfinal:string;
begin

   for i :=1  to length(cadena) do
   begin
     sfinal:=sfinal+chr((ord(cadena[i])+N) mod 255 );
   end;

   SetLength(result, length(cadena));
   result:=sfinal;
end;

end.

esta es la primera forma como explico
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
begin
   Cifrado:=TCifrado.Create;
  try
    if RadioButton1.Checked then
      Memo2.Text:=Cifrado.Reverse(Memo1.Text)
   else if RadioButton2.Checked then
      Memo2.Text:=Cifrado.C_xor(Memo1.Text)
   else if RadioButton3.Checked then
      Memo2.Text:=Cifrado.Rotn(Memo1.Text,13);

  finally
   FreeAndNil(Cifrado);
  end;

end;

esta es la segunda
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
begin
   if RadioButton1.Checked then
      Memo2.Text:=Cifrado.Reverse(Memo1.Text)
   else if RadioButton2.Checked then
      Memo2.Text:=Cifrado.C_xor(Memo1.Text)
   else if RadioButton3.Checked then
      Memo2.Text:=Cifrado.Rotn(Memo1.Text,13);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   Cifrado.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Cifrado:=TCifrado.Create;
end;
Responder Con Cita
  #2  
Antiguo 04-12-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola BDWONG.

Si vas a usar uno o mas de los métodos de la clase varias veces durante la vida del form, considero mas práctico crear la instancia de clase en la creación del form y liberarla con él.

Pero si la vas a usar por única vez veo mejor liberarla al momento de no necesitarla mas, independientemente de la cantidad de sus métodos que utilices en ese momento.

De todos modos es sólo mi humilde opinión...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 04-12-2014
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Estas en un lenguaje que no recolecta basura (en contraste con .NET, Java, etc), asi que guiate por:

Crea tan tarde como sea posible y libera tan pronto como sea posible

Ahora bien, es importante entender cual es el ciclo de vida de los objetos y como se relaciona eso con el manejo de la memoria y que es lo optimo para un computador.

Hay razones para desviarse de la idea general de "crea tarde/libera temprano". Sin embargo, el error de gente novata es preocuparse por la "eficiencia/velocidad", cuando es MUCHO mejor preocuparse por hacer las cosas simples y correctas. Si haces codigo simple y correcto, los compiladores modernos trabajaran de forma optima.

A proposito:

No tienes que hacer siempre un objeto. Delphi no es Java! Hacer funciones esta muy bien, y de hecho, es la forma MAS natural cuando tienes algo que es ENTRADA -> PROCESO -> SALIDA. Y te ahorras el tener que crear/destruir objetos y todo eso.

Delphi es muy versátil. Un montón de cosas se puede simplificar usando funciones/estructuras que reemplazan mucho codigo a punta de clases, y que puede ser mas legible y eficiente.
__________________
El malabarista.
Responder Con Cita
  #4  
Antiguo 04-12-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Mario,

Cita:
Empezado por mamcx
...Delphi es muy versátil. Un montón de cosas se puede simplificar usando funciones/estructuras que reemplazan mucho código a punta de clases, y que puede ser mas legible y eficiente...


Nelson.
Responder Con Cita
  #5  
Antiguo 04-12-2014
Avatar de BDWONG
BDWONG BDWONG is offline
Miembro
NULL
 
Registrado: nov 2013
Posts: 113
Poder: 11
BDWONG Va por buen camino
Cool

Gracias por los consejos la verdad es que hay que veces que uno se mal acostumbra, como dice mamcx Delphi no es java y es cierto yo que vengo de este lenguaje aveces de manera inconsciente cargo conceptos los cuales no se pueden aplicar en todas partes por eso me gusto Delphi ya que no te obliga ha hacer las cosas solo de una forma si no que te da varias.

ecfisa pienso igual que tu XD

gracias por su ayuda chicos saludos.....
Responder Con Cita
  #6  
Antiguo 04-12-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola BDWONG.

Yo creo que la respuesta mas directa a la pregunta ¿ Cuál es el mejor momento para liberar un objeto ? es: Cuando ya no precises usarlo.

Pero en la práctica hay situaciones en las que no se conocen a priori cuales, ni cuantas veces precisarás llamar a alguno de sus métodos. Si bién podrías crear/destruir el objeto las N-veces que precises usarlo, considero mas práctico y menos propenso a errores (por LOC), unificar la creación y liberación del objeto con la del formulario.

Por otro lado, si tu intención es encapsular varios métodos en una clase y esta sólo contiene métodos, nada te impide usarlos sin tener que crear una instancia de la misma, como podría hacerse en el caso de tu ejemplo:
Código Delphi [-]
...
type
  TCifrado=class(TObject)
    function C_xor(const Cadena: string): string;
    function Reverse(const Cadena: string): string;
    function Rotn(const Cadena: string; const N: Integer): string;
  end;

implementation

{ TCifrado }

...

function TCifrado.C_xor(const Cadena: string): string;
var
  i: Integer;
begin
  Result:='';
  for i:= 1  to Length(Cadena) do
    Result:= Result + Chr(Ord(Cadena[i]) xor Length(Cadena));
end;
...

Uso:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  ci: TCifrado;
  Cadena: string;
begin
  Cadena:= 'Cadena de prueba';
  Cadena:= ci.C_xor(Cadena);
  ShowMessage(Cadena + ' / ' + ci.C_xor(Cadena));
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 04-12-2014 a las 06:57:06.
Responder Con Cita
  #7  
Antiguo 04-12-2014
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Cita:
Empezado por mamcx Ver Mensaje
Estas en un lenguaje que no recolecta basura (en contraste con .NET, Java, etc), asi que guiate por:

Crea tan tarde como sea posible y libera tan pronto como sea posible
Aun a riesgo de empezar un debate, en mi opinión es que esa guía vale tanto si no tienes recolector de basura como si sí lo tienes. No tengo experiencia con Java ni .Net, pero sí con PHP y JavaScript, y aunque sé que no todos los recolectores de basura son iguales y blablablah... finalmente decidí nunca confiar en ellos y hacer la gestión de memoria de forma implícita.

Cita:
Empezado por mamcx Ver Mensaje
A proposito:

No tienes que hacer siempre un objeto. Delphi no es Java! Hacer funciones esta muy bien, y de hecho, es la forma MAS natural cuando tienes algo que es ENTRADA -> PROCESO -> SALIDA. Y te ahorras el tener que crear/destruir objetos y todo eso.
Aquí te doy toda la razón. Además, usando el nombre de la unidad puedes usarlo como si fueran "objetos" aunque realmente no lo sean. Por ejemplo, puedes escribir "sysutils.ExtractFilePath (NombreArchivo)", como si "sysutils" fuera un objeto.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
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
Un momento, ¿no sería mejor comenzar con Python 3.x? Al González Python 4 05-04-2011 16:30:43
Liberar un objeto Com marcosl OOP 1 25-10-2007 00:10:19
Liberar el foco de un objeto Velia Varios 4 18-11-2005 01:08:08
Liberar un objeto xerkan Servers 1 28-10-2003 17:29:10


La franja horaria es GMT +2. Ahora son las 04:45:33.


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