Paramentros

Criando parâmetros para o sistema usando Padrão Singleton e Iterator

 

Muitas vezes precisamos criar parâmetros para o sistema e devido no início do desenvolvimento do sistema esses parâmetros serem poucos, cometemos algumas “gafes”, se assim posso dizer, ao criar esses parâmetros. Veja como podemos resolver usando padrões de projetos Singleton e Iterator.

O Cenário

O sistema possui uma tabela que armazena os dados do que o usuário pode ou não fazer no sistema e todo ponto onde existe uma opção parametrizável para funcionamento é necessário acessar essa tabela no banco para verificar se pode ou não fazer determinada operação.

O Problema

A tabela passou a ter mais de 400 campos, pois cada campo é um parâmetro, chegando ao ponto de ter que ser criado uma nova tabela para criação de novos parâmetros e essa tabela toda vez que fosse acessada, havia uma lentidão(as vezes quase imperceptível, mas existia). Sem falar no fato que acessar o banco toda vez para checar um parâmetro que não irá mudar durante a execução do sistema é uma operação desnecessária.

A Solução

Criar uma classe de parâmetros usando o padrão singleton e na primeira vez que fosse executada armazenasse todos os parâmetros(a lentidão existiria somente no primeiro acesso a classe)  executando o padrão iterator para criar e gerenciar a lista dos parâmetros, assim as próximas vezes que fosse necessário verificar se é permitido realizar alguma operação, que é parametrizada, não acessaria o banco de dados e o retorno seria muito mais rápido.

O Código

Foi criado um exemplo para testar a teoria antes de implementar no sistema, nele temos um exemplo de adicionar parâmetros no código do botão:

TParametros.New.AddParametros(
TParametro.new
.Nome_parametro(Edit1.Text)
.Value_parametro(edit2.Text) );

Com esse código varemos a tabela na primeira vez e criamos a instância da classe TParametros com todos os parâmetros nela.

Se tiver idéias de como aperfeiçoar esse código, compartilhe nos comentários abaixo.

Códigos Classe Iterator Parametros

unit Exe.IteratorParametros.Classe;

interface

uses
Exe.Parametros.Interf, System.Generics.Collections;

type
TIteratorParametros = class(TInterfacedObject, IIteratorParametros)
private
FListaParametros : TList<iParametro>;
FCount : Integer;
public
constructor Create;
destructor Destroy; override;
class function New: IIteratorParametros;
function hasNext : boolean;
function Next : iParametro;
function Current : iParametro;
function AddList(Value : TList<iParametro>) : iIteratorParametros;
end;

implementation

{ TIteratorParametros }

function TIteratorParametros.AddList(
Value: TList<iParametro>): iIteratorParametros;
begin
Result := Self;
FListaParametros := Value;
FCount := 0;
end;

constructor TIteratorParametros.Create;
begin
FCount := 0;
end;

function TIteratorParametros.Current: iParametro;
begin
Result := FListaParametros[Fcount];
end;

destructor TIteratorParametros.Destroy;
begin

inherited;
end;

function TIteratorParametros.hasNext: boolean;
begin
Result := not (FCount = FListaParametros.Count);
end;

class function TIteratorParametros.New: IIteratorParametros;
begin
Result := Self.Create;
end;

function TIteratorParametros.Next: iParametro;
begin
Result := FListaParametros[Fcount];
inc(FCount);
end;

end.

Código Classe Parametro

unit Exe.Parametro.Classe;

interface

uses
Exe.Parametros.Interf;

type
TParametro = class(TInterfacedObject, IParametro)
private
FNome : String;
FValue : String;
public
constructor Create;
destructor Destroy; override;
class function New: IParametro;
function Nome_parametro(vNome : String) : IParametro;
function Value_parametro(vValue : String): IParametro;
Function GetNome_parametro : String;
Function GetValue_parametro : String;
end;

implementation

{ TParametro }

constructor TParametro.Create;
begin

end;

destructor TParametro.Destroy;
begin

inherited;
end;

function TParametro.GetNome_parametro: String;
begin
result := FNome;
end;

function TParametro.GetValue_parametro: String;
begin
Result := FValue;
end;

class function TParametro.New: IParametro;
begin
Result := Self.Create;
end;

function TParametro.Nome_parametro(vNome : String): IParametro;
begin
Result := Self;
FNome := vNome;
end;

function TParametro.Value_parametro(vValue : String): IParametro;
begin
Result := Self;
FValue := vValue;
end;

end.

Código Classe Parametros

unit Exe.Parametros.Classe;

interface

uses
Exe.Parametros.Interf, Exe.IteratorParametros.Classe,
System.Generics.Collections;

type
TParametros = class
private
class var Finstance : TParametros;
FParametros : TList<iParametro>;
FIteratorParametros : iIteratorParametros;
public
constructor Create;
destructor Destroy; override;
class function New: TParametros;
Function AddParametros(value : iParametro) : iIteratorParametros;
function Parametros : iIteratorParametros;
Function BuscaParametro (Nome : String) : String;
end;

implementation

 

{ TParametros }

function TParametros.BuscaParametro(Nome: String): String;
var
lst : iIteratorParametros;
Value : String;
begin
value := ”;
lst := TParametros.New.Parametros;
while lst.hasNext do
begin
if lst.Current.GetNome_parametro = Nome then
Value := lst.Next.GetValue_parametro
else
lst.Next;
end;
if Value <> ” then
Result := Value
else
Result := ‘-1’;
end;

constructor TParametros.Create;
begin
FParametros := TList<iParametro>.Create;
FIteratorParametros := TIteratorParametros.new;
end;

destructor TParametros.Destroy;
begin
FParametros.Free;
inherited;
end;

class function TParametros.New: TParametros;
begin
if not Assigned(Finstance) then
Finstance := Self.Create;
Result := Finstance;
end;

 

function TParametros.Parametros: iIteratorParametros;
begin
result := FIteratorParametros.AddList(FParametros);
end;

function TParametros.addParametros(value : iParametro) : iIteratorParametros;
begin
FParametros.Add(Value);
end;

end.

Código Interface Parametros

unit Exe.Parametros.Interf;

interface

uses
System.Generics.Collections;

Type
iParametro = Interface
[‘{55385F61-C645-4B5D-B7F1-56A957D54A31}’]
function Nome_parametro(vNome : String) : IParametro;
function Value_parametro(vValue : String): IParametro;
Function GetNome_parametro : String;
Function GetValue_parametro : String;
End;

iIteratorParametros = interface
[‘{F58ADF29-83D8-402D-8121-F618CFAAC31E}’]
function hasNext : boolean;
function Next : iParametro;
function Current : iParametro;
function AddList(Value : TList<iParametro>) : iIteratorParametros;
end;

implementation

end.

 

Para baixar os fontes:

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *