Fala Radizeiros e Radizeiras, tudo bem com vocês?
Quando trabalhamos com as boas práticas em nossos projetos,é notório a facilidade em dar uma manutenção, e até mesmo criar novas funcionalidades.
E por este motivo nesta nossa série de post sobre boas práticas, estou mostrando como reduzir o acoplamento no acesso a dados.
Evitando ter que espalhar código SQL em todo o projeto, ou em cada projeto colocar um componente de acesso a dados.
Isso não nos dá a possibilidade de num futuro ter que atualizar esse nosso driver de conexão.
Nos posts anteriores você aprender a criar uma classe de conexão e a de query, colocar essa classe conexão ativa em uma base de dados, setando seus parâmetros.
No post de hoje você verá como criar as entidades.
Caso você ainda não tenha ouvido falar, ou se ouviu mas tem algumas duvidas.
De uma forma geral as entidades nada mais são do que representações das tabelas do banco de dados.
Isso mesmo, é uma representação lógica do que temos em uma base de dados.
E para isso, iremos criar uma entidade de usuários.
Mas primeiro irei adicionar um DBNavigator na nossa tela para que possamos manipular os dados melhor.
Para que o FDQuery passe as informações que precisamos, iremos ter que passar um SQL.
Algo bem simples nesse momento.
Nós precisamos dentro do nosso projeto, onde nossa query retorna para nós uma opção onde eu possa inserir uma instrução SQL.
Simplesmente irei criar na minha interface de Query um método chamado SQL que recebe uma string, para que possamos passar para ela a instrução SQL.
iQuery = interface function SQL(Value : String) : iQuery; end; ... function TModelQueryFiredac.SQL(Value: String): iQuery; begin Result := Self; FQuery.Open(Value); end;
Observe que simplesmente passei o valor da instrução SQL diretamente na nossa query, isso poderia estar separado mas para fins didáticos estou lhe mostrando as possibilidades.
Agora já podemos executar uma instrução SQL tranquilamente.
Mas não irei fazer isso agora, pois temos que separar as responsabilidades.
Dentro do componente Query estávamos executando um select na tabela de users do nosso banco de dados.
E nesse primeiro momento só criamos uma conexão e uma query.
Agora iremos precisar de uma classe específica para a tabela de usuários.
Lembra que falei no início?
Devemos ter uma representação lógica da nossa tabela do banco de dados representada em forma de classe em Delphi.
Neste momento não estou trabalhando com ORM, e nem com mapeamento do banco de dados.
Estou continuando trabalhando de forma RAD, com os componentes do Delphi, só que a nível de programação.
Permitindo baixo acoplamento, um código reutilizável, código mais bem escrito, seguindo as boas práticas do SOLID e muito mais.
type TModelEntidadeUsuario = class(TInterfacedObject, iEntidade) private FQuery : iQuery; public constructor Create; destructor Destroy; override; class function New : iEntidade; end; implementation constructor TModelEntidadeUsuario.Create; begin end; destructor TModelEntidadeUsuario.Destroy; begin inherited; end; class function TModelEntidadeUsuario.New : iEntidade; begin Result := Self.Create; end;
Observe no código acima que para que criemos uma interface mais genérica chamada iEntidade, isso nos dá a possibilidade de utilizar essa interface em todas as minhas entidades.
Para trabalharmos com a entidade de usuário, precisamos de dois componentes, o de conexão e o query.
Mas como a nossa classe de query já está recebendo a conexão, eu simplesmente estou criando um objetos do tipo da interface de query.
Muito legal quando separamos cada responsabilidade nos seus devidos lugares, em vez de colocar tudo dentro de um componente ou diretamente em uma classe.
Desta forma estamos reduzindo o acoplamento e dando a possibilidade de estender nosso projeto para novas funcionalidades.