Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-04-2008
cestradar cestradar is offline
Miembro
 
Registrado: ene 2008
Posts: 24
Poder: 0
cestradar Va por buen camino
Al incluir un Uses ¿se carga todo a memoria?

Hola

La duda es la expresada en el título, no he encontrado en la ayuda de delphi (o no he sabido buscar) algo que me indique cómo es la repercusión de incluir uses muy extensos para solo usar una o dos funciones de los mismos.

Por ejemplo, creo recordar que en este foro alguien mencionó que no era conveniente incluir la libería DateUtils para usar solo la función IsLeapYear, pero alguien más le refutó diciendo que Delphi no carga toda la librería, solo la parte que se ocupa.

La duda ha resurgido por que alguien me solicita hacer una unidad con varias decenas de funciones y que ahí todos vayamos agregando las funciones que vayamos haciendo en nuestros proyectos y luego la podremos incluir en cada uno de ellos, y no estamos seguros si eso sea conveniente, es decir, tener una unidad que con el tiempo irá creciendo cada vez más para solo usar unas pocas funciones que la mayoría no son de más 20 lineas, queremos documentarnos sobre ello.

gracias por la información que puedan aportarme

Saludos
Responder Con Cita
  #2  
Antiguo 24-04-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Tengo entendido (pido que me corrijan si me equivoco por favor) de que el compilador sólo añade las referencias de las funciones y/o procedimientos que se emplean de cada unit que se añada.

Ahora me queda la duda si es conveniente de que sigan ampliado una misma unit. Es "peligroso" realizar este proceso, sobre todo si las funciones y/o procedimientos no poseen Alta Cohesión entre ellas.
Lo más conveniente es que reestructuren el diseño de dicha unit para garantizar una mejor Alta Cohesión y a su vez esto les permitirá llegar a un Bajo Acoplamiento.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 24-04-2008
cestradar cestradar is offline
Miembro
 
Registrado: ene 2008
Posts: 24
Poder: 0
cestradar Va por buen camino
Eso es precisamente lo que no nos agrada, esta persona esta acostumbrada a trabajar así, con una unit a manera de repositorio de utilerias genéricas (una función que regrese un dataset de un Excel, una función que abra un data set, otra que ejecute un query, etc, etc) y no nos convence eso.

Voy a documentarme sobre las referencias específicas que mencionas para poder descartar un problema por ese lado, voy a tratar de convencer de que en lugar de tener esta unit con funciones de todo tipo, hacer varias conforme la esencia de cada una de ellas; aunque me sigue quedando la duda sobre la utilidad real de una unit de operaciones de bases de datos, y digo, un método para abrir un DataSet mandado de parámetro o ejecutar un query, buscar un registro, etc, no sé exactamente que ta bueno sea, ya que en cada método hay que crear el objeto DataSet, configurarlo, hacer lo que se tenga que hacer y regresar un valor que sea usado en un evento donde también se tuvo que crear una variable DataSet y todo eso.

No se por que no trabajar con componentes en un datamudule como lo hemos hecho tradicionalmente. A lo mejor yo soy el que no ve la "ventaja" que esto me puede ofrecer, por ello mismo me trato de informar

Gracias
Responder Con Cita
  #4  
Antiguo 24-04-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
El tema de la unidad DateUtils es muy particular. Si te fijas, toda la unidad se basa en FormatDatetime, EncodeDateTime y DecodeDatetime, el resto.... y mira la cantidad de funciones que hay, se llaman entre sí y de forma escalonada.

Sólo quieres usar una función, pero si de forma escalonada se ejecutan 10 funciones, obviamente, las 10 funciones irá en el ejecutable final.

Sobre crear tus propias bibliotecas, bueno, es inevitable, pero más vale que sigas un esquema como la vcl, en mi caso:
lpDateUtils (LP = Lepes)
lpForms
lpClasses
lpconstantes (saltolinea, saltoCarro, etc)
lpTipos (excepciones personalizadas, etc).


Los casos que explicas no veo necesario crear unidades, pero, por ejemplo, todos tenemos una función llamada:

function Createqry(sql:string):TQuery

o ¿no?

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 24-04-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
[Paréntesis]
No lo puedo creer. Sé que nunca has mencionado tu nombre real en estos foros amigo Lepe, pero, no me vas a decir que incluso en el prefijo de tus funciones y librerías usas Lepe.
[/Paréntesis]

// Saludos
Responder Con Cita
  #6  
Antiguo 24-04-2008
Avatar de Dedalo
Dedalo Dedalo is offline
Miembro
 
Registrado: abr 2008
Ubicación: Albacete (España)
Posts: 32
Poder: 0
Dedalo Va por buen camino
Si no me equivoco, el compilador de Delphi tiene una opcion en el proceso de compilacion de eliminacion de codigo muerto, es decir, que elimina todos los objetos y funciones no utilizados, asi se reduce el tamaño del ejecutable. Esa opcion en los compiladores de C de Borland esta OFF por defecto, mira si la encuentras en Delphi y como esta...
Responder Con Cita
  #7  
Antiguo 25-04-2008
cestradar cestradar is offline
Miembro
 
Registrado: ene 2008
Posts: 24
Poder: 0
cestradar Va por buen camino
Cita:
Empezado por Lepe Ver Mensaje
...

Los casos que explicas no veo necesario crear unidades, pero, por ejemplo, todos tenemos una función llamada:

function Createqry(sql:string):TQuery

o ¿no?

mmmmmmmmmmmmmmm, no, no todos

¿Qué ventaja me da tener esa función en una librería a tener un componente TQuery? , digo, igual voy a configurarlos, ya sea con parámetros o desde código.
¿ahorro de código?, igual voy a definir variables tipo TQuery o TDataSet para recibir esa función, no le veo la utilidad real
Responder Con Cita
  #8  
Antiguo 25-04-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Cita:
Empezado por cestradar Ver Mensaje
mmmmmmmmmmmmmmm, no, no todos

¿Qué ventaja me da tener esa función en una librería a tener un componente TQuery? , digo, igual voy a configurarlos, ya sea con parámetros o desde código.
¿ahorro de código?, igual voy a definir variables tipo TQuery o TDataSet para recibir esa función, no le veo la utilidad real
Pues como bien comentas, ahorro de código...

No es lo mismo hacer:

Código Delphi [-]
var
  AQuery1: TQuery;
  AQuery2: TQuery;

begin
  AQuery1 := TQuery.Create(nil);
  with AQuery1 do
    try
      SQL.Text := 'select * from tabla1';
      Prepare;
      Open;
      // Código X aquí
    finally
      Free
    end;
  AQuery2 := TQuery.Create(nil);
  with AQuery2 do
    try
      SQL.Text := 'select * from tabla2 where campo1 = 5';
      Prepare;
      Open;
      // Código X aquí
    finally
      Free
    end;
  AQuery1 := TQuery.Create(nil);
  with AQuery1 do
    try
      SQL.Text := 'select * from tabla3 where campo1 = 7 and campo2 = ''Hola''';
      Prepare;
      Open;
      // Código X aquí
    finally
      Free
    end;
end;

A tener algo como:

Código Delphi [-]
unit MyFunctions;

interface

uses
  Classes, DB;

function CreateQuery(SQLStr: string): TQuery;

implementation;

function CreateQuery(SQLStr: string): TQuery;
begin
  Result := TQuery.Create(nil);
  with Result do
  begin
    SQL.Text := SQLStr;
    Prepare
  end
end;

end.


unit Form1;

interface

// ...

implementation

uses MyFunctions;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with CreateQuery('select * from tabla1') do
    try
      Open;
      // Código X
    finally
      Free
    end;
  with CreateQuery('select * from tabla2 where campo1 = 5') do
    try
      Open;
      // Código X
    finally
      Free
    end
end;

end.

Ves la diferencia?

Me ahorré declarar 2 variables y re-escribir bastante código...


Saludos...
Responder Con Cita
  #9  
Antiguo 25-04-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Sé que nunca has mencionado tu nombre real en estos foros amigo Lepe,
No puedes afirmar eso, has estado ausente mucho tiempo

Cita:
Empezado por roman Ver Mensaje
pero, no me vas a decir que incluso en el prefijo de tus funciones y librerías usas Lepe.
[/Paréntesis]

// Saludos
No uso prefijo en funciones. En el nombre de las unidades sí, para seguir los nombres de la VCL.


CreateQry la uso cuando necesito temporalmente ejecutar una sentencia SQL, pero no quiero tener un TQuery en el Datamodule o en el TForm sólo para una llamada, al final acaba estorbando más que ayudando, por eso uso la rutina que crea, configura la consulta y opcionalmente la ejecuta:
Código Delphi [-]
function Createqry(sql:string):TQuery;
begin
  Result := TQuery.Create(nil);
  Result.DatabaseName:=  el que sea
  Result.sql.text := sql;
end;

function ExecSql(sql:string):integer;
var q:TQuery;
begin
   q := Createqry(sql);
   q.ExecSql;
    Result := q.RowsAffected;
   q.Free;
end;

Muchas veces necesitas una consulta de forma puntual, sólo para actualizar un registro, etc. Tener que poner un TQuery en la ventana (o datamodule), configurarlo, ponerle nombre, y por último llamarlo desde código es "perder el tiempo", "ExecSql" son 7 letras más el SQL y listo .

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #10  
Antiguo 25-04-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Lepe
No puedes afirmar eso, has estado ausente mucho tiempo
Las leyes de la lógica son inmutables. Además, tengo un código que examina las paginas de los foros y me avisaría en cuanto dieras tu nombre

Pero a ver, para que no se diga que nada más ando en este hilo fuera de tema les voy a dar mi opinión: no estoy de acuerdo.

El ejemplo de mayenes (quien me debe una cerveza desde hace tiempo) no me convence de la necesidad de CreateQuery. Esas dos Queries que construye, ¿por qué no están en un DataModule? Si estuvieran ahí en primera instancia, ahorraría todavía más código.

Ahora, para una consulta puntual, también se puede tener una Query genérica para eso. Porque, si sólo se tiene una consulta puntual en todo el código, haber definido una función es más trabajo del necesario, así que asumo que se trata de varias consultas puntuales, pero, como digo, para ello se puede usar un query genérico.

Al final de cuentas, creo, el punto está en, ¿por qué queremos construir componentes Query por código?



pd: lo digo un poco por molestar, pero es que no me han convencido.

// Saludos
Responder Con Cita
  #11  
Antiguo 25-04-2008
Avatar de MAXIUM
MAXIUM MAXIUM is offline
Miembro
 
Registrado: may 2005
Posts: 1.488
Poder: 20
MAXIUM Va camino a la fama
Creo que se han desviado del tema central.
Responder Con Cita
  #12  
Antiguo 25-04-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Pero a ver, para que no se diga que nada más ando en este hilo fuera de tema les voy a dar mi opinión: no estoy de acuerdo.

El ejemplo de maEyAnes () (quien me debe una cerveza desde hace tiempo) no me convence de la necesidad de CreateQuery. Esas dos Queries que construye, ¿por qué no están en un DataModule? Si estuvieran ahí en primera instancia, ahorraría todavía más código.

Al final de cuentas, creo, el punto está en, ¿por qué queremos construir componentes Query por código?



pd: lo digo un poco por molestar, pero es que no me han convencido.

// Saludos
Anda ya... te debo una cerveza? xDDD

No me acordaba

Y sobre mi ejemplo, en realidad fue algo que escribí así de bote pronto... y bueno... para mi si es práctico, por que solo creas el objeto al momento de usarlo, ejecutas el query, obtienes el resultado y lo liberas de la memoria...

Ahora, yo mayormente uso Interbase/Firebird y los componentes IBX, y estoy tienen un componente llamado TIBSQL el cual es más ligero en memoria, y para queries donde solo necesito obtener un valor rapidamente son mejores.

Cita:
Empezado por Delphi Help
TIBSQL

Use an TIBSQL component for data operations that need to be fast and lightweight. Operations such as data definition and pumping data from one database to another are suitable for IBSQL components.
Saludos...
Responder Con Cita
  #13  
Antiguo 25-04-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Cita:
Empezado por MAXIUM Ver Mensaje
Creo que se han desviado del tema central.
Algo raro en estos foros...


Saludos
Responder Con Cita
  #14  
Antiguo 27-04-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Roman... por favor!!. en fin, que tendré explayarme....

Cuando tienes un query en un datamodule para reusarlo en diversas ocasiones, pronto te das cuenta que si "tal ventana está abierta, puede estar usando dicha consulta, si ahora abres otra ventana que reutiliza el mismo query, podrías tener problemas" (ejem, aplica la ley de murphy ), si tienes una aplicación SDI tienes que pensar el orden de creación de ventanas y en qué orden se van a mostrar para que no se solapen dos ventanas que usan el mismo TQuery. Si tienes una MDI no queda otra que usar otra consulta genérica... y ya son dos TQuerys creadas desde el inicio del datamodule hasta que se destruya (en el mejor de los casos).

Ventajas de usar el CreateQry:
- Menos tiempo de diseño en configurar propiedades: El IDE es muy bueno y bonito, pero repetir tareas es una lata: asignar database, sql, sessionName , poner el TQuery en un sitio que no moleste

- Algo más eficiente con la RAM: sólo está creado el tiempo estrictamente necesario.

Inconvenientes:
- Tener que añadir el "uses", eso si que es un coñazo

Saludos.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #15  
Antiguo 27-04-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por Lepe Ver Mensaje
El IDE es muy bueno y bonito, pero repetir tareas es una lata: asignar database, sql, sessionName , poner el TQuery en un sitio que no moleste
Cita:
Empezado por Lepe Ver Mensaje
Tener que añadir el "uses", eso si que es un coñazo
Ummmm no se...
Lepe + cualquier pedacitos de papel para diagramas y apuntes + CreateQry = rácano y vago.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #16  
Antiguo 28-04-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Desde luego, tener varias ventanas disponibles para un mismo proceso, cambia muchas cosas del diseño, entre las cuales está la de crear objetos Query durante la ejecución. Pero no todos los sistemas son así y en muchos casos crear un query en ejecución no es necesario. Por otra parte, la ínfima memoria utilizada para mantener un query genérico en un datamodule, difícilmente puede considerarse una ventaja por sobre la creación por código. Ahora bien, la asignación del sessionname, database que mencionas, ¿no estás hablando en serio al ponerlo como una desventaja, verdad? Usando un CreateQuery ¿evitas esa asignación? Quizá te refieres a que lo hace una sóla vez, pero ignoro porque habría de hacerlo varias veces usando un Query genérico en tiempo de diseño.

En resumen, si utlizas un diseño concurrente, es decir, donde un mismo proceso puede accederse varias veces simultáneas, pues desde luego que es necesario crear objetos en ejecución, pero va mucho más allá de un CreateQuery. Para otro tipo de aplicaciones, sigues sin convencerme.

// Saludos
Responder Con Cita
  #17  
Antiguo 28-04-2008
cestradar cestradar is offline
Miembro
 
Registrado: ene 2008
Posts: 24
Poder: 0
cestradar Va por buen camino
Yo opino exactamente sobre este tema como Roman, me alegro que haya sido él y no yo quien sostuviera este punto de vista, ya que así es más factible que se profundizara en el tema .
Responder Con Cita
Respuesta



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
Aplicacion carga muchas fichas en memoria. zugazua2001 Varios 4 06-09-2005 17:40:41
cxGrid opcion dejar todo el resultado en memoria?? sakuragi OOP 0 26-07-2005 16:38:27
Incluir DLL en Ejecutable senpiterno Varios 1 24-01-2005 13:39:03
error al incluir bde en el uses arc22 Conexión con bases de datos 1 28-06-2004 09:53:06


La franja horaria es GMT +2. Ahora son las 11:27:06.


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
Copyright 1996-2007 Club Delphi