C3 linearizálás

A C3 szuperosztályú linearizálás egy olyan algoritmus  , amelyet elsősorban egy többszörös öröklődésű hierarchia stabil linearizálására használnak az objektumorientált programozásban . Ez a linearizálás a módszerek öröklésének sorrendjének meghatározására szolgál, amelyet az angol szakirodalom gyakran "MRO"-nak (a "Method Resolution Order" rövidítése, azaz "method resolution order") emleget. A címben szereplő C3 a végső linearizálás három fő jellemzőjét jelöli: stabil és bővülő (idősség szerint) gráf , a lokális prioritási sorrend megőrzése és a monotonitás. Ezt az elméletet először 1996 -ban mutatták be az OOPSLA konferencián , a "Monotone Superclass Linearization for the Dylan Language" [1] című tanulmányában . Ezt követően ezt az algoritmust választották alapértelmezett algoritmusként a metódusfeloldáshoz a Python 2.3 (és újabb), a Perl 6 és a Parrot virtuális gépek programozási nyelvében . Alternatívaként is elérhető (nem az alapértelmezett MRO) a Perl 5 magban az 5.10.0 verzió óta. A Perl 5 korábbi verzióihoz egy kiterjesztett megvalósítást Class::C3 -nak hívnak, és a CPAN -on létezik .

Példa

Mert

O osztály Az A osztály kiterjeszti az O-t A B osztály kiterjeszti az O-t A C osztály kiterjeszti az O-t A D osztály kiterjeszti az O-t Az E osztály kiterjeszti az O-t A K1 osztály kiterjeszti az A-t, B-t, C-t A K2 osztály kiterjeszti D, B, E A K3 osztály kiterjeszti D, A-t Z osztály K1, K2, K3 kiterjeszti

Z linearizálását úgy tekintjük, mint

L(O) := [O] // O linearizálása triviális, ez egy egyelemű lista [O], mert O-nak nincsenek szülei L(A) := [A] + merge(L(O), [O]) // A linearizálása A, plusz A szülei és A szülei linearizációinak uniója = [A] + összevonás ([O], [O]) = [A,O] L(B) := [B, O] // B, C, D és E linearizálása L(C) := [C,O] L(D) := [D, O] L(E) := [E, O] L(K1) := [K1] + merge(L(A), L(B), L(C), [A, B, C]) // először keressük meg a K1 szülőinek linearizációit: L(A ), L(B) és L(C); és csatlakoztassa őket a szülők listájához [A, B, C] = [K1] + merge([A, O], [B, O], [C, O], [A, B, C]) // Az A osztály alkalmas az első összevonási lépésre, mert csak a minden lista elején = [K1, A] + merge([O], [B, O], [C, O], [B, C]) // az O osztály nem megfelelő, mert a 2. és 3. listák végében van, de... = [K1, A, B] + összevonás ([O], [O], [C, O], [C]) = [K1, A, B, C] + merge([O], [O], [O]) // végül is az O osztály marad az egyetlen és utolsó jelölt = [K1, A, B, C, O] L(K2) := [K2] + összevonás(L(D), L(B), L(E), [D, B, E]) = [K2] + összevonás ([D, O], [B, O], [E, O], [D, B, E]) // D kiválasztása = [K2, D] + egyesítés([O], [B, O], [E, O], [B, E]) // O nem megfelelő, válassza a B-t = [K2, D, B] + egyesítés([O], [O], [E, O], [E]) // O nem fér, válassza az E-t = [K2, D, B, E] + egyesítés ([O], [O], [O]) // válassza az O-t = [K2, D, B, E, O] L(K3) := [K3] + összevonás(L(D), L(A), [D, A]) = [K3] + összevonás ([D, O], [A, O], [D, A]) = [K3, D] + összevonás ([O], [A, O], [A]) = [K3, D, A] + összevonás ([O], [O]) = [K3, D, A, O] L(Z) := [Z] + összevonás(L(K1), L(K2), L(K3), [K1, K2, K3]) = [Z] + összevonás ([K1, A, B, C, O], [K2, D, B, E, O], [K3, D, A, O], [K1, K2, K3]) / / válassza a K1-et = [Z, K1] + összevonás ([A, B, C, O], [K2, D, B, E, O], [K3, D, A, O], [K2, K3]) // A nem megfelelő, válassza a K2-t = [Z, K1, K2] + összevonás([A, B, C, O], [D, B, E, O], [K3, D, A, O], [K3]) // A nem t illik , D nem illik, válassza a K3-at = [Z, K1, K2, K3] + merge([A, B, C, O], [D, B, E, O], [D, A, O]) // A nem fér, válasszon D = [Z, K1, K2, K3, D] + egyesítés ([A, B, C, O], [B, E, O], [A, O]) // válassza az A = [Z, K1, K2, K3, D, A] + egyesítés ([B, C, O], [B, E, O], [O]) // válassza a B = [Z, K1, K2, K3, D, A, B] + egyesítés ([C, O], [E, O], [O]) // válassza a C = [Z, K1, K2, K3, D, A, B, C] + merge([O], [E, O], [O]) // O nem illik, válassza az E = [Z, K1, K2, K3, D, A, B, C, E] + egyesítés ([O], [O], [O]) // válassza az O = [Z, K1, K2, K3, D, A, B, C, E, O] // válasz

Megnevezések:

L(Class) - osztály linearizálása Osztály [A,B,C] – három elemből álló lista, ahol a fej A, a farok pedig [B,C] merge - listák összevonása

Az egyesítő függvény úgy egyesíti a listákat, hogy minden elem pontosan egyszer forduljon elő az eredményben, így hasonló a halmazok egyesítéséhez, de itt fontos az elemek sorrendje a listában. Az egyesítő funkció a következőképpen működik - az argumentumlistákon iterál az előfordulás sorrendjében (balról jobbra), kiválasztva az első elemet, amely több listában lehet az első, de a másodikban és azon túl sehol nem szerepel, és áthelyezi az eredménylistába, kizárva a listákból -argumentumokat, ezt az eljárást többször megismétli, amíg minden elem át nem kerül az argumentumlistákból az eredménylistába. Ha egy szakaszban olyan helyzet áll elő, hogy lehetetlen kiválasztani a megadott feltételnek megfelelő jelölt elemet, pl. ha az összes argumentumlistában az első elemek nem először fordulnak elő más argumentumlistákban, akkor az eredményül kapott lista nem jön létre.

Jegyzetek

  1. "Egy monoton szuperosztályú linearizálás Dylan számára" . OOPSLA '96 konferencia anyaga . ACM Nyomja meg a gombot . 1996-06-28. pp. 69-82. DOI : 10.1145/236337.236343 . ISBN 0-89791-788-X . Archiválva az eredetiből , ekkor: 2000-08-17 . Letöltve: 2009-12-14 . Elavult használt paraméter |deadlink=( help );Paraméterek |deadurl=és |deadlink=duplikálják egymást ( help ); Hibás érték |dead-url=404( súgó ) Archiválva : 2000. augusztus 17. a Wayback Machine -nél

Linkek