Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

caiiovox

[RESOLVIDO] [DÚVIDA] Parâmetros e Construtores.

Recommended Posts

 

Boa tarde galera !
Estou com uma dúvida pertinente, que, por mais que eu veja vídeo aulas, as explicações acabam se confrontando e me deixando confuso !
Gostaria de saber, com exemplos práticos, para que serve um CONSTRUTOR, o que ele é e para que serve.

 


Outra coisa seria as passagens de parâmetro ! Eu sei que um método void ele não precisa retornar nada, ou seja, lá embaixo, no final do método eu

não preciso colocar:
return alguma coisa;

 

porém um método que seja por exemplo

public calcularX{

      Eu escrevo toda minha regra, ou cálculo aqui dentro;

      e aqui no final da minha estrutura, eu devo colocar

     return x; (se ele vai calcular o valor de x, eu devo retornar o x né ?)

e como vou passar parâmetros ? Como eu devo saber quando ou não passar? e para que vão servir ?
 

 

Sei que é uma dúvida de principiante, mas mesmo eu lendo alguns artigos da alura e dev media, e algumas video aulas

ficaram muito técnicas e divergentes as explicações, eu queria uma explicação mais

técnica e mais sucinta e menos complexa.

 

Obrigado desde já !

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@caiiovox beleza!

Vamos tomar como base o exemplo abaixo:
 

public class Aluno
{
  public string nome;
  public float nota; 
  
  public Aluno(string nome)
  {
    this.nome = nome;
  }
  public void setNota(float nota)
  {
   this.nota = nota;
  }
  public string getNota()
  {
   return this.nota.ToString();
  }
}

Aluno joao = new Aluno("João da Silva");
joao.setNota(8.5f);
Console.Write(joao.getNota());

 

O construtor serve para você construir coisas que são necessárias para o seu objeto existir, por exemplo, não faz sentido ter um aluno sem um nome, certo? Então o nome deve ser passado no construtor

Nesse exemplo, se não fosse usado o construtor para passar o nome, e colocado o nome somente apos o objeto existir, com um um metodo setNome(string nome) por exemplo, funcionaria. Mas do ponto de vista da orientação a objetos, isso estaria errado, pelo motivo já explicado.
 

Sobre o void e return, é simples. Você vai usar void sempre quando quiser executar uma ação, e não te interessa ter retorno. Por exemplo, o metodo setNota(float nota) é apenas para atribuir uma nota, e para ver a nota, uso o metodo com retorno, que nesse caso é o getNota()
 

Sobre os parametros, segue a mesma simplicidade, para atribuir uma nota eu preciso de um parametro para o setNota(float nota), e para pegar a nota eu não preciso de parametros nenhum, preciso apenas chamar o metodo getNota() que tem um return

Compartilhar este post


Link para o post
Compartilhar em outros sites

@EdCesar Disse tudo.. 

 

Construtor é o que de certa forma deixa seu objeto consistente. Se a classe tem um construtor com parametros, você é obrigado a passar eles quando for instanciar a classe.

Como nosso amigo já disse, não tem porque eu ter um aluno sem nome. Ele não existe sem um nome, mas ainda é um aluno sem uma nota;

 

Quanto aos parâmetros (só complementando em outro cenário), pensa em um projeto com diversas camadas.

Na sua controller (pensa num mvc), tem acesso aos dados de inputs da view, certo?

E agora você quer persistir essas entradas em seu bd. A camada de repository (camada que faz acesso ao bd) é a responsável por isso mas ela não tem acesso direto a view, mas ela precisa das informações da view. E agora?

Agora você vai passando essas informações por parâmetro, camada por camada (controller, validation, business, etc) até a repository.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que eu entendi, vou colocar uma classe de exemplo:

public class DALCategoria{

       private DALConexao conexao;
        public DALCategoria(DALConexao cx) //Vocês disseram que deixo meu objeto consistente, mas como ele fica consiste aqui ?
        {
            conexao = cx;     //=>  eu estou passando uma classe DALConexao como parâmetro, (mas o que seria o cx ?)
                                         
                                                     
        }
        public void Incluir(ModeloCategoria modelo) //=> eu sei que meu ModeloCategoria é uma classe que tem minhas propriedades de CatCod e CatNome, e esse método é void, sendo assim não sou obrigado a retornar nenhuma confirmação para o usuário de que algo foi inserido no banco, mas eu poderia, caso quisesse, né ? Caso sim, eu teria que retirar o void e colocar um return modelo depois do meu conexao.Desconectar ? 
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conexao.ObjetoConexao;
            cmd.CommandText = "insert into categoria(cat_nome) values (@nome); select @@IDENTITY;";
            cmd.Parameters.AddWithValue("@nome", modelo.CatNome);
            
            conexao.Conectar();
            modelo.CatCod = Convert.ToInt32(cmd.ExecuteScalar());
            conexao.Desconectar();
        }

public ModeloCategoria CarregaModeloCategoria(int codigo) //Seguindo a lógica do método acima, por que eu retorno modelo no meu return ? Não seria codigo ? Pois eu estou passando como parâmetro um int Codigo.
        {
            ModeloCategoria modelo = new ModeloCategoria();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conexao.ObjetoConexao;
            cmd.CommandText = "select * from categoria where cat_cod = @codigo";
            cmd.Parameters.AddWithValue("@codigo", codigo);
            conexao.Conectar();
            SqlDataReader registro = cmd.ExecuteReader();
            if (registro.HasRows)
            {
                registro.Read();
                modelo.CatCod = Convert.ToInt32(registro["cat_cod"]);
                modelo.CatNome = Convert.ToString(registro["cat_nome"]);
            }
            conexao.Desconectar();
            return modelo;
        }

 

@EdCesar e @itlpps valeu por me responderem. Não sei se com essas classes de conexão ficaram melhor para colocar minha dúvida. Valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites
//Vocês disseram que deixo meu objeto consistente, mas como ele fica consiste aqui ?

Fica consistente que sempre vai ter uma conexão pra acessar o banco.

Porém esse não é o seu objeto, é uma classe de acesso a dados.

 

//=>  eu estou passando uma classe DALConexao como parâmetro, (mas o que seria o cx ?)

cx é o parâmetro, é a instancia (ou deveria ser) da classe de conexão, que está sendo atribuída a uma variável global (dentro da classe DALCategoria), para poder usar em qualquer método dela. 

 

//=> eu sei que meu ModeloCategoria é uma classe que tem minhas propriedades de CatCod e CatNome, e esse método é void, sendo assim não sou obrigado a retornar nenhuma confirmação para o usuário de que algo foi inserido no banco, mas eu poderia, caso quisesse, né ? Caso sim, eu teria que retirar o void e colocar um return modelo depois do meu conexao.Desconectar ? 

Poderia sim. 

Geralmente chamo métodos de inserte ou update dentro de um 'try catch', se não der erro (cair no catch) sei que inseriu, então prossigo normalmente o fluxo do programa.

 

//Seguindo a lógica do método acima, por que eu retorno modelo no meu return ? Não seria codigo ? Pois eu estou passando como parâmetro um int Codigo.

É retornado o objeto porque é um select, certamente vai ser exibido as informações desse objeto para o usuário, e pra isso preciso de tudo, e não só o código...

Compartilhar este post


Link para o post
Compartilhar em outros sites

@itlpps Valeu pela explicação, deu para dar uma esclarecida, porém ainda me sinto inseguro, vou continuar os conteúdos, porém quando eu for colocar na prática e ver que ainda me atrapalho eu volto a falar com vocês, creio eu que vou sentir mais dificuldade quando rever as aulas de MVC 5.

Enfim. Obrigado !!!

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 minutos atrás, caiiovox disse:

@itlpps Valeu pela explicação, deu para dar uma esclarecida, porém ainda me sinto inseguro, vou continuar os conteúdos, porém quando eu for colocar na prática e ver que ainda me atrapalho eu volto a falar com vocês, creio eu que vou sentir mais dificuldade quando rever as aulas de MVC 5.

Enfim. Obrigado !!!

Tranquilo, brow. Estamos ai. Ajudamos no possível. :D 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por mr22robot
      Ola caros amigos. 
      Estou com uma dúvida aqui que embora nao tenho achado ainda uma resposta, acredito que haja.
      Estou estudando a tão sonhada linguagem de programação asp.net core mvc. Linguagem essa que demorei 5 anos pra iniciar os estudos rsrs.
      Mas estou agarrado em uma situação. 
      Estou usando como base de dados nos meus estudos um banco Oracle. Que já tem algumas informações nele. Utilizei o SCAFFOLD para criar as classes e o contexto baseado no banco e tabelas existentes. 
      Porem agora na fase das consultas, estou perdido em como utilizar o IN que eu utilizo no oracle; no LINQ.
      Ex: 
      SELECT CODPROD,DESCRICAO FROM PRODUTO WHERE CODPROD IN(1,2,3,4,5,6) Como eu utilizo esse filtro com uma restrição de códigos de produtos? no caso o where codprod in(1,2,3,4,5,6) ?.
      Desde já obrigado pela ajuda.
    • Por luis0101010
      1.      Programe uma função que recebe um número inteiro e verifica se todos os dígitos deste número são iguais ou diferente e liste eles em ordens crescentes.
      Obs: Código fonte com no mínimo de 10 dígitos.
       
      Como exemplo, os números 456, −235, e 5 satisfazem esta condição, enquanto que o número 6 não.
       
      2.      Crie também a função main que recebe o valor do número digitado pelo usuário e exibe na tela uma mensagem informando se os dígitos deste número são iguais.
       
      Exemplo:
      --Exemplo 1:
      Informe um número:
      -555
      Numero informado possui todos os dígitos iguais
      --Exemplo 2:
      Informe um número:
      67
      Número informado não possui todos os dígitos iguais
    • Por Rafael Massula
      Boa noite pessoal, 
      Tenho o seguinte código em .Net que faz a comparação de uma senha que foi criptografada e salva no banco com a senha comum que o usuário conhece. O algoritmo que desenvolvi foi esse da image.png porem preciso converter essa verificação para JavaScript pela seguinte necessidade, será uma aplicação em electron e ela poderá funcionar offline então não terei como mandar a verificação para o servidor. Existe alguma possibilidade? Desde já agradeço. 

    • Por TheLord23
      ESTOU COMEÇANDO AGORA NA PROGRAMAÇÃO COM VISUALG E TERIA QUE COLOCAR ESTE CODIGO EM UM LAÇO DE REPETIÇÃO.
      POREM NÃO ESTOU CONSEGUINDO PODERIAM ME AJUDAR ?
       
      SÓ PENSANDO QUE O USUÁRIO IRA DIGITAR O TAMANHO DO VETOR, APOS ISSO CADA OPÇÃO QUE ELE ESCOLHER E ELA SER EXECUTADA DE FORMA CORRETA ELE VOLTARA PARA O MEUNU PRINCIPAL DAS OPÇÕES ATE QUE ELE SELECIONE A OPÇÃO "F"
       
      POREM TENTEI ESCREVELO USANDO ENQUANTO MAS ACABOU QUE EU NÃO CONSIGO PREVINIR OS ERROS DO USUÁRIO QUANDO ELE COLOCA AS INFORMAÇÕES
       
      TIPO:
      -ARMAZENAR UM NÚMERO NO VETOR E ESSE NÚMERO NÃO SER SOBRESCREVIDO ATE QUE O PROGRAMA SEJA ENCERRADO
      -SE ELE DIGITAR PRA BUSCAR OU INSERIR O NÚMERO ZERO O PROGRAMA INFORMAR QUE O VALOR É INVÁLIDO
       
      TENTEI USAR PROCEDIMENTOS E FUNÇÕES MAS OS ERROS CONTINUARAM.
       
       
       
      Algoritmo "DESAFIO"
      Var
         AUX,CONTADOR,BUSCAR:INTEIRO
         POSICAO,AUX_TEMP:INTEIRO
         OPCAO:CARACTERE
         RESULT_BUSCA: LOGICO
         SOMA_VET:REAL
         NUMERO:VETOR[1..500]DE INTEIRO
      Inicio
         ESCREVAL("*********************************")
         ESCREVAL("* CADASTRO DE VETORES - DESAFIO *")
         ESCREVAL("*********************************")
         ESCREVA("DIGITE O TAMANHO DO VETOR A SER CADASTRADO: ")
         LEIA(AUX)
         NUMERO[AUX] <- AUX
         ESCREVAL("A - Cadastrar um novo número;")
         ESCREVAL("B - Buscar um número")
         ESCREVAL("C - Excluir um número;")
         ESCREVAL("D - Listar os números cadastrados;")
         ESCREVAL("E - Exibir a soma dos números do vetor;")
         ESCREVAL("F - Sair do sistema.")
         LEIA(OPCAO)
         OPCAO <- MAIUSC(OPCAO)
         ESCOLHA OPCAO
         CASO "A"
            PARA CONTADOR DE 1 ATE NUMERO[AUX] FACA
               ESCREVA("DIGITE O VALOR QUE SERÁ ARMAZENADO NA",CONTADOR,"ª POSIÇÃO DO VETOR: ")
               LEIA(NUMERO[CONTADOR])
            FIMPARA
         CASO "B"
            ESCREVA("QUAL NÚMERO DESEJA ENCONTRAR: ")
            LEIA(BUSCAR)
            PARA CONTADOR DE 1 ATE NUMERO[AUX] FACA
               SE NUMERO[CONTADOR] = BUSCAR ENTAO
                  RESULT_BUSCA <- VERDADEIRO
                  POSICAO <- CONTADOR
               FIMSE
            FIMPARA
            PARA CONTADOR DE 1 ATE NUMERO[AUX] FACA
               ESCREVAL(NUMERO[CONTADOR])
            FIMPARA
            ESCREVAL("")
            ESCREVAL("---------")
            SE RESULT_BUSCA = VERDADEIRO ENTAO
               ESCREVAL("O NÚMERO",BUSCAR,"FOI ENCONTRADO E ESTA NA POSIÇÃO",POSICAO)
            SENAO
               ESCREVAL("O NÚMERO NÃO FOI ENCONTRADO !")
            FIMSE
         CASO "C"
            escreval("QUAL NÚMERO DESEJA EXCLUIR DO VETOR: ")
            leia(BUSCAR)
            SE NUMERO[CONTADOR] = BUSCAR ENTAO
               NUMERO[CONTADOR] <- 0
               ESCREVAL("O NÚMERO",BUSCAR,"NA POSIÇÃO",POSICAO,"DO VETOR FOI EXCLUIDO !")
            FIMSE
            PARA CONTADOR DE 1 ATE NUMERO[AUX]
               PARA AUX DE CONTADOR + 1 ATE AUX FACA
                  SE NUMERO[AUX] > NUMERO[CONTADOR]
                     AUX_TEMP <- NUMERO[AUX]
                     NUMERO[AUX] <- NUMERO[CONTADOR]
                     NUMERO[CONTADOR] <- AUX_TEMP
                  FIMPARA
               FIMPARA
               ESCREVA("VALROES DO VETOR: ")
               PARA CONTADOR DE 1 ATE NUMERO[AUX] FACA
                  ESCREVAL(NUMERO[CONTADOR])
               FIMPARA
            CASO "D"
               ESCREVA("VALORES DO VETOR: ")
               PARA CONTADOR DE 1 ATE NUMERO[AUX] FACA
                  ESCREVAL(NUMERO[CONTADOR])
               FIMPARA
            CASO "E"
               PARA CONTADOR DE 1 ATE NUMERO[AUX] FACA
                  SOMA_VET <- SOMA_VET + NUMERO[CONTADOR]]
               FIMPARA
               ESCREVAL("")
               ESCREVA("A SOMA DO VETOR É:",SOMA_VET)
               
            CASO "F"
               ESCREVAL("ENCERRANDO SISTEMA...")
            OUTROCASO
               ESCREVAL("OPÇÃO INVÁLIDA !")
            FIMESCOLHA
      Fimalgoritmo
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.