Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   lio con una asignación (https://www.clubdelphi.com/foros/showthread.php?t=66771)

ioco 11-03-2010 08:24:44

lio con una asignación
 
Buenos días ^^

Hace unos días hice la típica unit de principiante con un record y una serie de funciones y procedures ya que la POO aún me da algo de respeto y de momento solo me aclaré de forma elemental con el uso de objetos ya creados.

La cuestión es que me he decidido a convertir esa unit en una unit para almacenar un objeto (hace semanas lo intenté y acabé desistiendo y opté por aplazarlo para seguir leyendo y practicando las bases.)

Así que aquí les traigo el objeto en si

Código Delphi [-]
Type
      TComplejo = class
                Re,
                Img,
                Modulo,
                ArgumentoGrados,
                ArgumentoRadianes:Extended;
                N:LongInt; //Índice para la raíz n-esima
                SolucionesRaizN:TFPObjectList;
                {Función de construcción de un complejo (todo = 0)}
                Constructor NuevoNumero;
                {Procedimiento para rellenar la parte de coordenadas polares de la variable}
                Procedure CalcularPolar;
                {Procedimiento para rellenar la parte de coordenadas rectangulares de la variable}
                Procedure CalcularRectangular;
                {Función para sumar dos complejos}
                Function Suma(a,b:TComplejo);
                {Función para restar dos complejos}
                Function Resta(a,b:TComplejo);
                {Función para multiplicar dos complejos}
                Function Multiplica(a,b:TComplejo);
                {Función para dividir dos complejos}
                Function Divide(a,b:TComplejo);
                {Función para obtener el logaritmo natural de un complejo}
                Function Ln(a:TComplejo); overload;
                {Función para elevar un complejo a otro complejo}
                Function Eleva(a,b:TComplejo);
                {Función para sacar la raíz n-ésima de un complejo}
                Function RaizN(a:TComplejo;b:LongInt);

Suponiendo que el código completo de la unit esté correcto (no me ha dado ningun error de compilación) y esperando que no haya sorpresas (que las habrá seguro xD) cuando empiece a llamar al objeto por primera vez desde un form, les pego aquí la parte que me dio la duda (pongo la function completa para contextualizar, el problema está señalado con '//' espero se entienda bien :S):

Código Delphi [-]
      Function TComplejo.RaizN;
               Var
                  i:LongInt;
                  z:=TComplejo;
               Begin
                    {Si el índice de la raíz es 0, entonces damos como resultado un complejo 0}
                    If N<0 then
                       Begin
                            z:=TComplejo.NuevoNumero;
                            ListaSoluciones:=TFPObjectList.Create;
                            ListaSoluciones.Add(z);
                            z.free;
                       end
                    {Si el índice de la raíz es 1, entonces damos como resultado el mismo complejo}
                    else If N=1 then
                         Begin
                              z:=TComplejo.NuevoNumero;
                              z:= ;//¿z:=self? para asignar a los atributos de z los valores de los de
                                  //la instancia de TComplejo con la que estemos trabajando
                              ListaSoluciones:=TFPObjectList.Create;
                              ListaSoluciones.Add(z);
                              z.free;
                         end
                    {Si el índice de la raíz es >1, entonces damos las N soluciones}
                    else
                        ListaSoluciones:=TFPObjectList.Create;
                        For i:=1 to N do
                            Begin
                                 z:=TComplejo.NuevoNumero;
                                 {Cálculo de la raíz en formato polar}
                                 z.Modulo:=Power(Modulo,1/N);
                                 z.ArgumentoRadianes:=(2*Pi*(i))/N;
                                 {Conversión de radianes a grados}
                                 z.ArgumentoGrados:=RadToDeg(z.ArgumentoRadianes);
                                 {Modificación del formato rectangular}
                                 CalcularRectangular(z);
                                 {Añadir solución a la lista de soluciones}
                                 ListaSoluciones.Add(z);
                                 z.free;
                            end;
               end;

Un saludo y mil gracias por su tiempo :)

delphi.com.ar 11-03-2010 18:19:22

Por lo que entiendí, creo que quieres "clonar" un objeto, en ese caso te conviene reimplementar el método Assign y utilizarlo.

PD: ¿No te resulta sumamente incómoda esa forma de identación?

Al González 11-03-2010 22:37:39

Cita:

Empezado por delphi.com.ar (Mensaje 356595)
PD: ¿No te resulta sumamente incómoda esa forma de identación?

Sangrado, sangrado. ;)

BrunoBsso 12-03-2010 01:42:58

Cita:

Empezado por delphi.com.ar (Mensaje 356595)
PD: ¿No te resulta sumamente incómoda esa forma de identación?

Fue exactamente lo mismo que pensé al entrar al hilo :D
Es indentación me hace sentir incómodo leyendo. ¿Será la costumbre?
En fin, yo no entendí bien lo que necesitás. Algunos datos más tal vez ayuden.
Tus funciones no devuelven ningún tipo de dato, eso va contra la definición de function.
Por otro lado, donde remarcás el problema, ¿ahí necesitas que z sea igual al número complejo que estás usando?
En ese caso, como bien dice delphi.com.ar deberías tener un método de asingación entre 2 objetos de tu clase.
Saludos!!!

ioco 12-03-2010 23:29:20

Siento no haber podido entrar antes, que he tenido un día un poco atareado jeje

Tal como dice delphi.com.ar, lo que quería era clonar una instancia. Entiendo que el método que sugieren para la clonación es asignando propiedad a propiedad mediante ":=" ¿me equivoco?.

Lo de las functions es un fallo mío que ya corregí de un ejemplo que entendí mal del libro, sorry.

Respecto al tema del sangrado, identación o como queramos llamarlo, me tiene un poco mosca porque me fijo bastante en que quede bien claro y agrupado todo por conjuntos y tal y no acabo de entender qué es lo que les resulta incómodo o molesto. Si me lo pudieran aclarar prometo adaptar el código a su explicación :)

delphi.com.ar 13-03-2010 03:45:42

Cita:

Empezado por ioco (Mensaje 356801)
Tal como dice delphi.com.ar, lo que quería era clonar una instancia. Entiendo que el método que sugieren para la clonación es asignando propiedad a propiedad mediante ":=" ¿me equivoco?.

No, me refería a complementar el método Assign:


Código Delphi [-]
procedure TMyClass.Assign(Source: TPersistent);
begin
  if Source is TMyClass then
    with Source as TMyClass do
    begin
      FField1 := Field1; 
      FField2 := Field1; 
      FField3 := Field1; 
      ...
    end 
  else
    inherited Assign(Source);
end;

Cita:

Empezado por ioco (Mensaje 356801)
Respecto al tema del sangrado, identación o como queramos llamarlo, me tiene un poco mosca porque me fijo bastante en que quede bien claro y agrupado todo por conjuntos y tal y no acabo de entender qué es lo que les resulta incómodo o molesto. Si me lo pudieran aclarar prometo adaptar el código a su explicación :)

Yo intento escribir como Borland sugirió: http://edn.embarcadero.com/article/10280

Saludos!

BrunoBsso 13-03-2010 12:33:18

Ya no hace falta ayudarte con la asignación, la que te pasó delphi.com.ar es la justa y necesaria.
Pero con el tema de la indentación yo sigo mi regla de lectura solamente:
Cada vez que agrupe código (ya sea entre un begin y end, o después de una estructura de control simple como IF o FOR, etc) cada renglón inmediato antes del final lleva una indentación.
Ejemplo:
Código Delphi [-]
begin
  //Indento
  //todo
  //lo que esté adentro
  if True then
    //Indento la única línea del if simple
  if True then begin
    //Indento todo
    //el begin
    //y el end
  end;
  for I:=1 to 10 do
    //Exactamente igual al IF anterior
  //Esto esta afuera del IF y del FOR, pertenece al primer BEGIN
  //así que lo indento
end;
Eso para cada conjunto de sentencias marcadas por un begin - end o una estructura de control (simple - de una sola línea - o compleja - con más de una lína, o sea con begin end).


La franja horaria es GMT +2. Ahora son las 15:57:12.

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