predicate dispatch
Megjelenés
| polymorphism |
|---|
| ad hoc polymorphism |
| parametric polymorphism |
| subtyping |
Főnév
predicate dispatch (tsz. predicate dispatches)
- (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.
thisvagyvptr) 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
Shapetí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) |
- predicate dispatch - Szótár.net (en-hu)
- predicate dispatch - Sztaki (en-hu)
- predicate dispatch - Merriam–Webster
- predicate dispatch - Cambridge
- predicate dispatch - WordNet
- predicate dispatch - Яндекс (en-ru)
- predicate dispatch - Google (en-hu)
- predicate dispatch - Wikidata
- predicate dispatch - Wikipédia (angol)