Sobes.tech
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.