Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-07-2007
[basti] basti is offline
Miembro Premium
 
Registrado: ago 2004
Posts: 388
Poder: 22
basti Va por buen camino
Pues yo tampoco tengo instalado VB, y tampoco pienso instalarlo (a mi pc le diagnosticaron alergia al VB y se me puede resfriar). Pero te puedo confirmar que en VB se pueden saltar parámetros. Eso sí, al principio puede parecer muy bonito, pero cuando te encuentras código así (lo estoy escribiendo de memoria, así que puede haber algún error):

[vb (no leer puede dañar el intelecto)]
Sub Funcion(primero as Integer, Optional ByVal segundo As Integer = 8, Optional ByVal tercero As Integer = 3, Optional ByVal cuarto As Integer = 3, Optional ByVal quinto As Integer = 7, Optional ByVal sexto As Integer = 9, Optional ByVal septimo As Integer = 3) as integer
.
.
.
resultado = Funcion (3, , , variable1, 4, 5, 7)

' o

resultado = Funcion(3, cuarto = variable1, quinto = 4, sexto = 5, septimo = 7)
[/vb]
Responder Con Cita
  #2  
Antiguo 10-07-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.437
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Otra opción podría ser sobrecargar el método y crear dos llamadas diferentes con diferentes parámetros (si es que es muy común llamarla con ese parámetro relleno y el resto de los opcionesles no).

Código Delphi [-]
procedure X.opcionales(x1 : Integer; x2 : String;
                          x3 : String; x4 : String;
                          x5 : String; x6 : String;
                          x7 : String = '000000000000';
                          x8 : String = '00000000';
                          x9 : String = '000000';
                          x10 : String = '000000'); overload;

procedure X.opcionales(x1 : Integer; x2 : String;
                          x3 : String; x4 : String;
                          x5 : String; x6 : String;                          
                          x9 : String = '000000'
); overload;

La segunda llamada, llamaría a la primera rellenando el resto de parámetros opcionales. 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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 10-07-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.141
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por basti
Pues yo tampoco tengo instalado VB, y tampoco pienso instalarlo (a mi pc le diagnosticaron alergia al VB y se me puede resfriar). Pero te puedo confirmar que en VB se pueden saltar parámetros.
Qué interesante... de verdad que es un motivo más para NO usar eso.

Es broma. Pero, vamos... si esto no queda como el culo del profesor Cojonciano que venga dios y lo vea:

Código:
resultado = Funcion (3, , , variable1, 4, 5, 7)
Mondieu...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 10-07-2007
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.610
Poder: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Hola a todos!

Luigi_cr:

Conozco, he utilizado, pero no me agrada del todo esa flexibilidad adicional de Visual Basic para el manejo de los parámetros opcionales porque propicia el viejo vicio de la parametrización excesiva, en lugar de fomentar una adecuada programación orientada a objetos. Vaya, este tipo de cosas son el quid de las eternas rivalidades entre Delphi y Visual Basic, entre lo bien pensado y lo que vende al vulgo.

Dices que no tiene mucho sentido que Delphi impida omitir parámetros intermedios. Bien, eso sería cierto si por otra parte tuviera sentido un método con 10 parámetros y no existiera en Delphi la sobrecarga de funciones (esta característica se incluyó en Delphi al mismo tiempo que los parámetros opcionales).

Si lo analizas de una manera objetiva, te darás cuenta que rara vez es menester crear un método con más de tres o cuatro parámetros. La POO está hecha para simplificar la manera de trabajar con los datos y la funcionalidad que hay alrededor de ellos. Un método como ese X.Opcionales tendría que ser revisado.

Ahora bien, ya que tengas un método más decente, digamos, que sólo declare unos tres o cuatro parámetros, podrías recurrir a la sobrecarga (directiva Overload), como bien lo sugirió Neftali, para entonces permitir la "omisión" de un parámetro intermedio, que en realidad sería utilizar la versión del método que no requiere (que asume) tal parámetro.

Código Delphi [-]
    TMiSQLConnection = Class (TSQLConnection)
      Public
        { Regresar al punto de restauración de nombre Name }
        Procedure RollbackSavePoint (Const Name :String;
          Const Release :Boolean = False); Overload;

        { Regresar al último punto de restauración marcado }
        Procedure RollbackSavePoint (Const Release :Boolean = False);
          Overload;

Espero esto sea de utilidad.

Un abrazo opcional.

Al González.

Última edición por Al González fecha: 10-07-2007 a las 17:12:20.
Responder Con Cita
  #5  
Antiguo 10-07-2007
luigi_cr luigi_cr is offline
Miembro
 
Registrado: jul 2007
Ubicación: Costa Rica
Posts: 39
Poder: 0
luigi_cr Va por buen camino
la idea no era comparar si vb o delphi es mejor, yo me quedo con JAVA, pero bueno para que voy a sobrecargar un metodo diez veces si la funcion q cumple es la misma, es decir voy a digitar diez veces el mismo codigo noo, para eso son los parametros opcionales, el procedimiento siempre va hacer lo mimo lo unico que va cambiar es el resultado.
Responder Con Cita
  #6  
Antiguo 10-07-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.572
Poder: 27
egostar Va camino a la fama
Cita:
Empezado por luigi_cr
la idea no era comparar si vb o delphi es mejor, yo me quedo con JAVA, pero bueno para que voy a sobrecargar un metodo diez veces si la funcion q cumple es la misma, es decir voy a digitar diez veces el mismo codigo noo, para eso son los parametros opcionales, el procedimiento siempre va hacer lo mimo lo unico que va cambiar es el resultado.
Bueno, todo surgió a raíz de tu comentario sobre lo que puedes hacer con VB o java y que Delphi NO puedes hacer.

Además, te han dado respuestas de porque no lo hace Delphi, si es mejor o peor no es el caso, mas bien el porque Delphi no lo maneja así.

Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #7  
Antiguo 10-07-2007
gabrielkc gabrielkc is offline
Miembro
 
Registrado: jun 2007
Ubicación: Chihuahua Mexico
Posts: 118
Poder: 19
gabrielkc Va por buen camino
En delphi se puede hacer una llamada a un procedimiento evitando algún parámetro cuando se usa OLE:

Código:
           
 Mar:=CreateOleObject('Excel.Application');
 Mar.WorkBooks.Open(ExtractFilePath(Application.ExeName)+'\Producto_Terminado_bco.xls');
 Mar.Sheets[1].Copy(,Mar.Sheets[1]);
El código anterior copia la primera hoja de el documento después de la hoja 1, la declaración del procedimiento es el siguiente:

Código:
     procedure Copy(Before, After: OleVariant; lcid: Integer); safecall;
Responder Con Cita
  #8  
Antiguo 10-07-2007
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.610
Poder: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Hola de nuevo!

Cita:
Empezado por luigi_cr
...para que voy a sobrecargar un metodo diez veces...
¿Alguien te sugirió que hicieras tal cosa? De hecho, si ese fuese el derrotero, no serían 10 sobrecargas sino casi mil.

Insisto que un método con 10 parámetros es algo que despierta muchas dudas respecto a una buena estructuración de clases. ¿Por qué no nos das un poco de contexto para ampliar el panorama y afinar propuestas?

Te invito a leer de nuevo mi comentario anterior.

Un abrazo incomparable.

Al González.

Última edición por Al González fecha: 10-07-2007 a las 19:35:14.
Responder Con Cita
  #9  
Antiguo 10-07-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 27
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #10  
Antiguo 11-07-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.437
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #11  
Antiguo 14-07-2007
luigi_cr luigi_cr is offline
Miembro
 
Registrado: jul 2007
Ubicación: Costa Rica
Posts: 39
Poder: 0
luigi_cr Va por buen camino
Thumbs up 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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
¿como llamo un procedimiento almacenado? jeshu252006 Conexión con bases de datos 6 28-10-2006 17:49:55
Parametros Opcionales no Parametros por defecto Velia Varios 7 19-08-2006 15:18:42
Parametros Opcionales c748a Varios 5 21-09-2005 04:53:25
Parametros Opcionales en Procedures/Functions Enan0 Varios 4 03-03-2005 10:32:30
Parametros opcionales en SELECTs Gydba Firebird e Interbase 4 22-04-2004 22:46:38


La franja horaria es GMT +2. Ahora son las 03:41:39.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi