Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Referênciamento .this com messagem de correção no VSCode

Olá, uso a versão 2.4.8 do Dart e quando referêncio minha classe contaCorrente no método que está dentro dela, recebo a seguinte messagem: " Don't access members with 'this' unless avoiding shadowing. dart(unnecessary_this)". Aparetemente, nesse caso da aula o código funciona igual com e sem this. Gostaria de saber o que é um shadowing. E também gostaria de saber o que mudou no dart pra ele considerar automaticamente que a classe que eu faço referência é a classe onde está contida minha operação.

Obrigado.

2 respostas
solução!

Olá Walter, tudo bem com você?

Então, aqui temos mais uma dica do Effective Dart, como ele está mesmo dizendo esse this, por exemplo da função depósito, é desnecessário, e você ao testar provavelmente percebeu que ocorreu tudo bem

Então vamos supor que a nossa função esteja assim:

void deposita( double valor){
    saldo += valor
}

Mas o que é esse shadowing que aparece: "Não acesse membros utilizando this a não ser que esteja evitando shadowing

void deposito( double saldo){

Só mudei o nome do parâmetro de valor para saldo, e agora eu te pergunto, como fazer a mesma operação que temos dentro da função?

Sera que?

saldo += saldo

Bem, mas qual saldo é o valor que recebo da função, e qual saldo é o atributo da classe?

Nessa situação entra o shadowing que é ter duas variáveis com mesmo nome em escopos diferentes, então temos o saldo que é do escopo da função deposito e temos saldo que tem o escopo da classe ContaCorrente, para conseguir fazer a atribuição precisamos do this para tirar essa ambiguidade e escapar do shadowing, pois agora não iremos sobreescrever o valor de uma variável de outro escopo, dado que temos o this para indicar qual delas se refere a nossa classe

this.saldo = saldo

E nisso entra a questão do this desnecessário, como o parâmetro da função é valor e não há nenhuma ambiguidade de variáveis com mesmo nome, podemos simplesmente retirar o this

Vou dar um exemplo de shadowing onde criamos essa ambiguidade e as consequências:

void main(){
  var numero = 30;
  int resultado = somaTres(numero);
  print(resultado);
}

int somaTres( int valor ){
  var valor = 92;
  return valor + 3; 
}

Aqui novamente temos o shadowing recebemos uma variável de nome valor e dentro da nossa função criamos uma com o mesmo nome, e na hora de retornar, quem de fato é valor?

Aqui como não estamos trabalhando com classe, não há como diferenciar com this, teremos de fato o shadowing então o var valor = 92 vai criar uma sombra sobre o int valor que recebemos, e na hora de retornar teremos o resultado 95

Aqui cabe lembrar que isso são regras de estilo, da maneira como o Timoteo fez está correto, e na verdade é até bem comum em outras linguagens vermos códigos que utilizar o this mesmo não tendo problemas de shadowing, mas dentro do Dart é comum seguirmos os padrões do Effective Dart :)

Essa parte: E também gostaria de saber o que mudou no dart pra ele considerar automaticamente que a classe que eu faço referência é a classe onde está contida minha operação.

Ficou um pouco confuso, poderia dar um exemplo?

Conseguiu Compreender?

Abraços e Bons Estudos!

Valeu pela resposta :D

Quanto a isso: Essa parte: E também gostaria de saber o que mudou no dart pra ele considerar automaticamente que a classe que eu faço referência é a classe onde está contida minha operação.

Eu não sei pq escrevi classe, eu quis dizer variável. Quando eu perguntei isso eu tava falando do shadowing sem saber que era o shadowing. Então, pelo que ententi, na verdade o programa não considera automaticamente nada. Eu preciso usar o this pra especificar que eu to falando da variável que foi criada como o parâmetro da função que foi criada. Correto?

Por exemplo, quando você escrevethis.saldo += saldo, o saldo da esquerda, com o this, é parâmetro da função depositO e sem o this é o saldo da depositA. ?