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.
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.
Tgibi 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>vePromise<T>gibi yerleşik türler generic'tir.
Örnek
// 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
- Veri türüProgramlamanın Temelleri, s. 54Veri türü, bir programa bir verinin sayı ya da metin gibi hangi tür bir değer taşıdığını ve hangi işlemlerin ona uygulanabileceğini söyleyen sınıflandırmadır.
- Tür çıkarımıProgramlamanın Temelleri, s. 53Tür çıkarımı, derleyicinin bir değişkenin ya da ifadenin türünü otomatik olarak belirlediği bir özelliktir; her tür bildirimini yazmanız gerekmez.
- TypeScriptWeb Geliştirme, s. 51TypeScript, JavaScript üzerine statik tipler ekleyerek birçok hatayı kod çalışmadan yakalayan ve düz JavaScript'e derlenen bir programlama dilidir.
- SınıfProgramlamanın Temelleri, s. 49Sınıf, nesne yönelimli programlamada bir grup nesnenin paylaştığı veri ve davranışı tanımlayan, nesnelerin örnek olarak ondan oluşturulduğu bir plandır.
- FonksiyonProgramlamanın Temelleri, s. 20Fonksiyon, belirli bir işi yapan, isteğe bağlı olarak parametre denen girdiler alıp sonuç döndürebilen, adlandırılmış ve yeniden kullanılabilir kod bloğudur.
- DiziProgramlamanın Temelleri, s. 15Dizi, tek bir ad altında saklanan ve her öğesine genellikle 0'dan başlayan indeks adlı sayısal konumuyla erişilen, sıralı bir değerler koleksiyonudur.
- IteratorProgramlamanın Temelleri, s. 27Iterator, verinin nasıl saklandığını açığa çıkarmadan, konumunu hatırlayarak bir koleksiyonun öğeleri arasında teker teker ilerlemeyi sağlayan bir nesnedir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin