Flattening vs linearization

De Uqbar wiki

Cuando el comportamiento de un objeto es separado en distintas abstracciones, es necesario definir cómo se resolverá la tarea de encontrar el comportamiento definido (method lookup).

Si las abstracciones son suficientemente dispares (sin comportamiento en común), pueden pensarse como complementarias, y, en consecuencia, la manera en la que se desarrolle dicha búsqueda no impactará en el comportamiento resultante. Sin embargo, cuando las abstracciones son análogas, o peor, contradictorias, el mecanismo que define el comportamiento final del objeto es un factor crítico.

Todos los lenguajes que brindan dicha modularización de abstracciones ofrecen de una u otra manera un mecanismo de búsqueda de comportamiento, de donde se destacan dos visiones principales: linearización (o “linearization”) y el aplanado (“flattening”).

La linearization es un mecanismo que define un orden para las abstracciones, priorizando unas sobre otras. A la hora de proveer un método, aquella con mayor prioridad es la que lo otorga. Todo mecanismo de linearization define un Method Resolution Order (MRO). El caso más común es el de la herencia simple, en donde si un objeto recibe un mensaje, el método que se ejecutará es el que esté más cercano avanzando hacia lo más general en la jerarquía de herencia. Este mecanismo también es usado para la herencia múltiple y los Mixins.

El flattening es un mecanismo que no prioriza abstracciones, sino que deja al usuario resolver las situaciones contradictorias o “conflictos”, mediante diferentes herramientas. Los Traits de Smalltalk se manejan con flattening, y la manera de solucionar conflictos se basa en el uso de operaciones para ajustar la composición de traits a las necesidades de cada caso, siendo un mecanismo muy flexible y a la vez simple de entender. Respecto al method lookup, como este mecanismo aplana los métodos definidos en la clase usuaria, encontrar el método correspondiente a un mensaje provisto por la otra entidad es lo mismo que encontrar el método para un mensaje propio.

Latest update on July 17, 2017 by GitHub