La esquizofrenia de objetos o esquizofrenia del yo es una complicación que surge de la delegación y técnicas relacionadas en la programación orientada a objetos , donde self
/this
puede referirse a más de un objeto. A modo de metáfora con la confusión pública del trastorno de identidad disociativo con el diagnóstico psiquiátrico de esquizofrenia , estando el primero asociado con "personalidades divididas", esta configuración se denomina esquizofrenia de objetos o esquizofrenia del yo en la programación orientada a objetos. [1]
Un objeto puede definirse como un concepto informático que combina datos y comportamientos, y que tiene una identidad. En la programación basada en clases , los objetos se construyen sobre sistemas de clases, donde un objeto es una instancia de una clase. Las clases pueden, a su vez, estar relacionadas por herencia : una clase base proporciona el comportamiento fundamental o predeterminado de un objeto, y actúa como plantilla para crear objetos, mientras que una clase derivada puede usarse para anular los comportamientos de una clase base, y puede usarse como plantilla para objetos cuyos comportamientos refinan los de la clase base.
Una alternativa a las clases y la herencia son los prototipos y la delegación , [2] que se utiliza en la programación basada en prototipos y es más dinámica. En lugar de utilizar una clase para refinar otra, la delegación permite que un objeto anule el comportamiento de otro. El objeto original a (análogo a los comportamientos de la clase derivada) puede delegar algunos de sus métodos a otro objeto b (análogo a los comportamientos de la clase base). Si a delega su método foo al método bar de b , entonces cualquier invocación de foo en a hará que se ejecute el método bar de b . Sin embargo, bar se ejecuta en el contexto del objeto a , por ejemplo, su identificador se refiere a a en lugar de a b .self
Cuando se utiliza la delegación, surge la pregunta: ¿Cuál es el valor de self
cuando se evalúa un método en el objeto a , que se delega a un método en el objeto b ? La identidad se divide: puede referirse a a o b . Tenga en cuenta que, si bien los dos objetos están separados y tienen una identidad física separada, self
(ya sea que se use explícita o implícitamente) es ambiguo.
Herrmann [3] informa que el término fue acuñado por William Harrison, IBM Research, alrededor de mayo de 1997 en un conjunto de páginas web, que discutían los problemas incurridos por algunos de los patrones de diseño comunes (estas páginas web ya no están disponibles públicamente). En los ejemplos dados, el problema se agravó por el hecho de que las soluciones típicas utilizarían una forma más débil de delegación (a veces llamada reenvío ) donde el conocimiento sobre el objeto receptor original en realidad se pierde durante la delegación. Aquí el uso del reenvío se debe al hecho de que la mayoría de los lenguajes de programación orientados a objetos convencionales no admiten la forma más fuerte de delegación. Harrison et al propusieron la programación orientada a sujetos como una solución, que por composición estática evita cualquier problema de esquizofrenia de objetos. En el otro extremo del espectro, Herrmann muestra que un lenguaje que presenta roles contextuales puede diseñarse de tal manera que los problemas potenciales de esquizofrenia de objetos sean esencialmente irrelevantes a pesar de utilizar la delegación como un medio para compartir el comportamiento entre un objeto de rol y su objeto base asociado .