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

Bağlandığınız bilgisayar bir web filtresi kullanıyorsa, *.kastatic.org ve *.kasandbox.org adreslerinin engellerini kaldırmayı unutmayın.

Ana içerik

Statik işlevler ve anlık yöntemler

Algoritma No 3'e (fareye doğru hızlanma) gelmeden önce, vektörler ve PVector nesnesiyle çalışmanın çok önemli bir başka yönünün üzerinden geçmemiz gerekir: statik fonksiyonlar ve nesnelere ait yöntemler arasındaki fark.
Bir saniyeliğine vektörleri unutarak, aşağıdaki koda bakın:
var x = 0;
var y = 5;
x = x + y;
Gayet kolay, öyle değil mi? xin değeri 0'dır, buna y ekleriz ve şimdi x 5'e eşittir. PVector hakkında öğrendiklerimizin ışığında, buna karşılık gelen kodu kolaylıkla yazabiliriz.
var v = new PVector(0,0);
var u = new PVector(4,5);
v.add(u);
v vektörünün değeri (0,0)'dır, bunu u ile toplarız, ve şimdi v (4,5)'e eşittir. Kolay, öyle değil mi?
Başka bir basit matematik örneğine bakalım:
var x = 0;
var y = 5;
var z = x + y;
xin değeri 0'dır, buna y ekleriz ve sonucu yeni bir z değişkeninde saklarız. Bu örnekte x değeri de, y değeri de değişmez! Bu önemsiz bir nokta gibi gelebilir ve sayılarla matematik işlemleri söz konusu olduğunda oldukça mantıklı olabilir. Ancak, PVectordeki matematiksel işlemlerde bu kadar açık değildir. Öğrendiklerimize göre, kodu yazmayı deneyelim.
var v = new PVector(0,0);
var u = new PVector(4,5);
var w = v.add(u); // Aldanmayın, bu yanlıştır!!!
Üstteki iyi bir tahmine benziyor, ama PVector nesnesi bu şekilde çalışmaz. add() tanımına bakarsak...
PVector.prototype.add = function(v) {
    this.x = this.x + v.x;
    this.y = this.y + v.y;
 };
...bu kodun hedefimizi gerçekleştirmediğini görürüz. İlk olarak, yeni bir PVector vermez (return ifadesi yoktur) ve ikinci olarak da çağrıldığı PVector değerini değiştirir. İki PVector nesnesini toplamak ve sonucu yeni bir PVector olarak vermek için, ''statik'' add() fonksiyonunu kullanmanız gerekir.
''Statik'' fonksiyon, bir nesnede tanımlanmıştır, ama nesnenin özelliklerini değiştirmez. Peki neden nesnede tanımlıyoruz? Genellikle, nesneyle ilgisi vardır, bunun için ona bağlanması mantıklıdır. Nesneyi bir isim alanı olarak kullanır. Örneğin, PVector'de tanımlı tüm statik fonksiyonlar, geçirilmiş PVector nesnelerine bir tür işlem uygularlar ve bir değer verirler. Bu fonksiyonları genel olarak da tanımlayabiliriz, ancak bu şekilde, genel fonksiyonlardan kaçınırız ve ilgili işlevselliği gruplandırmada daha iyi yollar kullanırız.
Bunları karşılaştıralım. add() nesneli yöntemini şu şekilde kullanırız:
v.add(u);
Bu kod satırı vyi değiştirir, onun için bir çıktı değerini kaydetmemiz gerekmez. Diğer taraftan, add() statik fonksiyonunu şöyle kullanırız:
var w = PVector.add(v, u);
Bu fonksiyonun sonucunu bir değişkende saklamazsak, bu kod satırı işe yaramaz, çünkü statik versiyon nesneleri değiştirmez. PVectorün statik fonksiyonları, girdi PVectorlerden birinin değerini değiştirmeden PVector nesnelerinde genel matematik işlemleri gerçekleştirmemizi sağlar.
add()'in statik versiyonunu şöyle yazarız:
PVector.add = function(v1, v2) {
  var v3 = new PVector(v1.x + v2.x, v1.y + v2.y);
  return v3;
};
Burada birkaç fark vardır:
  • Fonksiyonu prototipinde değil , doğrudan nesnede tanımlarız
  • Fonksiyonun içindeki this anahtar sözcüğe hiç ulaşmayız
  • Fonksiyondan bir değer elde ederiz
PVector nesnesinde add(), sub(), mult() ve div()in statik versiyonları vardır. Nesnelere ait yöntemlerde bulunmayan ekstra statik fonksiyonlar da bulunur, angleBetween(), dot() ve cross() gibi. PVectorle program yazmaya devam ettikçe, bu fonksiyonları kullanacağız.

Bu "Doğal Simülasyonlar" dersi, Daniel Shiffman'ın"Kodun Doğası"'nın bir türevidir ve Creative Commons Yüklemesi-Ticari Olmayan 3,0 Dağıtıma Açık Lisansla kullanılmaktadır.

Tartışmaya katılmak ister misiniz?

Henüz gönderi yok.
İngilizce biliyor musunuz? Khan Academy'nin İngilizce sitesinde neler olduğunu görmek için buraya tıklayın.