Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   como llamo a un procedimiento con parametros opcionales (https://www.clubdelphi.com/foros/showthread.php?t=45631)

Delphius 10-07-2007 20:22:36

Hola,

Opino igual que Al, ¿10 parámetros? ¿Que de ellos el 40% sea opcional?
Desde ya decanto esa opción. Creo que deberías reconsiderar un mejor análisis de la situación.
Yo he llegado a declarar funciones, y clases... pero ninguna excede cuanto mucho a los 4 o 5 parámetros.

¿No podrías considerar que agunos parámetros sean propiedades de la clase?

Con respecto a la opción que te recomienda Neftali, creo que es la acertada. Y eso no quiere decir que debas codificar 10 veces el mismo código. Como te lo han dicho hay un error de diseño. La solución es buscar la mínima expresión común e implementarla en una función. Cada sobre carga llamará a dicha función (que debe ser privada, según una primera impresión y análisis).

El objetivo de los parámetros opcionales es evitar estar declarando valores que en la mayoría de los casos son considerados por defecto (o considerado lo mayormente esperado), por lo cual indicar un valor distinto sería considerado un caso "particular" (algo no habitual).

Este enfoque puede llevarse a la inversa. Es decir que nadie puede impedirte que emplees el valor opcional (por defecto) para evitar hacer una cosa. Algo como esto:

Código Delphi [-]
const
  CONST_NO_HAGAS_ESTO = 4;

//....

X.procedure EjemploALaInversa(A: integer; B: real; C: integer = CONST_NO_HAGAS_ESTO);
// posiblemente deba llevar la clausura overload....
begin
// ...
if C <> CONST_NO_HAGAS_ESTO
   then begin
            // Lo que quieres que haga...
          end
   else begin
            // Lo que no quieres que haga...
         end;
//...
end;

En resumen lo que he tratado de decirte es que podrías llevar y emplear el valor opcional en la forma inversa, es decir que si se suministra un valor distinto que se haga la operación que deba realizar.

Para finalizar, debo decirte que a pesar de que esta alternativa pueda llegar a funcionar sigue siendo un error conceptual y de diseño ya que el modo de trabajo no es el normal o "el esperado" del lenguaje. Puede llevar a confusiones en el futuro, y lo hace muy dificil de seguirle un correcto mantenimiento y documentación.

Espero que se me entienda.
Saludos,

Neftali [Germán.Estévez] 11-07-2007 11:09:00

Cita:

Empezado por luigi_cr
...pero bueno para que voy a sobrecargar un metodo diez veces si la funcion q cumple es la misma

Creo que nadie ha dicho tal cosa... Yo al menos no.
Contando que el método esté bien definido y sin poner en duda la definición de la cabecera (cosa que empiezo a dudar dados los problemas que te surgen), lo que yo he comentado es:

Cita:

Sólo le veo utilidad en el caso que he comentado de que la llamada con el parámetro X9 rellenado y el resto de opcioneles vacíos sea muy habitual.
¡¡Mira que está subrayado!! Está claro que sólo tiene utilidad en ese caso. Que de las 100 llamadas al método que haces la mayoría sean de una forma o de otra (por decir algo). Si llamas indistintamente de 10 forma distintas, nadie ha dicho que tengas que sobrecargar 10 veces.

En ese caso, seguramente habría que cambiar la cabecera de la función y llamar con dos arrays de parámetros, por ejemplo:
(x1:Integer; xNames:array of String; xValues: array of string)

Un array fijo de 4 posiciones, sólo para los opcionales o algun otro sistema que se ajuste a tus necesidades concretas (9 parámetros de tipo string, 4 opcionesles y que además llamas de la forma comentada).

luigi_cr 14-07-2007 20:59:24

Muchas Gracias
 
Muchas Gracias a todos los que, tomarón un poco de sutiempo y postearón tratando de ayudar, al final de cuentas deje el procedimiento como estaba, me parecieron execelentes la mayoria de respuestas...Gracias

Creo que con esto se cierra el tema....

Gracias de nuevo.


La franja horaria es GMT +2. Ahora son las 03:44:27.

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