Ir al contenido


Foto

Duda sobre Propiedades


  • Por favor identifícate para responder
2 respuestas en este tema

#1 armadillo

armadillo

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 19 marzo 2016 - 03:32

Hola  a Tod@s,

Estaba leyendo el articulo que hay en el foro sobre propiedades (http://delphiaccess....to-propiedades/) escrito por delphius, desde ya muy interesante y muy claro, ya que lei otros articulos por ahi, pero me confundia mucho... desde ya delphius muchas gracias.

Practicando un poco este tema, me surgio una duda y es que en realidad el tema de las propiedades indexadas me ha costado un poco entender y/o interpretarlas, como tambien aplicarlas...

Y me surgió el siguiente problema, haciendo un objeto con dos propiedades una de ellas un array de numeros y otro campo con el resultado de la suma de estos. Al objeto debo pasarle una lista de números, y debe devolverme en una propiedad la suma total..

La lista de números seria del tipo:

 

numeros: array of integer;

 

No se el numero total de indices que tiene, el array no siempre tiene la misma cantidad de datos a sumar...

 

Como deberia implementar esto usando "property"?

 

Desde ya muchas gracias y un saludo


  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 19 marzo 2016 - 05:20

Hola  a Tod@s,

Estaba leyendo el articulo que hay en el foro sobre propiedades (http://delphiaccess....to-propiedades/) escrito por delphius, desde ya muy interesante y muy claro, ya que lei otros articulos por ahi, pero me confundia mucho... desde ya delphius muchas gracias.

Practicando un poco este tema, me surgio una duda y es que en realidad el tema de las propiedades indexadas me ha costado un poco entender y/o interpretarlas, como tambien aplicarlas...

Y me surgió el siguiente problema, haciendo un objeto con dos propiedades una de ellas un array de numeros y otro campo con el resultado de la suma de estos. Al objeto debo pasarle una lista de números, y debe devolverme en una propiedad la suma total..

La lista de números seria del tipo:

 

numeros: array of integer;

 

No se el numero total de indices que tiene, el array no siempre tiene la misma cantidad de datos a sumar...

 

Como deberia implementar esto usando "property"?

 

Desde ya muchas gracias y un saludo

 

Las propiedades indexadas no son muy frecuentes, son muy raras las ocasiones en las que es válido su uso. Cuesta entenderlas al comienzo. Por empezar, las propiedades que uno desea indexar deben ser del mismo tipo. Y en 2do lugar, debe haber algún tipo de relación conceptual y un contexto que las vincule. De haber dicho contexto recién podría analizarse y discutirse la viabilidad de llevar el desarrollo de la clase por esta vía.

En el ejemplo de mi Manual, al definir la clase Auto se pensó que un auto podría estar conformado por 4 partes. Inicialmente existen 4 propiedades, una para una. Pero si se analiza con cuidado, hay algo en "común" a éstas ¡Todas son partes! Por tanto puede ser de utilidad entonces definir una 5ta propiedad, llamada Partes, que nos permita acceder a cualquiera de estas 4 y de esa forma abstraernos más. Podemos gracias a esta nueva propiedad vectorial leer y escribir sobre cualquiera.

Entonces tenemos dos formas de acceder a esas propiedades, de forma específica mediante PartesUno, PartesDos, etc; o bien de forma más abstracta mediante Partes[] y pasándole el índice.

En el ejemplo, por ser bastante simple, para almacenar internamente el valor asociado a cada propiedad se dispuso un array. Luego el método Geter LeerPropiedad() lo que hace es simplemente acceder por medio del índice a la posición dentro del vector para leerlo. El principio análogo aplica para EstablecerPropiedad(). No es estrictamente necesario que internamente se use un vector o arreglo para almacenar estos datos. Puede leerse atributos privados simples. Por ejemplo podría haber sido así:


delphi
  1. function TAuto.LeerPropiedad(Indice: integer); string;
  2. begin
  3. case Indice of:
  4. 0: result := fParteUno;
  5. 1: result := fParteDos;
  6. 2: result := fParteTres;
  7. 3: result := fParteCuatro;
  8. end;
  9. end;

Y naturalmente deberán declararse tantos atributos privados como uno plantee. De forma análoga se podría haber hecho para EstablecerPropiedad. Pero claro, nota que como son del mismo tipo no resulta descabellado en lugar de declarar N atributos en su lugar aprovechar un vector.

 

Lo que acabo de apreciar en mi Manual es una pequeña errata. En la declaración del método LeerPropiedad el valor devuelto debiera ser string y no integer.

 

Para resumir: La idea es justamente que si tenemos N propiedades del mismo tipo, y de cual podríamos concebir un contexto común a todas estas, podemos entonces añadir una propiedad más por la cual podemos acceder a cualquiera de éstas. Tendremos entonces un total de N+1 propiedades: N propieades escalares con su índice y la Vectorial para acceder a cualquiera de éstas.

Naturalmente debe definirse y conocerse exactamente el número conocido de propiedades. No puede ser "dinámico".

 

Ahora, yendo a tu duda sobre tu caso no me parece adecuado ni viable el uso de propiedades indexadas. No hay algo que sugiera su aplicación. Tu breve descripción incluso me hace pensar que hasta ni propiedades merece. Si la única función de la clase es recibir un vector o arreglo dinamico de números (enteros o reales) y calcular su suma lo más adecuado es directamente que disponga de una función:


delphi
  1. TSummatory = class
  2. public
  3. function SumTerms(const AVector: array of double): double;
  4. end;
  5.  
  6. function TSummatory.SumTerms(const AVector: Array od double): double;
  7. var sum: double;
  8. i: integer;
  9. begin
  10. if Length(AVector) <= 0
  11. then Exit;
  12. sum := 0.0;
  13. for i := Low(AVector) to High(AVector) do
  14. sum := sum + AVector[i];
  15. result := sum;
  16. end;

Si tuviera que hacer más cosas con esa lista de números, como por ejemplo calcular productoria, obtener máximo y/o mínimos, buscar duplicados, etc ahí si me pensaría de utilidad disponer de un atributo y por consiguiente los métodos Get y Set y sus respectivas propiedades para mantener esa lista.

 

Ahora bien si deseas aún aplicar algunos conceptos que he expuesto en mis manuales un diseño elegante podría ser:

 

1. Definir como atributo privado algún vector constante o dinámico

2. Definir una propiedad vectorial para la escritura y lectura de dicho vector

3. Definir propiedades y métodos que nos permita establecer y conocer la cantidad de elementos del vector

4. Disponer de un método (función) que calcule la suma

 

El código de esta propuesto te lo dejo de tarea. ¡Tu puedes! ;)

 

Saludos,


  • 0

#3 armadillo

armadillo

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 26 marzo 2016 - 09:57

Hola Delphius!!

Muchas gracias!!!

Todo Clarisimo. :ap:

Esto ha sido una pequeña clase Muchas Gracias ;) (y)


  • 0




IP.Board spam blocked by CleanTalk.