stringtranslate.com

Asesoramiento (programación)

En programación funcional y de aspectos , el consejo describe una clase de funciones que modifican otras funciones cuando estas últimas se ejecutan; es una determinada función, método o procedimiento que se debe aplicar en un punto de unión dado de un programa.

Usar

El uso práctico de las funciones de asesoramiento es generalmente modificar o extender de otro modo el comportamiento de funciones que no pueden o no deben modificarse o extenderse fácilmente. Por ejemplo, el complemento Emacspeak de Emacs hace un uso extensivo de los consejos: debe modificar miles de módulos y funciones de Emacs existentes de modo que pueda producir una salida de audio para personas ciegas que corresponda a la presentación visual, pero sería inviable copiarlos todos y redefinirlos para producir una salida de audio además de sus salidas normales; por lo tanto, los programadores de Emacspeak definen funciones de asesoramiento que se ejecutan antes y después.

Para dar un ejemplo sencillo de Emacs: supongamos que después de que un usuario corrigiera una palabra mal escrita utilizando el módulo ispell de Emacs , quisiera volver a corregir la ortografía de todo el búfer. ispell-wordno ofrece esa funcionalidad, incluso si la palabra corregida aparece con frecuencia en el búfer. El usuario podría buscar la definición de ispell-word, copiarla en sus archivos personales de Emacs y agregar allí la funcionalidad deseada, pero esto es tedioso y, lo que es peor, frágil (la versión del usuario ahora está desincronizada con la implementación principal de Emacs, si es que funciona sin más refactorización). Lo que el usuario quiere es bastante simple: simplemente ejecutar otro comando cada vez que ispell-wordse ejecuta . Con la ayuda de un consejo, se puede hacer de manera tan simple como esto:

 ( consejo-agrega #' ispell-word :después de #' flyspell-buffer )   

Aunque este ejemplo es obviamente trivial, la fuerza de advice, especialmente cuando se compara con facilidades similares como los decoradores de Python y las anotaciones de Java , radica en el hecho de que no solo las funciones/métodos recomendados no necesitan estar diseñados para aceptar consejos, sino que también los consejos en sí mismos no necesitan estar diseñados para ser utilizables como consejos: son solo funciones normales. La disponibilidad de evaluación durante la vida útil de una pieza de código (cf. staging de código ) en Lisp permite que advice se incorpore automáticamente en cualquier otro código de diversas formas. Se puede recomendar a cualquier pieza de código que realice cualquier otro cálculo antes, después, alrededor o en lugar de su definición original.

Legibilidad

Los consejos pueden generar confusión, ya que un consejo aplicado a una función no es evidente para un usuario que busca la definición de origen de la función para conocerla. En tales casos, los consejos actúan casi como un COMEFROM , una función de broma añadida a INTERCAL para burlarse de la espaguetificación que acompaña al uso extensivo de GOTOs . Sin embargo, en la práctica, estos problemas rara vez se presentan. Los desarrolladores y mantenedores de paquetes y módulos de Lisp nunca utilizan consejos, ya que no hay ninguna ventaja que obtener al aconsejar funciones cuando sus definiciones de origen originales se pueden reescribir libremente para incluir las características deseadas. Los consejos solo son útiles porque permiten a los usuarios posteriores modificar posteriormente el comportamiento predeterminado de una manera que no requiere la propagación de dichas modificaciones en la definición de origen de la implementación principal.

Implementaciones

Una forma de consejos formaba parte de C con las clases a finales de los años 1970 y principios de los años 1980, es decir, funciones llamadas cally returndefinidas en una clase, que se llamaban antes (respectivamente, después) de las funciones miembro de la clase. Sin embargo, estas se eliminaron de C++ . [1]

Los consejos son parte del Sistema de objetos Common Lisp (CLOS), como los métodos :before, :after, y :around, que se combinan con el método principal en la "combinación de métodos estándar". [2]

Las implementaciones de Common Lisp proporcionan funciones de asesoramiento (además de la combinación de métodos estándar para CLOS) como extensiones. LispWorks [3] admite funciones de asesoramiento, macros y métodos CLOS.

EmacsLisp agregó código relacionado con consejos en la versión 19.28, 1994.

Historia

Lo que sigue es un extracto de una discusión en la lista de correo aosd-discuss. Pascal Costanza contribuyó con lo siguiente:

El término "advice" se remonta al término advising (consejo) , introducido por Warren Teitelman en su tesis doctoral en 1966. A continuación, se incluye una cita del capítulo 3 de su tesis:

El asesoramiento es la innovación básica del modelo y del sistema PILOT. El asesoramiento consiste en insertar nuevos procedimientos en cualquiera o todos los puntos de entrada o salida de un procedimiento (o clase de procedimientos) en particular. Los procedimientos insertados se denominan "procedimientos de asesoramiento" o simplemente "asesoramiento".
Dado que cada consejo es en sí mismo un procedimiento, tiene sus propias entradas y salidas. En particular, esto significa que la ejecución del consejo puede hacer que el procedimiento que modifica se omita por completo, por ejemplo, especificando como salida del consejo una de las salidas del procedimiento original; o el consejo puede cambiar variables esenciales y continuar con el cálculo de modo que se ejecute el procedimiento original, pero con variables modificadas. Finalmente, el consejo puede no alterar la ejecución ni afectar en absoluto al procedimiento original, por ejemplo, puede simplemente realizar algún cálculo adicional como imprimir un mensaje o registrar el historial. Dado que el consejo puede ser condicional, la decisión sobre lo que se debe hacer puede depender de los resultados del cálculo hasta ese punto.
La principal ventaja de la asesoría es que el usuario no tiene que preocuparse por los detalles de los cambios reales en su programa ni por la representación interna de la asesoría. Puede tratar el procedimiento que se va a asesorar como una unidad , un bloque único, y realizar cambios en él sin preocuparse por los detalles de este bloque. Esto puede contrastarse con la edición, en la que el programador debe conocer la estructura interna del procedimiento.

El "asesoramiento" encontró su camino en BBN Lisp y más tarde en Interlisp de Xerox PARC .

También llegó a Flavors , la primera extensión orientada a objetos de Lisp desarrollada en el MIT . Se incluyeron bajo la noción de combinación de métodos. [4] [a]

Dado que la combinación de métodos y las macros están estrechamente relacionadas, también es interesante notar que el primer sistema de macros se describió en 1963, tres años antes de la tesis doctoral de Warren Teitelman. [5] [b]

Véase también

Notas

Gregor Kiczales comenta lo anterior de la siguiente manera:

  1. ^ Advice apareció por separado de Flavors en Maclisp y Lisp Machine . Podías recomendar cualquier función, al igual que en Interlisp en ese momento. La ontología antes/después apareció por separado en los métodos de Flavors.
  2. ^ La combinación de métodos y las macros solo estuvieron relacionadas marginalmente hasta mucho más tarde, en New Flavors y CLOS , cuando se proporcionó un mecanismo similar a una macro para permitir que las personas definieran sus propias reglas para combinar métodos. Antes de eso, las reglas que regían la combinación de métodos antes/después y los llamados métodos Whoppers (por ahí) estaban arregladas, y el compilador simplemente generaba el código para eso. Había cosas llamadas wrappers, que tenían un comportamiento similar al de una macro, pero no recuerdo cuándo aparecieron. Recorrer las distintas versiones del manual de MacLisp y Lispm para entender esta parte de la historia exactamente podría ser interesante. O podría ser que Howard Cannon o David Moon o alguien pudiera recordarlo todo exactamente.

Referencias

  1. ^ El diseño y la evolución de C++, pág. 57
  2. ^ "Una breve guía sobre CLOS". Archivado desde el original el 6 de mayo de 2015. Consultado el 27 de abril de 2015 .
  3. ^ Guía del usuario y manual de referencia de LispWorks 7, La función de asesoramiento
  4. ^ Véase, por ejemplo, AIM-602 en https://web.archive.org/web/20060913001624/http://www.ai.mit.edu/research/publications/browse/0600browse.shtml
  5. ^ Véase AIM-57 en https://web.archive.org/web/20060913001624/http://www.ai.mit.edu/research/publications/browse/0000browse.shtml

Enlaces externos