DUVIDAS COM OOP

 Tópico anterior Próximo tópico Novo tópico

DUVIDAS COM OOP

C#

 Compartilhe  Compartilhe  Compartilhe
#489327 - 02/07/2019 11:21:38

MARCELOKROL
REBOUCAS
Cadast. em:Julho/2004


Bom dia

Esse final de semana tirei um tempinho para assistir os vídeos do nosso colega Kerplunk sobre OOP, e me surgiu duas dúvidas sobre o assunto:
1ª - Ao implementar a herança iDisposable em uma classe que não tenha nada para ser "Disposado" (inventei essa palavra agora), o GAC efetua a limpeza da memória da mesma forma? Ex:
   public class MinhaClasse: IDisposable
   {
      public MinhaClasse()
      {
        
      }

      public int Propriedade { get; set; }

      public void MinhaFuncao()
      {
         //...
      }

      public void Dispose()
      {
        
      }
   }


2º - Ao declarar uma variável da MinhaClasse, qual a diferença, ou ainda, há alguma diferença nas duas praticas abaixo?
MinhaClasse variavel1 = new MinhaClasse();

var variavel1 = new MinhaClasse();




#489330 - 02/07/2019 13:26:08

JABA
CABO FRIO
Cadast. em:Agosto/2005


Citação:
1ª - Ao implementar a herança iDisposable em uma classe que não tenha nada para ser "Disposado" (inventei essa palavra agora), o GAC efetua a limpeza da memória da mesma forma?


Os recursos não gerenciados (ou unmanaged resources), como acesso ao disco, à rede, handles, conexões com o banco de dados... não são liberados automaticamente e necessitam de um cuidado extra, que pode passar pela implementação da interface IDisposable.

Quando você possui acesso a alguma "coisa" que tem um vínculo com a aplicação, este vínculo precisa ser finalizado de alguma forma. Um exemplo típico é o arquivo em um disco. Para ter acesso a ele, você o abre criando assim um vínculo com a aplicação. Em algum momento este arquivo precisa ser fechado para desfazer este vínculo. Isto precisa ser feito o mais rápido possível; não pode aguardar o garbage collector entrar em ação. Você não tem controle quando ele fará a liberação da memória. Por tanto, quando a classe não faz uso de recursos não gerenciados, não é necessário a implementação desta interface.

Citação:
2º - Ao declarar uma variável da MinhaClasse, qual a diferença, ou ainda, há alguma diferença nas duas praticas abaixo?


É a mesma coisa. Ambos fará referência à MinhaClasse().



_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem quando o corpo está em movimento?



#489331 - 02/07/2019 14:00:06

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
O caso é que se você implementa a interface IDisposable, o ideal é usar um bloco using:

using (var MinhaClasse = new MinhaClasse)
{
   //bla bla bla
}

Dessa maneira, ao chegar ao fim do bloco using, o método Dispose será executado automaticamente.

_______________________________________________________________________
Virei Oráculo!
The end is nigh, be ready for the nukes!


#489381 - 07/07/2019 14:24:26

FOXMAN
BARRETOS
Cadast. em:Janeiro/2001


Membro da equipe
Citação:
  2º - Ao declarar uma variável da MinhaClasse, qual a diferença, ou ainda, há alguma diferença nas duas praticas abaixo?
MinhaClasse variavel1 = new MinhaClasse();

var variavel1 = new MinhaClasse();


Resumidamente,
var variavel1 = new MinhaClasse();
irá assumir um objeto do tipo sua classe.
Quando vc declara SUACLASSE VARIAVEL1 = SUACLASSE();, vc já está definindo que VARIAVEL1 será um objeto do tipo SUACLASSE.

Sendo assim, a utilização do "var" é adequadamente implementado para situações onde você não sabe o tipo do objeto de retorno.

Exemplo :

Supondo quem um método possa retornar CPF ou CNPJ.
Então seria interessante vc utilizar o "var", pois dessa forma vc conseguiria saber qual o tipo do objeto retornado.

Algo como :

var documento = new minhaclasse("111.222.333-00");

O construtor retornaria um objeto do tipo CPF.
Então vc teria um objeto do tipo CPF.

Eu utilizo muito isso nas questões de TRIBUTAÇÕES DE PRODUTOS, onde desejo saber qual foi (por exemplo) o CFOP informado na digitação de um pedido, que consequentemente irá gerar uma nota.
Considerando que cada CFOP é um OBJETO com propriedades peculiares.
No meu caso , gero um objeto CFOP dinamicamente com base nos CFOPs cadastrados e ficaria algo absurdo de vc codificar.

Seira algo como :

var cfop = new CFOP(produto.cfop);

se eu passar a variavel com o parametro produto.cfop = 5102, me retornaria um objeto do tipo CFOP5102 e sua propriedades.

Dessa forma evito diretamente uma enorme quantidade de IFs.


É assim que utilizo o
var
.




Grupo DotNet.Br no FaceBook

Grupo WhatsDev



#489594 - 21/07/2019 11:08:18

MARCELOKROL
REBOUCAS
Cadast. em:Julho/2004


Obrigado pelas respostas e foram bem esclarecedoras. Mas apareceu mais uma:

Com relação ao método genérico <T>. Criei uma função dentro da classe DataComand, onde as outras classes irão herda-la. Até ai tudo bem, mas essa função da DataCommand, gera o SQL Select para a tabela:
  public string GetSelectString<T>(T objectType)
      {
        //...
      }


Na classe Pessoa uso ela mais ou menos assim:
  public Pessoa GetPessoa(int codigoPessoa)
{
   string sqlSelect = $"{GetSelectString(this)} where (codigo = @codigo)");
  //...
}


Explanado a situação, segue a duvida:
- Aquele this ali, ele será descarregado da memória quando? Visto que ele representa a classe atual, e em momento algum durante o uso, é chamado o seu dispose.



#489595 - 21/07/2019 17:50:32

JABA
CABO FRIO
Cadast. em:Agosto/2005


Esse objeto passará a ser responsabilidade do DataCommand, por tanto ele continuará existindo enquanto o DataCommand estiver sendo referenciado.

_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem quando o corpo está em movimento?



#489971 - 13/08/2019 14:01:45

MARCELOKROL
REBOUCAS
Cadast. em:Julho/2004


Continuando a série de dúvidas, e pra não abrir outro tópico, pois creio que a dúvida se enquadra ao assunto:

Antigamente no VB6 sempre fazia abertura do recordset no momento do uso e direto pelo form, desse modo abria, usava, descartava e pronto. Já com C# estou tentando usar ao máximo os proveitos da linguagem, então a dúvida:
- Para exibir na tela, dados vindos do banco de dados, quando usar o List? Ou ainda, sempre devo usar um List para exibir os dados na tela?
* não sei se consegui expor corretamente a dúvida.



#489975 - 13/08/2019 15:23:06

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
A idéia principal da OOP, é abstrair banco de dados para algo que faça mais sentido, que seja mais próximo à "linguagem humana". Um recordset, dataset, datareader, são interfaces de comunicação e interpretação de dados vindos do banco de dados. Eles contêm informações como listas de clientes, produtos e por aí vai. Na sua tela é isto que você vai exibir, você não exibe um recordset para seu cliente, certo? Pois é, porque você deveria trabalhar com recordset também. Transforme-o em algo mais lógico, uma lista de algo. Isso abre a possibilidade de você fazer coisas com ele de maneira mais clara. Um exemplo:

Cliente.Codigo = 1;
Cliente.Descricao = "zezinho";
Cliente.Incluir();


Isso faz muito mais sentido semanticamente do que uma query SQL. Concordo que o resultado será o mesmo no fringir dos ovos, mas abstrair não é só para você. Suponho que você não trabalhe em equipe ou disponibiliza seu backend para terceiros, o que explica não ser muito preocupado com esse tipo de coisa, mas o caso é que TI está mudando muito e cada vez mais usamos backends(geralmente disponibilizados em forma de API) de terceiros. E nesse caso sim, essas coisas devem ser levadas em conta e um cuidado especial com elas deve ser dedicado.

Para sua dúvida: Você pode fazer de diversas formas. List<T> é uma das maneiras, você pode usar qualquer enumerador(agrupadores como ICollection, IEnumerable e outros) List<T> é um deles. Então por via de regra, sim, usar List<T> sempre que o que você esteja trabalhando seja uma lista de algo. Ele pode ser passado perfeitamente para um grid, sem o menor problema. Mostro isso em várias ocasiões nos vídeos do canal.

_______________________________________________________________________
Virei Oráculo!
The end is nigh, be ready for the nukes!


#489976 - 13/08/2019 15:32:45

MARCELOKROL
REBOUCAS
Cadast. em:Julho/2004


Obrigado pela resposta Kerplunk.
Te digo que já estou usando muito List, mas você me respondeu com clareza e era isso mesmo o que pensava, mas o meu medo era: e isso não vai sobrecarregar ou dar problema no futuro. Ou ainda, usar List para exibir um recordset na tela é uma boa prática de programação?



#489978 - 13/08/2019 17:50:14

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
O List<T> ainda que seja um dos objetos mais pesados da "família", é muito, mas muito mais leve e eficiente que um recordset, então abrir um recordset e "converter" para um List<T> vai ter é um ganho de performance, que vai ter o custo de processamento nessa conversão, mas vale à pena no final das contas.

_______________________________________________________________________
Virei Oráculo!
The end is nigh, be ready for the nukes!


#489980 - 13/08/2019 18:59:30

MARCELOKROL
REBOUCAS
Cadast. em:Julho/2004


Entendi. Dúvida sanada.

Mas agora outra :
Uso banco de dados firebird, e para realizar a conversão de um DataReader para um List, faço uso de algumas decorações (Reflection) nas propriedades. Ao todo são 14, não são usadas todas, mas elas são definidas com seus valores default ao inicializar a classe.
A dúvida: isso pode deixar lento o carregamento da List? Existe alguma limitação na quantidade de decorações em uma propriedade?




 Tópico anterior Próximo tópico Novo tópico


Para responder este tópico o login é requerido
Se você já possui uma conta de usuário por favor faça seu login
Se você não possui uma conta de usuário use a opção Criar usuário