Cuándo utilizar patrones de comportamiento en la programación ABAP


Los patrones de comportamiento se concentran en la interacción mostrando cómo los objetos intercambian información, distribuyen tareas y ejecutan una lógica sofisticada como parte de una operación unificada.

Los elementos dinámicos del sistema reciben atención de los patrones de comportamiento, los patrones de creación manejan la creación de objetos y los patrones estructurales manejan la disposición de los objetos. Estos patrones le ayudan a estructurar algoritmos y distribuir el trabajo y la gestión del estado, lo que da como resultado programas flexibles y fáciles de mantener que puede ampliar fácilmente.

Tipos de patrones de comportamiento

Algunos patrones de comportamiento comunes que puede encontrar al desarrollarse con ABAP incluir lo siguiente.

Cadena de Responsabilidad

El patrón de cadena de responsabilidad pasa una solicitud a lo largo de una cadena de controladores hasta que uno de ellos la procesa. En ABAP, esto podría aplicarse a la lógica de validación con múltiples clases de condiciones de verificación (como autorizaciones, integridad de datos y reglas comerciales) hasta que un controlador maneja la solicitud o la falla.

Dominio

El patrón de comando encapsula una solicitud como un objeto, lo que le permite parametrizar clientes y poner en cola, registrar o deshacer acciones. En ABAP, esto es útil para tareas de flujo de trabajo o trabajos en segundo plano, donde cada objeto de comando representa una unidad de trabajo que se puede ejecutar o revertir.

Intérprete

El patrón de intérprete define la gramática e interpreta oraciones en esa gramática. Si bien no es tan común en el ABAP cotidiano, se puede utilizar para analizar reglas comerciales simples, fórmulas o lenguajes de consulta de dominios específicos almacenados en tablas de Customizing.

Iterador

El patrón iterador proporciona una forma de acceder a elementos de una colección de forma secuencial sin exponer la representación subyacente. En ABAP, las clases de iteradores personalizados pueden recorrer tablas internas, resultados de selección o incluso conjuntos de retorno BAPI, brindando a los consumidores una interfaz limpia para consumir datos fila por fila.

Mediador

El patrón mediador centraliza la comunicación compleja entre objetos, asegurando que no necesiten hacer referencia entre sí directamente. Las aplicaciones ABAP que coordinan múltiples controles de UI o servicios modulares pueden beneficiarse de un mediador que enrute mensajes a través de un único centro.

Recuerdo

El patrón de recuerdo captura y restaura el estado interno de un objeto sin exponer sus partes internas. En ABAP, esto puede resultar útil cuando implementa la funcionalidad de deshacer para transacciones de usuario o cuando guarda y restaura el estado de un objeto complejo durante el procesamiento por lotes.

Observador

El patrón de observador define una dependencia de uno a muchos, de modo que cuando un objeto cambia de estado, se notifica a todos los dependientes. ABAP admite este patrón de forma natural a través de eventos de clase y controladores de eventos, lo que lo convierte en una opción para escenarios en los que varios consumidores reaccionan ante una única fuente de verdad.

Estado

El patrón de estado permite que un objeto altere su comportamiento cuando cambia su estado interno. En ABAP, puede modelar el ciclo de vida de un pedido de ventas (es decir, creado, liberado, bloqueado y facturado) como un conjunto de objetos de estado, cada uno de los cuales controla qué acciones son posibles.

Estrategia

El patrón de estrategia define una familia de algoritmos y le permite intercambiarlos en tiempo de ejecución. Esta es una opción natural en ABAP cuando desea elegir entre múltiples estrategias de cálculo, impuestos o precios, según la personalización o el contexto.

Método de plantilla

El patrón del método de plantilla define el esqueleto de un algoritmo en una clase base, lo que permite a las subclases redefinir ciertos pasos. Los marcos de SAP utilizan esto ampliamente y los desarrolladores de ABAP pueden aplicarlo en escenarios como el procesamiento de facturas, donde el proceso general es fijo pero los pasos específicos varían según el tipo de documento.

Visitante

El patrón de visitante le permite definir nuevas operaciones en una estructura de objeto sin cambiar los objetos mismos. Aunque es menos común en ABAP, puede ser útil en estructuras jerárquicas (como listas de materiales o organigramas), donde desea aplicar diferentes operaciones (como validación, informes y transformación) sin saturar los objetos con todos los comportamientos posibles.

Explicaremos cómo puede utilizar patrones de comportamiento con más detalle en las siguientes secciones, incluido un análisis más detallado del patrón de estrategia.

Cuándo utilizar patrones de comportamiento en ABAP

Los patrones de comportamiento ayudan a los desarrolladores a separar los aspectos funcionales de su código de los detalles de implementación. Le permiten crear bloques de comportamiento reutilizables que permiten la delegación de solicitudes entre múltiples controladores, la transmisión de eventos a suscriptores y el reemplazo de algoritmos. Estos patrones coinciden con las características naturales del lenguaje ABAP a través de su implementación de eventos de clase, manejo de excepciones y programación basada en interfaces.

Los sistemas ABAP que operan durante décadas con una lógica empresarial compleja se benefician de los patrones de comportamiento porque estos patrones transforman complicados enredos de declaraciones IF en diseños adaptables. Los marcos de SAP implementan varios patrones a través de motores de flujo de trabajo (comando y cadena de responsabilidad), manejo de eventos de UI (observador y mediador) y marcos de aplicaciones que proporcionan plantillas de procesos comerciales (método de plantilla). Reconocer estos patrones le ayudará a mejorar sus habilidades ABAP y podrá comprender y analizar mejor el código SAP estándar.

Patrón de estrategia

El patrón de estrategia permite a los clientes seleccionar algoritmos de una familia de interfaces común en tiempo de ejecución. Se evitan ramas IF… ELSEIF… distribuidas para la selección de cálculo en el sistema al mover esta decisión a la fase de construcción o configuración, y el resto del sistema puede usar la interfaz. La selección de reglas de impuestos, precios y/o redondeo coincide perfectamente con la Personalización porque los usuarios realizan selecciones basadas en la sociedad, el país, el tipo de documento o la alternancia de funciones. El patrón estratégico mantiene opciones explícitas que siguen siendo comprobables y reemplazables.

El cálculo de los impuestos sobre los artículos de venta requiere una atención cuidadosa. Los requisitos difieren entre países y, a veces, entre grupos de productos. El sistema requiere que cada algoritmo funcione de forma independiente, pero la persona que llama debe interactuar con la estrategia impositiva sin saber qué algoritmo se ejecuta porque la persona que llama solo necesita solicitar el cálculo de impuestos para un artículo específico.

Veamos un patrón de estrategia de ejemplo. Primero, definirá la interfaz de la estrategia: un pequeño contrato que revela la intención.

INTERFACE zif_tax_strategy PUBLIC.

    METHODS compute_tax

       IMPORTING is_itemTYPE zty_so_item " your domain type

       RETURNING VALUE(rv_tax) TYPE decfloat34

       RAISING cx_static_check.

ENDINTERFACE.

A continuación, proporcione algunas estrategias concretas, como se muestra en la lista siguiente. Mantenga cada una centrada en su conjunto de reglas. Por ejemplo, creamos una estrategia fiscal estadounidense que solo tiene lógica relacionada con los impuestos establecidos en Estados Unidos. También creamos una clase para una estrategia fiscal de la UE que solo tiene lógica relacionada con las estrategias fiscales europeas.

CLASS zcl_tax_strategy_us DEFINITION PUBLIC CREATE PUBLIC.

    PUBLIC SECTION.

       INTERFACES zif_tax_strategy.

ENDCLASS.

CLASS zcl_tax_strategy_us IMPLEMENTATION.

    METHOD zif_tax_strategy~compute_tax.

       " Simplified: destination-based, flat rate example

       rv_tax = is_item-net_amount * CONV decfloat34( '0.060' ).

    ENDMETHOD.

ENDCLASS.

CLASS zcl_tax_strategy_eu DEFINITION PUBLIC CREATE PUBLIC.

   PUBLIC SECTION.

       INTERFACES zif_tax_strategy.

ENDCLASS.

CLASS zcl_tax_strategy_eu IMPLEMENTATION.

   METHOD zif_tax_strategy~compute_tax.

       " Simplified: VAT based on material group

       DATA(lv_rate) = COND decfloat34(

          WHEN is_item-matkl="FOOD" THEN '0.04'

          WHEN is_item-matkl="BOOK" THEN '0.07'

          ELSE '0.20' ).

       rv_tax = is_item-net_amount * lv_rate.

    ENDMETHOD.

ENDCLASS.

un pequeño contexto El objeto utiliza el patrón de estrategia. No sabe (ni le importa) qué estrategia adoptó. Nuestro ejemplo a continuación muestra la implementación de una calculadora de impuestos. El propósito de la clase es simplemente calcular los impuestos de un artículo. No debería tener que saber para qué país está calculando impuestos o los diferentes tipos de estrategias que existen para calcular impuestos. Sólo necesita saber que tiene un artículo y necesita calcular el impuesto; ese debería ser su único propósito.

CLASS zcl_tax_calculator DEFINITION PUBLIC CREATE PUBLIC.

    PUBLIC SECTION.

       METHODS constructor IMPORTING io_strategy TYPE REF TO zif_tax_strategy.

       METHODS tax_for_item

          IMPORTING is_item TYPE zty_so_item

          RETURNING VALUE(rv_tax) TYPE decfloat34

          RAISING cx_static_check.

       PRIVATE SECTION.

          DATA mo_strategy TYPE REF TO zif_tax_strategy.

ENDCLASS.

CLASS zcl_tax_calculator IMPLEMENTATION.

    METHOD constructor.

       mo_strategy = io_strategy.

    ENDMETHOD.

    METHOD tax_for_item.

       rv_tax = mo_strategy->compute_tax( is_item = is_item ).

    ENDMETHOD.

ENDCLASS.

Finalmente, conéctelo. Una estrategia se puede determinar mediante el Customizing, indicadores de características o una clase de fábrica. Nuestro ejemplo a continuación muestra la estrategia determinada por una clase de fábrica, donde pasamos el código de país y eso determina qué estrategia fiscal se crea una instancia para usarse dentro de la calculadora de impuestos.

CLASS zcl_tax_strategy_factory DEFINITION PUBLIC CREATE PUBLIC.

    PUBLIC SECTION.

       CLASS-METHODS for_context

          IMPORTING iv_country TYPE land1

          RETURNING VALUE(ro_strategy) TYPE REF TO zif_tax_strategy.

ENDCLASS.

CLASS zcl_tax_strategy_factory IMPLEMENTATION.

    METHOD for_context.

       CASE iv_country.

          WHEN 'US'. ro_strategy = NEW zcl_tax_strategy_us( ).

          WHEN 'DE'

          OR   'FR'

          OR   'ES'. ro_strategy = NEW zcl_tax_strategy_eu( ).

          WHEN OTHERS.

             RAISE EXCEPTION TYPE cx_static_check

             EXPORTING textid = cx_static_check=>default_textid. "handle gracefully

       ENDCASE.

    ENDMETHOD.

ENDCLASS.

A continuación se muestra el uso de esta estrategia con la calculadora de impuestos.

DATA(lo_strategy)   = zcl_tax_strategy_factory=>for_context( iv_country = 'US').

DATA(lo_calculator) = NEW zcl_tax_calculator( lo_strategy ).

DATA(lv_tax)        = lo_calculator->tax_for_item( is_item = ls_item ).

La solución sigue siendo mantenible porque cada nueva introducción de reglas permite a los desarrolladores crear nuevas clases que amplían la clase de fábrica sin afectar las estrategias existentes. Las pruebas unitarias ABAP pueden crear estrategias falsas para la simulación de escenarios, mientras que usted puede probar cada regla de estrategia de forma independiente. El código de dominio se vuelve más legible al incluir un método sencillo llamado Compute_tax en lugar de implementar varias ramas de países y tipos de productos.

Tenga en cuenta lo siguiente cuando utilice patrones de estrategia:

  • La interfaz no debería expandirse demasiado. La interfaz del sistema debe mantener un diseño compacto y solo debe tener uno o más métodos relacionados que utilicen los mismos tipos de dominio. Para abordar diferentes necesidades de entrada, las estrategias reciben una estructura de contexto opcional (zty_tax_context). Siempre debe documentar su uso específico en el campo.
  • Evite el uso de información de configuración dentro de las estrategias en la lógica principal. La recuperación de la configuración debe ocurrir una vez con un constructor o un pequeño objeto de configuración, mientras que la lógica debe ser pura y libre de efectos secundarios. Esto mantiene sencillo el proceso de pruebas unitarias.
  • Utilice referencias de interfaz como enfoque estándar en todos los contextos de programación. La interfaz zif_tax_strategy debería ser el único punto de referencia para las personas que llaman, en lugar de clases concretas.
  • Puede minimizar el impacto en el rendimiento al seleccionar estrategias almacenando en caché la instancia seleccionada en cada contexto o manteniendo un pequeño registro.

Conclusión

El patrón de estrategia existe en todas las aplicaciones ABAP, incluidos cálculos de impuestos, lógica de precios, funciones de redondeo, asignación de números, conversión de moneda, cálculo de descuentos y serialización a través de métodos de codificación de interfaz compartida. Cualquier situación que requiera una declaración CASE para seleccionar un algoritmo debe implementar el patrón de estrategia.

Los patrones de comportamiento establecen reglas de interacción estandarizadas entre objetos. Estos patrones definen cómo los objetos se comunican y trabajan juntos, mientras que los patrones de creación determinan los métodos de creación de objetos y los patrones estructurales determinan los métodos de ensamblaje de objetos. Los desarrolladores ABAP pueden utilizar estos patrones para crear algoritmos aislados y responsabilidades delegadas y cambios en las condiciones de tiempo de ejecución. El patrón de estrategia proporciona una implementación exitosa que permite el cambio de lógica en tiempo de ejecución sin requerir modificaciones en el código de llamada existente. El patrón de observador, junto con el método de plantilla y el patrón de comando, comparten principios de diseño similares porque proporcionan soluciones extensibles para gestionar la lógica compleja de una manera limpia.

¡Aprenda ABAP con los cursos de Rheinwerk!

¿Listo para mejorar tus habilidades ABAP? Explore la gama completa de nuestros cursos en línea centrados en ABAP, desde programación básica hasta RAP avanzado, CDS, AMDP, pruebas unitarias y más. Cada uno está dirigido por un instructor (en vivo y bajo demanda), incluye grabaciones y presentaciones de diapositivas, y está diseñado para brindarle habilidades prácticas que puede aplicar de inmediato en su panorama de SAP. ¡Haga clic en el banner a continuación para comenzar!

Nota del editor: esta publicación ha sido adaptada de secciones de los libros. Programación orientada a objetos con objetos ABAP por Jeffrey Boggess, Colby Hemond, James Maderay José Ruperto. jeffrey es un especialista en integración empresarial en Bowdark Consulting enfocado en crear integraciones perfectas entre SAP, Azure y Dataverse para resolver desafíos comerciales complejos y brindar soluciones confiables para los clientes. colby es consultor técnico senior en Bowdark Consulting, donde se dedica a brindar ideas y soluciones innovadoras a los clientes y apoyarlos en su transformación digital. Jaime es el fundador y director ejecutivo de Bowdark Consulting, Inc., una firma de consultoría especializada en tecnología y desarrollo personalizado en el panorama de SAP. José es arquitecto de datos senior en Bowdark Consulting, Inc. con experiencia en la migración de entornos SAP complejos a plataformas en la nube, lo que permite ecosistemas de datos escalables, seguros y de alto rendimiento.

Esta publicación se publicó originalmente el 6/2026.



Your email address will not be published. Required fields are marked *

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.