Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   más buenas prácticas de programación (https://www.clubdelphi.com/foros/showthread.php?t=61548)

Al González 13-11-2008 00:17:55

Cita:

Empezado por donald shimoda (Mensaje 325561)
Tenes absolutamente razón, lo escribí rápido y me olvide que en realidad soy yo el que hago siempre:

Código Delphi [-]
if Assigned(x) then
  FreeAndNil(x);

Esto segun Allen Bauer es un vicio horrendo de programación . Ahora si mirás el código delhi de FreeAndNil:

Código Delphi [-]
procedure FreeAndNil(var Obj);
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;

Si obj = nil estas llamando a nil.free!!!! No jodamos, es inaceptable o muy arriesgado para mis pareceres. Aunque se enoje Allen Bauer , escucho argumentos en contra que me quiten el vicio. :D

Saludos

Un placer, Donald. Argumentos dados tal como los solicitó. Sólo que es una pena no conocer si te convencieron para erradicar ese vicio y, en caso contrario, las razones. :(

Una disculpa a elcigarra por las derivaciones que tuvo el hilo (al menos por lo que a mí me toca).

Saludos.

Al González.

donald shimoda 13-11-2008 00:23:48

Cita:

Empezado por Al González (Mensaje 325678)
Un placer, Donald. Argumentos dados tal como los solicitó. Sólo que es una pena no conocer si te convencieron para erradicar ese vicio y, en caso contrario, las razones. :(

Como le dije a Román estoy totalmente de acuerdo en sus explicaciones, se las agradezco, son correctas, que mas debo decir?:rolleyes:

Si han sido suficientes para erradicar el vicio? Primera regla del programador es no toques código que funciona sin una buena razón. No veo una buena razón en revisar código viejo.

Para el código nuevo probaré, te cuento cuando tenga mis propias pruebas de uso.

Saludos.

Al González 13-11-2008 00:32:08

Cita:

Empezado por donald shimoda (Mensaje 325680)
...Para el código nuevo probaré, te cuento cuando tenga mis propias pruebas de uso...

:) Urbana respuesta, gracias. Y una disculpa si te hice sentir presionado, no era esa la intención. Cuando gustes te invito un trago en La Taberna. :p

roman 13-11-2008 01:47:29

Cita:

Empezado por ContraVeneno (Mensaje 325639)
changos, era broma maese Roman :p :D

Je, je. Yo me di cuenta de tu mensaje oculto sólo hasta que cité tu mensaje. Pero de todas formas fue lo primero que me vino a la mente. No sé si sea cierto, pero alguna vez leí que de ahí viene la palabra nil.

// Saludos

roman 13-11-2008 01:51:24

Una pregunta, porque creo que me perdí en algún punto. Exactamente ¿qué es lo que no aceptaría FPC de mi codigo? ¿No compila? Es que se me hace raro, porque Delphi igualmente "protesta" marcando una advertencia, pero no impide la compilación y no veo porque no compilaría. Sintacticamente es correcto ¿no? ¿Qué error marca?

// Saludos

donald shimoda 13-11-2008 02:05:40

Cita:

Empezado por roman (Mensaje 325707)
Una pregunta, porque creo que me perdí en algún punto. Exactamente ¿qué es lo que no aceptaría FPC de mi codigo? ¿No compila? Es que se me hace raro, porque Delphi igualmente "protesta" marcando una advertencia, pero no impide la compilación y no veo porque no compilaría. Sintacticamente es correcto ¿no? ¿Qué error marca?

// Saludos

Protesta y corre. A eso me refería con que no lo *acepta*. Lo mismo que sucede en Delphi.

Saludos.

roman 13-11-2008 02:20:37

¡Ah! Ok, gracias.

Y, como dice Al, hemos desviado el hilo, pero creo que nuestro compañero no lo verá tan mal ya que, a fin de cuentas, hemos estado hablando de buenas prácticas de programación.

Aunque no le veo problema al nil.Free, lo cierto es que ejemplos como el que puse de la clase TPersona, no deben hacerse. No lo hagan en casa niños :D

-----------------

Por otra parte, retomando el hilo original, quiero comentar que voy de acuerdo con lo expresado: un método no debe devolver objetos, a no ser que sea una especie de fábrica y quede claro tanto en la documentación como en el nombre:

Código Delphi [-]
var
  Persona: TPersona;

begin
  Persona := Dios.CrearPersona();
end;

:D

// Saludos

Delphius 13-11-2008 03:51:14

Cita:

Empezado por roman (Mensaje 325711)

Por otra parte, retomando el hilo original, quiero comentar que voy de acuerdo con lo expresado: un método no debe devolver objetos, a no ser que sea una especie de fábrica (...)

Y como por lo general (aunque no siempre) una Fábrica se accede mediante el patrón Singleton. ¡Ahora si! ¡En este caso si hay Singleton! ¡Santos patrones!:D

Lo siento, no pudo evitarlo tenía que decirlo.:(
Disculpen que haya desviado el hilo.

Saludos,

olbeup 13-11-2008 09:13:36

Hola ???

Retomando la pregunta inicial.
Código Delphi [-]
function TForm1.GetStrings:TStrings;
var
  miLista: TStrings;
begin
  miLista := TStringList.Create;
  miLista.Add('uno');
  miLista.Add('dos');
  Result := miLista;
  FreeAndNil(MiLista); // Esta linea da un error EAccessViolation
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  memo1.Lines.Assign(GetStrings);
end;

Por que no haces esto:
Código Delphi [-]
function TForm1.GetStrings:TStrings;
begin
  Result := TStringList.Create;
  Result.Add('uno');
  Result.Add('dos');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  memo1.Lines.Assign(GetStrings);
end;

Al salir de la función GetStrings, la variable se libera sola.

Un saludo:D

Lepe 13-11-2008 10:58:55

Cita:

Empezado por olbeup (Mensaje 325735)
Al salir de la función GetStrings, la variable se libera sola.

¿quien te ha dicho eso? ¿eh? que yo me entere :mad:

Casimiro Notevi 13-11-2008 14:56:03

Cita:

Empezado por olbeup (Mensaje 325735)
Al salir de la función GetStrings, la variable se libera sola.

Cita:

Empezado por Lepe (Mensaje 325743)
¿quien te ha dicho eso? ¿eh? que yo me entere :mad:

Evidentemente, no, no se libera sola.

Creo que hay una regla simple para no equivocarse:
Si tú coges memoria --> tú tienes que liberarla cuando terminas
Si Delphi coge memoria --> Delphi la libera cuando termina.


No recuerdo si existe alguna excepción a la regla, como casi siempre :)

elcigarra 14-11-2008 01:08:25

Cita:

Empezado por roman (Mensaje 325711)
Y, como dice Al, hemos desviado el hilo, pero creo que nuestro compañero no lo verá tan mal ya que, a fin de cuentas, hemos estado hablando de buenas prácticas de programación.

El haber iniciado este hilo es el único derecho que siento, como humilde mortal, de escribir entre inmortales. Cuando sea grande me gustaría saber todo lo que saben ustedes... Ups! me olvidaba, no me queda tiempo porque ya me pasé de "grande".

Como sea... sinceras gracias.

Lepe 14-11-2008 14:16:41

Cita:

Empezado por Casimiro Notevi (Mensaje 325786)
No recuerdo si existe alguna excepción a la regla, como casi siempre :)

¿_CopyObject? :D :D


(perdón).

Saludos


La franja horaria es GMT +2. Ahora son las 17:47:54.

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