Fala Radizeiro e Radizeira, tudo bem com vocês?
Vocês sempre irão me ver falando sobre a utilização das boas práticas em projetos Delphi.
E minha maior preocupação é que projetos tenham maior tempo de vida.
Isso mesmo!
Quando nós programamos 100% RAD, colando componentes na tela, e não se preocupando no futuro de seus projetos, você terá uma manutenção muito custosa.
Quando possuímos um projeto totalmente acoplado ficamos reféns de componentes que usamos, sem a possibilidade de uma atualização, ou melhorias nos projetos.
Um projeto de software bem desenvolvido tem maior tempo de vida.
Todo projeto de software tem um tempo de vida, e sabemos o quanto as tecnologias têm evoluído, e nossos usuários também.
Então temos que estar sempre atentos a esses padrões e fazer com que nossos projetos tenham maior tempo, e sejam mais práticos as suas manutenções.
No post anterior criamos nossa classe de conexão, e ficou top.
Dessa forma conseguimos ter maior flexibilidade na hora de mudar o driver de conexão.
E para que possamos ter os dados, devemos ter um componente que nos retorne os dados solicitados, como por exemplo uma query.
No post de hoje iremos criar uma classe para trabalhar as informações do banco de dados.
Com isso iremos criar uma classe de query.
E esse nossa classe iremos criar para o FDQuery, você pode criar para qualquer um que você utilize hoje, seguido esse processo que irei mostrar hoje para vocês.
Essa nossa query CustomerTable é um FDQuery, que herda de um TFDQuery.
Nesse caso iremos criar uma nova unit chamada Model.Customers.Query.Firedac.pas.
Se repararmos nas propriedades do componente FDQuery, ela precisa de uma ligação com a conexão se não ela não irá funcionar.
A conexão não precisa se ligar a nada, mas a query sim.
Como ela precisa desta ligação, devemos então realizar uma injeção de dependência nessa nossa classe de query.
Como estamos trabalhando com a query específica do Firedac, irei primeiramente importar todas as units, ou seja, todas as dependências do Firedac para essa nossa classe.
Dentro do private dessa nossa classe irei adicionar um objetos do tipo da interface de conexão, e no método New e Create irei passar essa interface como um parent.
Desta forma iremos trabalhar com a injeção de dependência.
TModelQueryFiredac = class(TInterfacedObject, iQuery) private FParent : iConexao; public constructor Create(Parent : iConexao); destructor Destroy; override; class function New(Parent : iConexao) : iQuery; end;
Desta forma, todas as vezes que for instanciar minha query irei precisar a conexão.
E para que nossa query tenha receba essa conexão irei precisar instanciar e passar essa nossa conexão.
type TModelQueryFiredac = class(TInterfacedObject, iQuery) private FParent : iConexao; FQuery : TFDQuery; public constructor Create(Parent : iConexao); destructor Destroy; override; class function New(Parent : iConexao) : iQuery; end; implementation constructor TModelQueryFiredac.Create(Parent : iConexao); begin FParent := Parent; FQuery := TFDQuery.Create(FParent.Connection); end; destructor TModelQueryFiredac.Destroy; begin FQuery.Free; inherited; end; class function TModelQueryFiredac.New (Parent : iConexao) : iQuery; begin Result := Self.Create(Parent); end;
Observe que no create da nossa query ela recebe o Parent, que é nossa injeção de dependência, isso ocorre porque nossa query tem essa dependência.
Com isso, ao instanciar a query já passo para ela o Parent e o método que retorna a nossa conexão.
Se você observar essa nossa query está recebendo um método que tem como retorno uma classe mais ancestral possível, onde a maioria dos drivers de conexão do Delphi herda.
Desta forma, poderíamos criar nossa query mais genérica possível.
Mas para fins de conhecimento, e aquele pontapé para que possa abstrair ainda mais suas conexões e reduzir o acoplamento, estarei deixando dessa forma.
Mas com esse conhecimento é possível ir além e melhorar ainda mais seu projeto.
De forma prática e simples já possuímos uma classe de conexão, e uma de query.
A princípio estamos utilizando o Firedac.
Como falei anteriormente, é possível abstrair ainda mais essas nossas classes, para que elas possam instanciar uma classe que tenha a conexão que você quiser e precisar.
Desta forma não se preocupando com qualquer atualização de drivers de conexão que ocorrer no Delphi, pois basta criar um classe e instanciar na sua classe de conexão e pronto, todo seu projeto está com uma conexão atualizada.
Muito legal, não é pessoal?
Se você quer saber mais de como criar um todas essas abstrações, e desacoplamento?
Basta acessar o link abaixo e conhecer o Clube dos programadores Delphi.
Esse é um portal repleto de conteúdos Delphi, que irá abrir um oceano de possibilidades e técnicas para que possa lhe ajudar no seu dia a dia.