Middle
Proqramlaşdırmada ümumiləşdirmələr (Generics) nədir?
sobes.tech Süni İntellekt
AI-dan cavab
Növiyyətlər (Generics) proqramlaşdırma dillərində müxtəlif məlumat tipləri ilə işləyən komponentlər (sinflər, interfeyslər, metodlar/funksiyalar) yaratmağa imkan verən mexanizmdir; bu, tiplərin təhlükəsizliyini itirmədən və tiplərin konvertasiyasına (casting) ehtiyac olmadan həyata keçirilir.
Növiyyətlərin istifadəsinin əsas məqsədləri:
- Tip təhlükəsizliyinin artırılması: Kompilyator, proqramın icrasından əvvəl tipləri yoxlayır və səhvləri aşkarlayır.
- Kodun oxunaqlılığının yaxşılaşdırılması: Komponentin hansı məlumat tipləri ilə işlədiyi aydın görünür.
- Kodun təkrar istifadəsi: Bir komponent yaradıb müxtəlif tiplərlə işlədə bilərik, çoxsaylı versiyalar yazmağa ehtiyac qalmır.
- Tip konvertasiyalarının azaldılması: Açıqlama ilə tip konvertasiyasına ehtiyac qalmır, bu isə kodu daha təmiz və az səhvli edir
ClassCastException(bu tətbiq olunan dillərdə, məsələn, Java).
Növiyyətlərin istifadəsinə nümunələr:
- Kolleksiyalar: Siyahılar (
List), topluslar (Set), xəritələr (Map) müəyyən bir tipdə elementlər saxlaya bilər, bu da başqa tipdə elementlərin daxil edilməsini təmin edir. - Metodlar/funksiyalar: Metod parametr və ya ümumi tipdə dəyər qaytara bilər.
- Sinflər/interfeyslar: Ümumi məlumat strukturları və ya davranış nümunələri yarada bilərik.
Java nümunəsi:
// Növiyyətli Pair sinfi
public class Pair<T, U> {
private T first;
private U second;
public Pair(T first, U second) {
this.first = first;
this.second = second;
}
public T getFirst() {
return first;
}
public U getSecond() {
return second;
}
}
// İstifadə
Pair<String, Integer> pair = new Pair<>("Hello", 123);
String str = pair.getFirst(); // Tip konvertasiyasına ehtiyac yoxdur
int num = pair.getSecond(); // Tip konvertasiyasına ehtiyac yoxdur
// Yanlış nümunə
// Pair<String, Integer> wrongPair = new Pair<>(123, "Hello"); // Kompilyasiya xətası: tiplər uyğun deyil
C# nümunəsi:
// Növiyyətli Pair sinfi
public class Pair<T, U>
{
public T First { get; set; }
public U Second { get; set; }
public Pair(T first, U second)
{
First = first;
Second = second;
}
}
// İstifadə
var pair = new Pair<string, int>("Hello", 123);
string str = pair.First; // Tip konvertasiyasına ehtiyac yoxdur
int num = pair.Second; // Tip konvertasiyasına ehtiyac yoxdur
// Yanlış nümunə
// var wrongPair = new Pair<string, int>(123, "Hello"); // Kompilyasiya xətası: tiplər uyğun deyil
TypeScript nümunəsi:
// Generik funksiya - array-in ilk elementini almaq
function getFirstElement<T>(arr: T[]): T | undefined {
if (arr.length > 0) {
return arr[0];
}
return undefined;
}
// İstifadə
let numbers: number[] = [1, 2, 3];
let firstNumber = getFirstElement(numbers); // firstNumber tipində number
let words: string[] = ["a", "b", "c"];
let firstWord = getFirstElement(words); // firstWord tipində string
// let mixedArray: (number | string)[] = [1, "a", 2];
// let firstMixed = getFirstElement(mixedArray); // firstMixed tipində number | string
Nəticədə, generics güclü vasitədir, çevik, tip təhlükəsiz və təkrar istifadə edilə bilən kodlar yaratmağa imkan verir.