Fórum Qual a melhor maneira para utilizar bibliotecas? #256369

27/10/2004

0

Pessoal,

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

Michaell

Responder

Posts

27/10/2004

Vinicius2k

Uma forma não legal de se programar, né?

É ? 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+


Responder

Gostei + 0

28/10/2004

Michaell

É ? 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+


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


Responder

Gostei + 0

28/10/2004

Vinicius2k

Acho que você me interpretou mal...
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+


Responder

Gostei + 0

28/10/2004

Michaell

Tudo bem, colega... Bom, no final das contas, estou sem respostas...
:?


Responder

Gostei + 0

28/10/2004

Bon Jovi

Tb acho indispensável seguir sempre a OOP, e sigo, mas no Delphi VCL isso nunca foi rígido, não sendo ruim trabalhar de forma híbrida se o programador souber organizar bem as rotinas, se preocupar ao máximo com a flexibilidade, reutilização e facilidade de manutenção futura. O que não pode haver nunca é código macarrônico.

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.


Responder

Gostei + 0

29/10/2004

Michaell

[quote:612d120456=´Bon Jovi´]
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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar