Ir para conteúdo
  • Cadastre-se

dev botao

Boas práticas com interfaces


Ver Solução Respondido por leandroaoa,
  • Este tópico foi criado há 762 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Olá,

Estou refatorando um sistema legado e me surgiu uma dúvida sobre boas práticas, espero que possam me ajudar.

Ambas as duvidas são relacionadas com o uso de interfaces, a primeira é sobre existir uma função na propriedade que devolve um objeto, para fazer a manipulação baseado nesse objeto, por exemplo:

Uma interface de cliente, iCliente._Objeto, devolve um TCliente, que da acesso aos dados do Cliente, outras funções seriam para manipular esse TCliente, por exemplo, um iCliente.Select(1) seria uma função para retornar o cliente de código 1, dentro do iCliente._Objeto. Depois ainda posso fazer um iCliente.Alterar, para persistir alterações que fiz no iCliente._Objeto. Deu pra entender? Esta é uma boa prática no uso de interfaces? Fiz isso pois achei que seria um retrabalho desnecessário criar uma função para cada propriedade de TCliente, dentro da interface;

A segunda dúvida, também sobre boas práticas com interfaces, é a de ter funções como "PreencherObjeto(Value : TForm)" que, recebendo um form, varre o mesmo utilizando RTTI e anotações nos componentes para preencher o _objeto da interface de forma automática, o contrário acontecendo com a função "PreencherView(Value : TForm)" que preenche a tela com os dados do _Objeto também utilizando RTTI e anotações nos componentes. Dessa forma consigo preencher uma tela com os dados de um Cliente, alterar o que quiser direto na tela e depois persistir as alterações sem precisar ficar alterando manualmente os dados no _Objeto.

Trago essas dúvidas até para levantar uma discussão, talvez essa estrutura seja claramente ruim, um incrivelmente bem distribuída, mas trabalho sozinho, aprendi a programar sozinho, as vezes fico em dúvida se o que estou fazendo pode ser melhor de alguma forma.

Agradeço desde já pela atenção!

Link para o comentário
Compartilhar em outros sites

Bom dia olha esse exemplo

  iDAO<T> = interface
    ['{D2E1E4DB-9123-4958-93EA-C66783954C23}']
    function Delete(aID : String) : iDAO<T>; overload;
    function Get(aJson : String) : iDAO<T>; overload;
    function IsEmpty(aValue : Integer) : Boolean;
    function Post: iDAO<T>; overload;
    function Put(aID : Integer) : iDAO<T>; overload;
    function This : T;
  end;

  iCliente = interface
    ['{5C97AD31-2732-4ABD-B249-A35A89F0AB29}']
    function Codigo (value : Integer) : iPessoa; overload;
    function Nome (value : String) : iPessoa; overload;
    function Codigo : Integer; overload;
    function Nome : String; overload;
  end;

  iFactory = interface
    ['{8102BA43-602A-41ED-ADE1-FD19C583D7E6}']
    function Cliente        : ilDAO<iCliente>;
    function Fornecedor : ilDAO<iFornecedor>;
  end;

  iController = interface
    ['{9B61B531-F1E0-4164-A511-E8CCF19D9EDC}']
    function Controller : iFactory;
  end;
 

um esqueleto simples é a forma que uso

Link para o comentário
Compartilhar em outros sites

Olá Leandro, valeu pela resposta! Interessante, dessa forma tu acaba trabalhando apenas com as interfaces sempre, no meu modelo eu tenho o TControllerCliente.New devolvendo a instancia do iCliente direto, talvez seja interessante a criação de uma factory para que o view não precise conhecer os controllers, acredito que seja uma alteração fácil de implementar e que daria um bom resultado nesse sentido. 
Outra coisa também é a interface de DAO, atualmente eu uso um iQuery diretamente ligado ao TIBQuery, como uso delphi 2010 é a opção que tenho, mas já sabia que para migrar seria doloroso. Não manjo muito de Generics para saber fazer a migração dessa parte, vou dar uma estudada, achei interessante esse formato.
Agora uma dúvida sobre o teu esqueleto, funções específicas como verificar o limite do cliente, tu usa diretamente no iCliente? e para a persistência dos dados, tu tens um mapeamento da tabela de cliente no banco de dados?

Link para o comentário
Compartilhar em outros sites

  • Moderadores
2 horas atrás, leandroaoa disse:

Bom dia olha esse exemplo

  iDAO<T> = interface
    ['{D2E1E4DB-9123-4958-93EA-C66783954C23}']
    function Delete(aID : String) : iDAO<T>; overload;
    function Get(aJson : String) : iDAO<T>; overload;
    function IsEmpty(aValue : Integer) : Boolean;
    function Post: iDAO<T>; overload;
    function Put(aID : Integer) : iDAO<T>; overload;
    function This : T;
  end;

  iCliente = interface
    ['{5C97AD31-2732-4ABD-B249-A35A89F0AB29}']
    function Codigo (value : Integer) : iPessoa; overload;
    function Nome (value : String) : iPessoa; overload;
    function Codigo : Integer; overload;
    function Nome : String; overload;
  end;

  iFactory = interface
    ['{8102BA43-602A-41ED-ADE1-FD19C583D7E6}']
    function Cliente        : ilDAO<iCliente>;
    function Fornecedor : ilDAO<iFornecedor>;
  end;

  iController = interface
    ['{9B61B531-F1E0-4164-A511-E8CCF19D9EDC}']
    function Controller : iFactory;
  end;
 

um esqueleto simples é a forma que uso

Acho que já vi essa estrutura em algum lugar.

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

  • Moderadores
2 horas atrás, leandroaoa disse:

Eu aprendi com os Cursos do nosso amigo @Thulio Bittencourt

como disse já tinha visto essa estrutura srsr

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

  • Solution
5 horas atrás, Pedro da Rosa disse:

Olá Leandro, valeu pela resposta! Interessante, dessa forma tu acaba trabalhando apenas com as interfaces sempre, no meu modelo eu tenho o TControllerCliente.New devolvendo a instancia do iCliente direto, talvez seja interessante a criação de uma factory para que o view não precise conhecer os controllers, acredito que seja uma alteração fácil de implementar e que daria um bom resultado nesse sentido. 
Outra coisa também é a interface de DAO, atualmente eu uso um iQuery diretamente ligado ao TIBQuery, como uso delphi 2010 é a opção que tenho, mas já sabia que para migrar seria doloroso. Não manjo muito de Generics para saber fazer a migração dessa parte, vou dar uma estudada, achei interessante esse formato.
Agora uma dúvida sobre o teu esqueleto, funções específicas como verificar o limite do cliente, tu usa diretamente no iCliente? e para a persistência dos dados, tu tens um mapeamento da tabela de cliente no banco de dados?

boa tarde

acesso a dados e persistencia na DAO

na classe cliente somente verificaria se os dados estão ok exemplo  verificaria se o campo nome esta em branco se sim dispararia um raise;

pra verificar limite eu criaria uma outra classe. uma coisa estude sobre SOLID.  eu vou separando minhas classe cada classe responsavel por fazer uma coisa é assim que eu faço. Mas como nosso amigo @Thulio Bittencourt diz existe mil maneira de prepara o neston 

e trabalhar com interface no começo vai apanhar muito mas depois é mamão com açúcar

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...

Valeu pelas respostas gurizada, me enrolei nos últimos dias e não conseguir agradecer propriamente.

Mas pra fechar mais uma dúvida, estou fazendo o curso de Delphi Updates do @Thulio Bittencourt, estou no caminho certo? Tem algum outro curso dele que vocês me indicam? Curso, formação, qualquer que seja do tipo, tenho vários outros cursos mais avançados dele e também o Clube de Programadores, mas quero pegar bem essa base primeiro, entender bem as interfaces, generics e tal, em resumo, cansei de apanhar com código confuso rsrs

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

11 horas atrás, Pedro da Rosa disse:

Valeu pelas respostas gurizada, me enrolei nos últimos dias e não conseguir agradecer propriamente.

Mas pra fechar mais uma dúvida, estou fazendo o curso de Delphi Updates do @Thulio Bittencourt, estou no caminho certo? Tem algum outro curso dele que vocês me indicam? Curso, formação, qualquer que seja do tipo, tenho vários outros cursos mais avançados dele e também o Clube de Programadores, mas quero pegar bem essa base primeiro, entender bem as interfaces, generics e tal, em resumo, cansei de apanhar com código confuso rsrs

Bom dia 

Delphi Updates é o caminho das pedras 

So uma dica entenda bem cada modulo e vai avançando 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 762 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...