Ugrás a tartalomhoz

predicate dispatch

A Wikiszótárból, a nyitott szótárból


Főnév

predicate dispatch (tsz. predicate dispatches)

  1. (informatika) Predicate dispatch egy haladó dinamikus diszpatch technika, amely lehetővé teszi, hogy egy függvényhívás során a paraméterekre vonatkozó logikai feltételek (predikátumok) alapján válasszuk ki a megfelelő függvényt vagy metódust. Ez általánosabb és erősebb mechanizmus, mint a hagyományos típus alapú diszpatch (pl. C++-ban a virtuális függvények).



🔍 Alapgondolat

Hagyományos diszpatch (pl. C++ virtuális függvények):

  • Döntés egyetlen futásidejű típus (pl. this vagy vptr) alapján.

Predicate dispatch:

  • A döntés bármilyen logikai kifejezés (predikátum) alapján történik.
  • Ezek a predikátumok általában a függvény paramétereire, értékeire vagy állapotára vonatkoznak.



📚 Példa szemléltetésre

Képzeld el, hogy van egy draw függvény, amely különbözően viselkedik, attól függően, hogy:

  • a Shape típusa milyen,
  • és mekkora a mérete (area() értéke).

Pseudokód (predicate dispatch-sel)

draw(s: Shape) when (type(s) == Circle && s.radius > 100) {
    drawBigCircle(s);
}

draw(s: Shape) when (type(s) == Circle) {
    drawSmallCircle(s);
}

draw(s: Shape) when (type(s) == Square && s.area() > 200) {
    drawBigSquare(s);
}

draw(s: Shape) {
    drawGenericShape(s);
}

A rendszer kiválasztja a legspecifikusabb predikátumot, amely igaz a paraméterekre.



🧠 Elméleti háttér

  • Minden függvénydefinícióhoz tartozik egy predikátum (pl. x > 10 && isEven(x)).
  • A diszpatch mechanizmus a predikátumok értékelésével dönti el, hogy melyik implementációt válassza.
  • Ha több predikátum is teljesül, akkor a legspecifikusabbat kell választani (részleges sorrend alapján).



🤖 Nyelvek, amelyek támogatják

C++ nem támogatja natív módon, de más nyelvek és kutatási rendszerek igen:

  • Common Lisp Object System (CLOS) – támogatja a “generalized dispatch”-et.
  • MultiJava, PredicateJ, Dylan, Julia – részben vagy teljesen támogatják.
  • Prolog – deklaratív logikai nyelvként hasonló mechanizmusokat használ.



🛠️ Implementáció C++-ban (imitációval)

Mivel C++ nem támogat predicate dispatch-t natívan, alternatív megoldások szükségesek:

1. Manual if-else dispatch

void draw(const Shape& s) {
    if (const Circle* c = dynamic_cast<const Circle*>(&s)) {
        if (c->radius > 100)
            drawBigCircle(*c);
        else
            drawSmallCircle(*c);
    } else if (const Square* sq = dynamic_cast<const Square*>(&s)) {
        if (sq->area() > 200)
            drawBigSquare(*sq);
        else
            drawGenericShape(s);
    } else {
        drawGenericShape(s);
    }
}

Nem elegáns, de utánzó megoldás.



📦 Előnyök

  • Kifejezőerő: Komplex feltételek alapján is lehet diszpatchelni.
  • Tiszta kód: Szétválaszthatók a viselkedések predikátum szerint.
  • Általánosabb mint single/multiple dispatch.



❌ Hátrányok

Hátrány Magyarázat
Lassabb futásidő Predikátumok kiértékelése költséges lehet
Bonyolultabb implementáció Típusellenőrzés és sorrend feloldása nehéz
C++-ban nincs beépítve Csak workaround-okkal elérhető



🧩 Összefoglalás

Fogalom Leírás
Predicate dispatch A diszpatch során nemcsak típus, hanem tetszőleges logikai feltételek alapján választunk függvényt
Hasonlít if constexpr, std::enable_if, concepts (részben)
Nem támogatott nyelvek C++, Java
Támogatott nyelvek CLOS, Julia, Dylan, MultiJava, Prolog (analóg módon)