Sobes.tech
Junior

Генерикҳо чистанд?

sobes.tech AI

Ҷавоб аз AI

Генерикҳо дар барномасозӣ воситаи эҷоди компонентҳои такроршаванда мебошанд, ки метавонанд бо намудҳои гуногуни додаҳо кор кунанд, бидуни аз даст додани бехатарии намуд. Онҳо имкон медиҳанд, ки синфҳо, интерфейсҳо ва усулҳоро нависед, ки метавонанд бо параметрҳои намуд кор кунанд.

Афзалиятҳои асосӣ:

  • Бехатарии намуд дар марҳилаи компилятсия: Гурӯҳҳои, ки бо номувофиқии намудҳо алоқаманданд, ҳанӯз пеш аз иҷрои барнома ошкор мешаванд.
  • Кам кардани такрори коди: Мумкин аст, ки як алгоритми умумӣ ё структураи додаҳо нависед, ки бо намудҳои гуногун кор мекунад.
  • Ҳосилнокӣ: Баръакс ба истифодаи намудҳои умумӣ (мисли Object), ниёз ба табдили намудҳо (cast) нест, ки метавонад ҳосилнокиро беҳтар кунад.

Масалан дар Java:

// Класс List бе намудҳои генерикӣ (таҷрибаи кӯҳна)
List list = new ArrayList();
list.add("hello");
list.add(123); // Мебошад, ки ҳар намудро илова кард
String s = (String) list.get(0); // Ниёз ба табдили намудҳои дастӣ
Integer i = (Integer) list.get(1); // Ниёз ба табдили намудҳои дастӣ

// Класс List бо намудҳои генерикӣ
List<String> stringList = new ArrayList<>();
stringList.add("world");
// stringList.add(123); // Хатогӣ дар компилятсия! Танҳо сатрҳо иҷозат дода шудаанд

String s2 = stringList.get(0); // Ниёз ба табдили намуд нест

Генерикҳо имкон медиҳанд, ки намудҳои додаҳоро муайян кунед, ки коллектсия ё дигар синфи умумӣ/интерфейс бо онҳо кор мекунад. Ин қатъият дар намудҳо таъмин мекунад ва хатогиҳоро дар вақти иҷро, ки бо намудҳои нодуруст алоқаманданд, пешгирӣ мекунад.

Масалан, дар C# генерикҳо дар коллектсияҳо низ истифода мешаванд:

// Листи сатрҳо бо истифодаи генерикҳо
List<string> names = new List<string>();
names.Add("Alice");
// names.Add(123); // Хатогӣ дар компилятсия

string firstName = names[0]; // Ниёз ба табдили намуд нест

Дар Python, консепсияи генерикҳо бо истифода аз анотасияҳои намуд (type hints) ва модул typing амалӣ карда шудааст:

from typing import List, Dict, Any

# Листи сатрҳо бо анотацияи намуд
def process_strings(data: List[str]):
    for item in data:
        print(item)

# Словар бо калидҳо-стрингҳо ва арзишҳои ҳар намуд
def process_dict(data: Dict[str, Any]):
    for key, value in data.items():
        print(f"{key}: {value}")

Ҳатто дар Python анотасияҳои намудҳо дар вақти иҷро қатъӣ нестанд (ин вазифаи таҳлилгарони статикӣ, мисли MyPy), онҳо ба беҳтар шудани хонданпазирии коди кӯмак мекунанд ва дар ҳалли хатогиҳо осонтар мебошанд.

Ҳамагон, генерикҳо воситаи қавӣ барои эҷоди коди чандир, такроршаванда ва бехатар дар намудҳо дар забонҳои барномасозӣ мебошанд.