If you're seeing this message, it means we're having trouble loading external resources on our website.

Se você está atrás de um filtro da Web, certifique-se que os domínios *.kastatic.org e *.kasandbox.org estão desbloqueados.

Conteúdo principal

Funções estáticas vs. métodos de instância

Antes de prosseguir para o Algoritmo n.° 3 (acelerar em direção ao mouse), precisamos cobrir mais um aspecto bastante importante do trabalho com vetores e com o PVector: a diferença entre o uso de funções estáticas e de métodos de instância.
Deixando os vetores de lado por um momento, dê uma olhada no seguinte código de exemplo:
var x = 0;
var y = 5;
x = x + y;
Bem simples, não? x tem o valor 0, adicionamos y a ele, e agora x é igual a 5. Poderíamos escrever o código correspondente com facilidade baseado no que aprendemos sobre PVector.
var v = new PVector(0,0);
var u = new PVector(4,5);
v.add(u);
O vetor v tem um valor de (0,0), adicionamos u a ele, e agora v é igual a (4,5). Fácil, não é mesmo?
Vamos dar uma olhada em um outro exemplo matemático simples:
var x = 0;
var y = 5;
var z = x + y;
x possui o valor 0, nós adicionamos y a ele e armazenamos o resultado em numa nova variável z. O valor de x não muda neste exemplo, e nem o de y! Isto pode parecer algo trivial e intuitivo quando tratamos de operações matemáticas com números. Contudo, não é tão óbvio para operações matemáticas com PVector. Vamos tentar escrever o código com base no que sabemos até então.
var v = new PVector(0,0);
var u = new PVector(4,5);
var w = v.add(u); // Não se deixe enganar, está incorreto!!!
O código acima pode parecer um bom palpite, mas não é assim que o objeto PVector funciona. Se olharmos a definição de add()...
PVector.prototype.add = funcao(v) {
    este.x = este.x + v.x;
    este.y = este.y + v.y;
 };
...veremos que este código não alcança o nosso objetivo. Primeiramente, ele não retorna um novo PVector(não há declaração de return) e, em segundo lugar, ele muda o valor do PVector por meio do qual é chamado. Visando somar dois objetos PVector e retornar o resultado como um novo PVector, precisamos utilizar a função "estática" add().
Uma função "estática" é aquela que é definida em um objeto, mas não altera as propriedades deste objeto. Então por que a definimos no objeto? Tipicamente, ela tem algo a ver com o objeto, sendo lógico anexá-la a ele. Ela trata o objeto como uma linha de preenchimento. Por exemplo, todas as funções estáticas em PVector executam algum tipo de manipulação em objetos PVector introduzidos e retorna algum valor. Podemos definir estas funções globalmente, de mesmo modo, mas desta forma, evitamos funções globais e temos maneiras melhores de agrupar funcionalidades relacionadas.
Vamos contrastar. Eis como usamos o método de instância add():
v.add(u);
Aquela linha de código modificaria v, então nós não precisaríamos salvar um valor de retorno. Por outro lado, veja como usamos a função estática add():
var w = PVector.add(v, u);
Se não salvarmos o resultado daquela função em uma variável, aquela linha de código seria inútil, pois a versão estática não muda os objetos em si. Funções estáticas de PVector nos permitem fazer operações matemáticas genéricas em objetos PVector, sem ter de ajustar o valor de uma das entradas PVectors.
É assim que escrevemos a versão estática de add():
PVector.add = function(v1, v2) {
  var v3 = new PVector(v1.x + v2.x, v1.y + v2.y);
  return v3;
};
Há várias diferenças aqui:
  • Definimos a função diretamente no objeto, não no seu protótipo.
  • Nós nunca acessamos a palavra-chave this dentro da função.
  • Nós retornamos um valor da função.
O objeto PVector tem versões estáticas de add(), sub(), mult() e div(). Ele também possui funções estáticas inexistentes como métodos de instância, como angleBetwenn(), dot() e cross() (respectivamente, "ângulo entre", "produto escalar" e "produto vetorial"). Encontramo-nos utilizando estas funções conforme dermos sequência à construção de programas com PVector.
Este curso "Natural Simulations" é um derivado do "The Nature of Code" por Daniel Shiffman, usado sob a Creative Commons Attribution-NonCommercial 3.0 Unported License.

Quer participar da conversa?

Nenhuma postagem por enquanto.
Você entende inglês? Clique aqui para ver mais debates na versão em inglês do site da Khan Academy.