En informática , la programación orientada a sujetos es un paradigma de software orientado a objetos en el que el estado (campos) y el comportamiento (métodos) de los objetos no se consideran intrínsecos a los objetos mismos, sino que son proporcionados por varias percepciones subjetivas ("sujetos") de los objetos. El término y los conceptos se publicaron por primera vez en septiembre de 1993 en un artículo de conferencia [1] que luego fue reconocido como uno de los tres artículos más influyentes que se presentaron en la conferencia entre 1986 y 1996. [2] Como se ilustra en ese artículo, se hace una analogía con el contraste entre las visiones filosóficas de Platón y Kant con respecto a las características de los objetos "reales", pero aplicadas a los de software. Por ejemplo, si bien todos podemos percibir un árbol como si tuviera una altura, un peso, una masa de hojas, etc. medibles, desde el punto de vista de un pájaro, un árbol también puede tener medidas de valor relativo para fines de alimentación o anidación, o desde el punto de vista de un tasador de impuestos, puede tener un cierto valor imponible en un año determinado. Ni la información estatal adicional del pájaro ni la del tasador de impuestos deben considerarse intrínsecas al árbol, sino que se agregan mediante las percepciones del pájaro y del tasador de impuestos y, a partir del análisis de Kant, lo mismo puede ser cierto incluso de las características que consideramos intrínsecas.
La programación orientada a sujetos propugna la organización de las clases que describen objetos en "sujetos", que pueden ser compuestos para formar sujetos más grandes. En los puntos de acceso a campos o métodos , se pueden componer las contribuciones de varios sujetos. Estos puntos se caracterizaron como los puntos de unión [3] de los sujetos. Por ejemplo, si se corta un árbol, los métodos involucrados pueden necesitar unir el comportamiento de los sujetos del pájaro y del tasador de impuestos con el del propio árbol. Por lo tanto, es fundamentalmente una visión de la naturaleza compositiva del desarrollo de software, en oposición a la naturaleza algorítmica (procedimental) o de ocultación de representaciones (objeto).
La introducción de la programación orientada a aspectos en 1997 [4] planteó preguntas sobre su relación con la programación orientada a temas y sobre la diferencia entre temas y aspectos. Estas preguntas quedaron sin respuesta durante algún tiempo, pero se abordaron en la patente sobre programación orientada a aspectos presentada en 1999 [5] en la que surgen dos puntos como diferencias características con respecto a la técnica anterior:
En la perspectiva orientada a los aspectos, el punto de corte transversal puede ubicarse por separado del aspecto (sujeto) y el comportamiento no es forzado por el aspecto, sino que es gobernado por reglas de composición. La perspectiva retrospectiva [6] también permite distinguir la programación orientada a los aspectos por su introducción y explotación del concepto de un punto de corte similar a una consulta para imponer externamente los puntos de unión utilizados por los aspectos de manera general.
En la presentación de la programación orientada a aspectos, los puntos de unión se restringieron deliberadamente al acceso a campos y a la llamada a métodos, con el argumento de que esos eran los puntos en los que los sistemas bien diseñados estaban diseñados para admitir la extensión funcional. El uso de puntos de corte impuestos externamente es una capacidad lingüística importante, pero sigue siendo una de las características más controvertidas de la programación orientada a aspectos. [7]
A principios del milenio, estaba claro que varios grupos de investigación estaban buscando diferentes tecnologías que empleaban la composición o la unión de estados y funciones empaquetados por separado para formar objetos. [8] Para distinguir el campo de interés común de la Programación Orientada a Aspectos con sus definiciones de patentes particulares y para enfatizar que la tecnología compositiva se ocupa de más que solo la fase de codificación del desarrollo de software, estas tecnologías se organizaron juntas bajo el término Desarrollo de Software Orientado a Aspectos , [9] y se inició una organización y una serie de conferencias internacionales sobre el tema. Al igual que la programación orientada a aspectos, la programación orientada a temas, los filtros de composición, la programación orientada a características y los métodos adaptativos se consideran enfoques de desarrollo de software orientado a aspectos.
La formulación original de la programación orientada a sujetos la concibió deliberadamente como una tecnología de empaquetamiento, que permitía ampliar el espacio de funciones y tipos de datos en cualquier dimensión. Las primeras implementaciones habían sido para C++, [10] y Smalltalk. [11] Estas implementaciones explotaron los conceptos de etiquetas de software y reglas de composición para describir la unión de sujetos.
Para abordar la preocupación de que se debería proporcionar una mejor base para el análisis y la composición de software no sólo en términos de su empaquetado sino en términos de las diversas preocupaciones que estos paquetes abordaban, se desarrolló una organización explícita del material en términos de una "matriz" multidimensional en la que las preocupaciones se relacionan con las unidades de software que las implementan. Esta organización se denomina separación multidimensional de preocupaciones y el artículo que la describe [12] ha sido reconocido como el artículo más influyente de la Conferencia ICSE de 1999. [13]
Este nuevo concepto se implementó para componer software Java , utilizando el nombre Hyper/J para la herramienta. [14]
La composición y el concepto de sujeto se pueden aplicar a artefactos de software que no tienen semántica ejecutable, como especificaciones de requisitos o documentación. Se ha descrito un vehículo de investigación para Eclipse , llamado Concern Manipulation Environment (CME), [15] en el que se aplican herramientas de consulta, análisis, modelado [16] y composición a artefactos en cualquier lenguaje o representación, mediante el uso de adaptadores de complemento adecuados para manipular la representación.
Como parte de CME, se desarrolló un sucesor del motor de composición Hyper/J [17] que utiliza un enfoque general para los diversos elementos de un motor de composición:
Tanto Hyper/J como CME están disponibles en alphaWorks [18] o sourceforge, [19] respectivamente, pero ninguno de ellos recibe soporte activo.
El envío de métodos en la programación orientada a objetos puede considerarse "bidimensional" en el sentido de que el código ejecutado depende tanto del nombre del método como del objeto en cuestión. Esto puede contrastarse [20] con la programación procedimental, donde el nombre de un procedimiento se resuelve directamente, o unidimensionalmente, en una subrutina, y también con la programación orientada a sujetos, donde el remitente o sujeto también es relevante para el envío, lo que constituye una tercera dimensión.