Ana içeriğe geç

Generics

Jenerikler

Türkçe karşılığı
jenerik türler, genel türler
Okunuşu
cıneriks

Günlük kullanımda iki ad da yaygın.

Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/generics

Kısaca

Generics, tam tür güvenliğini korurken birçok veri türüyle çalışan fonksiyonlar, sınıflar ve türler yazmanıza olanak tanıyan bir dil özelliğidir.

Generics nedir?

Generics, tür denetiminden vazgeçmeden kodu bir kez yazıp farklı türlerle yeniden kullanmanızı sağlar. Bir sayı listesi için bir fonksiyon, bir dize listesi için başka bir fonksiyon yazmak yerine, çağıranın kullandığı türün yerine geçen ve genellikle T olarak adlandırılan bir tür parametresi içeren tek bir fonksiyon yazarsınız. TypeScript, Java, C#, Go, Rust, Swift ve Kotlin generics'i destekler; Python ise bunları tür ipuçları (type hints) aracılığıyla sunar.

Generic bir fonksiyonu çağırdığınızda ya da generic bir sınıf oluşturduğunuzda tür parametresi, Box<string> örneğindeki gibi açıkça ya da tür çıkarımıyla otomatik olarak somut bir türle doldurulur. Derleyici ardından her kullanımın tutarlı olduğunu denetler; böylece bir Box<string> yanlışlıkla bir sayı tutamaz. Türün belirli özelliklere sahip olmasını zorunlu kılmak için T extends { id: number } gibi kısıtlamalar da ekleyebilirsiniz.

İyi bir benzetme etiket tutacağı olan bir saklama kutusudur: her kutunun tasarımı aynıdır, ancak birine 'kitaplar' etiketi yapıştırdığınızda içine yalnızca kitaplar girer. Generics, Array<T>, Map<K, V> ve Promise<T> gibi yerleşik koleksiyonlardan tür belirtilmiş sonuçlar döndüren API istemcilerine ve veri depolarına dek günlük kodun her yerinde karşımıza çıkar.

Generics sıklıkla TypeScript'teki any ya da Java'daki Object ile karıştırılır. any kullanmak tür denetimini kapatır; generic ise tam türü takip eder, dolayısıyla dışarı aldığınız değer, içeri koyduğunuz değerle aynı türdedir. Diller generics'i çalışma zamanında farklı ele alır: Java ve TypeScript tür bilgisini derlemeden sonra siler, C# korur, Rust ise kullanılan her tür için özelleştirilmiş kod üretir.

Önemli noktalar

  • Generics, tek bir fonksiyonun, sınıfın ya da türün birçok türle güvenle çalışmasını sağlar.
  • T gibi bir tür parametresi, çağıran ya da tür çıkarımı tarafından doldurulan bir yer tutucudur.
  • Derleyici, denetimi kapatan any'nin aksine türleri yine de denetler.
  • Kısıtlamalar hangi türlere izin verileceğini sınırlar; örneğin T extends { id: number }.
  • Array<T>, Map<K, V> ve Promise<T> gibi yerleşik türler generic'tir.

Örnek

TypeScript'te generic bir fonksiyon ve generic bir sınıftypescript
// One function that works with arrays of any type
function first<T>(items: T[]): T | undefined {
  return items[0];
}

const n = first([10, 20, 30]); // n: number | undefined
const s = first(["a", "b"]);   // s: string | undefined

// A generic class with a constraint: T must have a numeric id
class Repository<T extends { id: number }> {
  private items: T[] = [];
  add(item: T): void { this.items.push(item); }
  findById(id: number): T | undefined { return this.items.find((i) => i.id === id); }
}

Sık sorulan sorular

Generics'te T ne anlama gelir?

T, tür anlamına gelen type sözcüğünün kısaltması olan, tür parametresi için geleneksel bir addır. Generic kod kullanıldığında number ya da User gibi gerçek bir türle değiştirilen bir yer tutucudur; diğer yaygın adlar anahtarlar ve değerler için K ve V'dir.

TypeScript'te generics ile any arasındaki fark nedir?

any tür denetimini kapatır, dolayısıyla TypeScript bir değerin hangi türde olduğunu unutur. Generic ise tam türü hatırlar; bir string verirseniz bir string geri alırsınız ve hatalar derleme zamanında yine yakalanır.

JavaScript'te generics var mı?

Hayır. JavaScript dinamik türlüdür; bu yüzden her fonksiyon zaten her türden değeri kabul eder, ancak derleme zamanı denetimleri yoktur. Generics TypeScript'ten gelir ve TypeScript JavaScript'e derlenirken kaldırılır.

İlgili sayfalar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar