Linealización C3

La linealización de la superclase C3 es un algoritmo  utilizado principalmente para obtener una linealización estable de una jerarquía de herencia múltiple en la programación orientada a objetos . Esta linealización se utiliza para determinar el orden en el que se deben heredar los métodos, lo que a menudo se denomina en la literatura inglesa como "MRO" (abreviatura de "Orden de resolución de métodos", es decir, "orden de resolución de métodos"). C3 en el título indica tres características principales de la linealización final: gráfico estable y en expansión (en antigüedad) , preservación del orden local de precedencia y monotonicidad. Esta teoría se presentó por primera vez en 1996 en la conferencia OOPSLA , en un artículo titulado "Monotone Superclass Linearization for the Dylan Language" [1] . Posteriormente, este algoritmo se eligió como el algoritmo predeterminado para la resolución de métodos en el lenguaje de programación Python 2.3 (y posterior), Perl 6 y la máquina virtual Parrot . También está disponible como alternativa (no el MRO predeterminado) en el núcleo de Perl 5 desde la versión 5.10.0. Una implementación extendida para versiones anteriores de Perl 5 se llama Class::C3 y existe en CPAN .

Ejemplo

Para

clase O la clase A se extiende O la clase B se extiende O la clase C se extiende O la clase D se extiende a O la clase E extiende O la clase K1 se extiende A, B, C clase K2 extiende D, B, E clase K3 extiende D, A clase Z extiende K1, K2, K3

La linealización de Z se considera como

L(O) := [O] // la linealización de O es trivial, es una lista de un elemento [O] porque O no tiene padres L(A) := [A] + merge(L(O), [O]) // la linealización de A es A más la unión de las linealizaciones de los padres de A y los padres de A = [A] + fusionar ([O], [O]) = [A,O] L(B) := [B, O] // linealización de B, C, D y E 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]) // primero encuentra las linealizaciones de los padres de K1: L(A ), L(B) y L(C); y unirlos con la lista de padres [A, B, C] = [K1] + merge([A, O], [B, O], [C, O], [A, B, C]) // la clase A es adecuada para el primer paso de combinación porque solo aparece en el comenzando todas las listas = [K1, A] + merge([O], [B, O], [C, O], [B, C]) // la clase O no es adecuada porque está en las colas de las listas 2 y 3, pero... = [K1, A, B] + fusionar ([O], [O], [C, O], [C]) = [K1, A, B, C] + merge([O], [O], [O]) // después de todo, la clase O sigue siendo la única y última candidata = [K1, A, B, C, O] L(K2) := [K2] + fusionar(L(D), L(B), L(E), [D, B, E]) = [K2] + fusionar ([D, O], [B, O], [E, O], [D, B, E]) // seleccionar D = [K2, D] + fusionar ([O], [B, O], [E, O], [B, E]) // O no es adecuado, elija B = [K2, D, B] + fusionar ([O], [O], [E, O], [E]) // O no encaja, elija E = [K2, D, B, E] + fusionar ([O], [O], [O]) // elige O = [K2, D, B, E, O] L(K3) := [K3] + fusionar(L(D), L(A), [D, A]) = [K3] + fusionar ([D, O], [A, O], [D, A]) = [K3, D] + fusionar ([O], [A, O], [A]) = [K3, D, A] + fusionar ([O], [O]) = [K3, D, A, O] L(Z) := [Z] + fusionar(L(K1), L(K2), L(K3), [K1, K2, K3]) = [Z] + fusionar ([K1, A, B, C, O], [K2, D, B, E, O], [K3, D, A, O], [K1, K2, K3]) / / seleccione K1 = [Z, K1] + fusionar ([A, B, C, O], [K2, D, B, E, O], [K3, D, A, O], [K2, K3]) // A no apto, elija K2 = [Z, K1, K2] + merge([A, B, C, O], [D, B, E, O], [K3, D, A, O], [K3]) // A no t encaja, D no encaja, elija K3 = [Z, K1, K2, K3] + merge([A, B, C, O], [D, B, E, O], [D, A, O]) // A no cabe, elija D = [Z, K1, K2, K3, D] + fusionar ([A, B, C, O], [B, E, O], [A, O]) // seleccionar A = [Z, K1, K2, K3, D, A] + fusionar ([B, C, O], [B, E, O], [O]) // seleccionar B = [Z, K1, K2, K3, D, A, B] + fusionar ([C, O], [E, O], [O]) // seleccionar C = [Z, K1, K2, K3, D, A, B, C] + merge([O], [E, O], [O]) // O no encaja, elija E = [Z, K1, K2, K3, D, A, B, C, E] + fusionar ([O], [O], [O]) // elige O = [Z, K1, K2, K3, D, A, B, C, E, O] // respuesta

Designaciones:

L(Clase) - linealización de clase Clase [A,B,C] - una lista de tres elementos, donde la cabeza es A y la cola es [B,C] fusionar - fusionar listas

La función de fusión fusiona listas de tal manera que cada elemento aparece exactamente una vez en el resultado, de esta manera es similar a fusionar conjuntos, pero el orden de los elementos en la lista es importante aquí. La función de combinación funciona de la siguiente manera: itera sobre las listas de argumentos en orden de aparición (de izquierda a derecha), seleccionando el primer elemento, que puede ser el primero en varias listas, pero no se menciona en ninguna parte de la segunda y más allá, y lo mueve a la lista de resultados, excluyéndolos de las listas de argumentos, repitiendo este procedimiento varias veces hasta que todos los elementos se muevan de las listas de argumentos a la lista de resultados. Si en algún momento surge una situación en la que es imposible seleccionar un elemento candidato que satisfaga la condición especificada, es decir, si en todas las listas de argumentos los primeros elementos no aparecen primero en otras listas de argumentos, la lista resultante no se crea.

Notas

  1. "Una linealización de superclase monotónica para Dylan" . Actas de la conferencia OOPSLA '96 . Pulse . 1996-06-28. páginas. 69-82. DOI : 10.1145/236337.236343 . ISBN 0-89791-788-X . Archivado desde el original el 17 de agosto de 2000 . Consultado el 14 de diciembre de 2009 . Parámetro obsoleto utilizado |deadlink=( ayuda );Parámetros |deadurl=y |deadlink=duplicados entre sí ( ayuda ); Valor incorrecto |dead-url=404( ayuda ) Archivado el 17 de agosto de 2000 en Wayback Machine .

Enlaces