Fórum Qual a melhor maneira para utilizar bibliotecas? #256369
27/10/2004
0
Creio que muita gente por aí, acaba caindo na tentação e cria uma unit chamada ´untBiblioteca´ ou ´untFuncoes´ e ´enfia´ os procedimentos na unidade. Simples, apenas inserir o nome dessa unidade em ´uses´ de outra unidade e pronto! Lá estão os meus procedimentos...
Uma forma não legal de se programar, né? Pois é, mas a dúvida é a seguinte: Qual a melhor maneira de criar uma hierarquia de bibliotecas? Ainda mais com a chegada do .NET (POO na linha!). Lá mesmo no .NET da Microsoft, os meus assemblies organizados através de namespaces, por exemplo, System.NamespaceNome1... Se eu inserir esse namespace em uses, eu utilizo os procedimentos apenas pela chamada ao nome... Como poderia fazer da mesma forma, mas com Win32?
[]´s
Michaell
Curtir tópico
+ 0Posts
27/10/2004
Vinicius2k
É ? Sempre fiz isso e nunca ouvi nenhuma opinião contrária...
Estas minhas libs são ´repositórios´ e são utilizadas de forma compartilhada em todas as minhas aplicações...
Bem, não sei nada de O.O e se este procedimento não for correto realmente, espero aprender o correto neste tópico. :wink:
T+
Gostei + 0
28/10/2004
Michaell
Colega,
Não disse que é incorreto... Disse que não seria, talvez, um modelo de P.O.O. . Minha dúvida é: qual a melhor maneira, seguindo P.O.O. de se criar, o que você chamou, de Repositório? Como a Borland conseguiu portar a VCL para .NET? Através de class helpers, não foi? Pois eles tinham esse modelo na VCL (Várias unidades com seus métodos, tipos e procedimentos).
[]´s
Gostei + 0
28/10/2004
Vinicius2k
Não questionei sua pergunta... apenas acrescentei que, face a sua colocação, também fiquei em dúvida do que seria correto ou não trabalhar da forma que trabalho...
Só reforcei sua pergunta...
T+
Gostei + 0
28/10/2004
Michaell
:?
Gostei + 0
28/10/2004
Bon Jovi
Nao vou explicar muito em palavras, pois tem milhares de artigos pela Internet sobre OOP. Mas veja o exemplo boneca q fiz abaixo pra vc ter uma idéia:
Unit de biblioteca:
//Procedimentos globais para manipulação de banco de dados unit GlobalDB; interface uses Db, DbClient; type TGlobalDb = class(TObject) private FConnection: TCustomConnection; //... //... public property Connection: TCustomConnection read FConnection write FConnection; function OpenDataSet(SQLText: string): TClientDataSet; function ExecCommand(SQLText: string): integer; function ObtemNovoID(Tabela, Campo: string): integer; overload; function ObtemNovoID(Tabela, Campo, Where: string): integer; overload; //... //... end; implementation function TGlobalDb.OpenDataSet(SQLText: string): TClientDataSet; begin //... end; function TGlobalDb.ExecCommand(SQLText: string): integer; begin //... end; function TGlobalDb.ObtemNovoID(Tabela, Campo: string): integer; begin //... end; function TGlobalDb.ObtemNovoID(Tabela, Campo, Where: string): integer; begin //... end; end.
DataModule qualquer usando a instancia da classe TGlobalDb no programa:
unit Unit2;
interface
uses
SysUtils, Classes, GlobalDb, DB, ADODB;
type
TDataModule2 = class(TDataModule)
ADOConnection1: TADOConnection;
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
private
{ Private declarations }
oGlobalDb: TGlobalDb;
procedure TesteExecutaAlgo;
public
{ Public declarations }
end;
implementation
{$R *.dfm}
uses
DbClient;
procedure TDataModule2.DataModuleCreate(Sender: TObject);
begin
oGlobalDb := TGlobalDb.Create;
oGlobalDb.Connection := ADOConnection1;
end;
procedure TDataModule2.TesteExecutaAlgo;
var
DataSet: TClientDataSet;
begin
DataSet := oGlobalDb.OpenDataSet(´SELECT...´);
try
//...
finally
DataSet.Free;
end;
//...
if oGlobalDb.ExecCommand(´INSERT INTO...´) = 1 then
//...
end;
procedure TDataModule2.DataModuleDestroy(Sender: TObject);
begin
oGlobalDb.Free;
end;
end.
Em resumo, basicamente vc sempre deve usar classes. Nao criar funções e nem variáveis sem q pertença a uma classe. E uma variável de uma classe nao pode ser acessada diretamente por uma instancia de outra classe, devendo-se criar uma property. Esse assunto é longo, dê uma pesquisada, mas acho q até aí já da pra seguir OOP a um bom nível no Delphi. Bom nível por Delphi VCL nao ser 100¬ OO, começando pelo tipo string que não é uma classe...
Sobre ´namespaces hierarquizados´, isso nao existe na VCL Win32 atualmente. Parece q só na versão 2005.
Gostei + 0
29/10/2004
Michaell
DataModule qualquer usando a instancia da classe TGlobalDb no programa:
unit Unit2;
interface
uses
SysUtils, Classes, GlobalDb, DB, ADODB;
type
TDataModule2 = class(TDataModule)
ADOConnection1: TADOConnection;
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
private
{ Private declarations }
oGlobalDb: TGlobalDb;
procedure TesteExecutaAlgo;
public
{ Public declarations }
end;
implementation
{$R *.dfm}
uses
DbClient;
procedure TDataModule2.DataModuleCreate(Sender: TObject);
begin
oGlobalDb := TGlobalDb.Create;
oGlobalDb.Connection := ADOConnection1;
end;
procedure TDataModule2.TesteExecutaAlgo;
var
DataSet: TClientDataSet;
begin
DataSet := oGlobalDb.OpenDataSet(´SELECT...´);
try
//...
finally
DataSet.Free;
end;
//...
if oGlobalDb.ExecCommand(´INSERT INTO...´) = 1 then
//...
end;
procedure TDataModule2.DataModuleDestroy(Sender: TObject);
begin
oGlobalDb.Free;
end;
end.
[/quote:612d120456]
Beleza, até aí tudo bem. Nesse código você teve que Criar (Create) o objeto e Destruir (Free). OOP... legal... Mas a minha dúvida, ainda, é: Como eu acesso um procedimento sem ter que instanciar a classe, ou seja, Exemplo:
unit Dialogs:
//... procedure ShowMessage(const Msg: string); //... procedure ShowMessage(const Msg: string); begin ShowMessagePos(Msg, -1, -1); end; /...
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
oGlobal: TGlobalDb;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(´Mensagem´);
end;
end.
Observer que eu chamo apenas ´ShowMessage´ e não algo do tipo Dialogs.ShowMessage(). Entendeu??
Da mesma forma no .NET . Eu declaro System.Windows.Forms e chamo os procedimentos diretamente pelo nome sem precisar digitar System.Windows.Forms.AlgumCódigo ... E muito menos Criar (Create) ou Destruir (Free) . Garbage Collection?
Como fazer isso com Delphi?
[]´s
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)