El término paradigma de diseño objetivo-acción se refiere a un tipo de arquitectura de software en la que un programa informático se divide en objetos que establecen relaciones dinámicamente, indicándose entre sí a qué objeto deben dirigirse y qué acción o mensaje enviarle cuando ocurre un evento. Esto resulta especialmente útil al implementar interfaces gráficas de usuario , que por naturaleza se basan en eventos .
Ventajas
El enfoque de acción-objetivo para sistemas basados en eventos permite un dinamismo mucho mayor en comparación con otros enfoques más estáticos, como la herencia de clases . Esto se debe a que la herencia de clases es una forma relativamente rígida de programar: el programador debe definir la lógica de interconexión interna del programa en la fase de diseño, y esta no se puede modificar posteriormente, a menos que el programa se detenga, se rediseñe y se vuelva a construir. Por otro lado, la programación basada en acción-objetivo permite modificarla completamente en tiempo de ejecución , lo que posibilita que el programa cree nuevas interrelaciones y comportamientos novedosos por sí mismo.
Un ejemplo clave de este enfoque es la API de OpenStep , que, en parte gracias a estar basada en el lenguaje dinámico Objective-C , tiene gran parte de su interfaz gráfica de usuario implementada mediante el paradigma objetivo-acción. Consideremos el siguiente ejemplo, escrito en Objective-C:
[botón setTarget: self]; [botón setAction: @selector(doSomething)];
Ahora, cuando se presiona el botón identificado por la variable `button` , el sistema en tiempo de ejecución intentará enviar un mensaje llamado `doSomething` al objeto en el que se ha invocado este código. También es perfectamente posible determinar el mensaje que se enviará en tiempo de ejecución:
[botón setTarget: self]; [button setAction: NSSelectorFromString([textField stringValue])];
Aquí, el mensaje que se va a enviar se determina consultando el valor de cadena de un campo de texto (la cadena de texto que el usuario escribió en dicho campo). Esta cadena se convierte posteriormente en un mensaje (mediante la función NSSelectorFromString ) y se pasa al botón como su acción. Esto es posible porque, en Objective-C, los métodos se representan mediante un selector , una cadena simple que describe el método que se va a llamar. Cuando se envía un mensaje, el selector se envía al entorno de ejecución de ObjC, se compara con una lista de métodos disponibles y se llama a la implementación del método. La implementación del método se consulta en tiempo de ejecución, no en tiempo de compilación.
Desventajas
Debido al dinamismo extremo y la libertad de comportamiento que ofrecen los programas diseñados con el paradigma objetivo-acción, puede ocurrir que el programador implemente incorrectamente parte de la lógica de interconexión, lo que puede generar errores a veces difíciles de detectar. Esto se debe a la falta de control en tiempo de compilación que proporciona el compilador , ya que este no puede visualizar las interconexiones. Por lo tanto, el control de la consistencia de las interconexiones queda totalmente a cargo del programador.
El resultado de una vinculación incorrecta entre objetivo y acción puede variar según cómo el sistema particular en el que se implementa el programa lo considere:
- Puede ignorar la condición y no hacer nada (como en el ejemplo del botón anterior : si el destino de un botón no responde a su mensaje de acción, al presionar el botón simplemente no sucede nada).
- Puede considerar que dicho estado es un error , en cuyo caso lo más probable es que provoque que el programa falle o genere una excepción en tiempo de ejecución .
Véase también
- La API de OpenStep
- NeXTSTEP : un sistema operativo de NeXT Software Inc. (ahora Apple Inc. ) basado en gran medida en la API OpenStep.
- GNUstep : una implementación gratuita de la API OpenStep.
- Cocoa : una API derivada de NeXTSTEP utilizada en Mac OS X.
- Objetivo-C
Enlaces externos
- Página principal del proyecto GNUstep
- La página de documentación de la API Cocoa de Apple
- Arquitectura de software