Programación modularizada: Function Modules Vs. ABAP Objects
Entienda conceptualmente cuál es el instrumento más adecuado para implementar programación modular en ABAP, comprendiendo las similitudes y diferencias entre las opciones que ABAP ofrece y el proceso de la evolución desde Function Groups/Modules hacia ABAP Objects
La programación orientada a objetos (POO) es una filosofía de diseño y desarrollo de software donde el modelo informático busca reflejar los objetos del mundo real. Valiéndose de un lenguaje y entorno que respete los principios de la teoría de objetos, la POO permite a los programadores representar cada entidad del problema a través de la definición de un objeto acorde. Objetos típicos del entorno de negocios son "Clientes", "Materiales", "Ordenes de compra", etc. La teoría de objetos se estructura alrededor de una larga lista de propiedades y paradigmas conceptuales (que exceden el alcance de este tip), materializados luego en los distintos entornos de programación. El instrumento que disponemos en ABAP para trabajar de acuerdo a este paradigma son los "ABAP Objects".
Existe numerosas ventajas asociadas a la programación orientada objetos que no tratamos en este artículo, pero que incluyen el encapsulamiento de la complejidad, la reusabilidad del código, la modularidad, entre otros.
Sin embargo, el ABAP "tradicional" o "procedural", también permite abordar la programación respetando estos conceptos. El uso de Function Modules y Function Groups ofrece al programador muchas posibilidades en este sentido, y esto puede generar confusión a la hora de evaluar las ventajas de una solución OO.
Se hace necesario entonces comprender conceptualmente las diferencias entre los recursos de programación modularizada del ABAP tradicional, versus el uso de ABAP Objects.
La programación ABAP tradicional (“procedural”)
En la programación ABAP “tradicional” todos los programas generalmente están conformados por algunos tipos de bloques de procesamiento que permiten modularizar el código fuente, ubicando sentencias ABAP en módulos de función, subrutinas, macros, programas de tipo "include", etc. A estos bloques de procesamiento que se invocan desde programas ABAP se los llama procedimientos, en general, y a esta técnica de modularización, procedural.
Es sabido que la modularización permite que los programas sean más fáciles de leer y mantener, eliminando redundancia e incrementando la reusabilidad del código.
En la programación ABAP modularizada, se pueden definir Function modules (Módulos de Función) que pueden ser invocados desde todos los programas ABAP.
Estos módulos de función permiten encapsular y reusar funciones globales en el sistema SAP y son manejados en una biblioteca central de funciones.
Además, el sistema SAP contiene varios módulos de función predefinidos que también pueden ser llamados por cualquier programa ABAP desarrollado por el usuario.
Siempre que se define un módulo de función (Function Module) es necesario crear primero un Grupo de Funciones (Function Group) que lo pueda contener. Una buena práctica consiste en agrupar funciones relacionadas por algún tópico.
Por medio del Function Builder (Transacción SE37) en el ABAP Workbench se podrá crear tanto el Function Group como el Function Module. El Function Group no es ejecutable, pero cuando se invoca a un módulo de función, el sistema carga en la sesión interna del programa “llamador”, el grupo de funciones completo que contiene a la Function Module invocada.
Todos los módulos de función que están en un grupo de funciones en particular, pueden acceder a datos globales del grupo. Por esta razón, se pueden ubicar todos los "Function Modules" que usan los mismos datos en un grupo de funciones (Function Group) único. Es decir, si se cuenta con un conjunto de módulos de función donde todos usan la misma tabla interna, éstos pueden ubicarse en un Function Group que contenga la definición de la tabla con la que tratan, en sus datos globales.
El Function Group puede ser considerado un precursor de ABAP Objects.
La programación ABAP con ABAP Objects
Por otro lado, la programación con ABAP Objects, sigue el paradigma de la Programación Orientada a Objetos (Oriented Object Programming - OOP), permitiendo que se definan datos y funciones en clases en vez de en un grupo de funciones (Function Groups).
Las clases son declaraciones de objetos, también se podrían definir como abstracciones de objetos. Esto quiere decir que la definición de un objeto es la clase.
Los objetos son "ejemplares" de una clase cualquiera. Cuando se crea un "ejemplar" se tiene que especificar la clase a partir de la cual se creará. Esta acción de crear un objeto a partir de una clase se llama instanciar, por eso se conocen a los objetos como instancias de una clase.
Las propiedades o atributos son las características de los objetos. Estos atributos están definidos por las componentes de la clase que describe el estado (los datos).
Las funcionalidades asociadas a los objetos se definen a través de los métodos, que de esa forma determinan el comportamiento de los objetos.
Las clases en ABAP Objects pueden ser declaradas globalmente o localmente. Así como existe una manera de definir un Function Group o un Function Module desde el ABAP Workbench para ser usados en la programación ABAP tradicional, también es posible definir las clases globales y las interfaces en el ABAP Workbench mediante el Class Builder (Transaction SE24). Estas clases son almacenadas centralmente en pools de clases en la biblioteca de clases dentro del repositorio de SAP.
Todos los programas ABAP en un sistema SAP pueden acceder a las clases globales. Las clases locales son las que se definen dentro de un programa ABAP. De esta manera, las interfaces y las clases locales pueden ser usadas solamente en el programa en donde están definidas. Cuando se usa una clase en un programa ABAP, el sistema primero busca una clase local con el nombre especificado. Si no se encuentra ninguna, busca una clase global. Salvo lo especificado previamente, no existe diferencia entre usar una clase global o una local.
Similitudes y diferencias entre un "Function group" y una “Clase"
Anteriormente, en este artículo se mencionó el uso de Function Groups y sus Function Modules en la programación modularizada ABAP “tradicional”.
Por otro lado, se ha señalado que en la programación ABAP Objects, se utilizan las clases que definen objetos los cuales tienen atributos y métodos.
¿Qué características tiene en común el uso de los Functions Groups utilizados normalmente en la programación ABAP "tradicional" (procedural) y qué incorporaciones ofrece el uso de las Clases al adoptar el paradigma OOP utilizando ABAP Objects?
El "Function Group" que se usa en la programación procedural, puede ser considerado lo más cercano al concepto de Programación Orientada a Objetos "Oriented Object Programming" (OOP). Por lo tanto, conocer algunas similitudes y diferencias entre un "Function group" manejado en la programación ABAP procedural y una "Clase" de la Programación Orientada a Objetos, manejada en la programación con ABAP Objects, ofrece una manera de aproximarse al conocimiento de la OOP.
En qué coinciden...
|
En qué difieren ...
|
Ambos ofrecen instrumentos técnicos que posibilitan la modularización y reutilización de código. |
ABAP Objects permite la modularización cumplimentando formalmente el paradigma de Programación Orientado a Objetos (POO)
|
Como la Clase, un Function Group tiene atributos (variables globales) y métodos (los Function Modules) | En un Function Group las Variables (atributos) son siempre privados y los Function Modules son siempre públicos. |
Los atributos de un Function Group pueden solamente ser accedidos por medio de los Function Modules. Es decir que la información declarada en un Function Module es global a sus métodos, pero no es accesible por los Function Modules de otros Function Groups. Similarmente, en una Clase, sus atributos privados pueden solamente ser accedidos a través de sus métodos, lo que asegura la consistencia de datos. | Cuando se invoca desde un programa ABAP un Function Module, se crea una instancia del Function Group. En ese momento los atributos del Function Group son cargados en la sesión interna de memoria. Si se invoca a otro Function Module del mismo Function Group, o se invoca nuevamente al mismo Function Module, no se crea ninguna instancia nueva del Function Group. Por lo tanto se cuenta con sólo una instancia del Function Group. Es decir que un programa ABAP puede trabajar con varias instancias de una misma clase (objetos), pero no puede trabajar con varias instancias de un mismo Function Group. |
Las clases NO pueden contener “Screens”, los Functions Modules SI. |
Cuando se invoca un modulo de función (CALL FUNCTION ), una instancia de su grupo de función se carga en el área de memoria de la sesión interna. Si un programa ABAP llama a módulos de función de distintos grupos de funciones, se cargará en memoria más de una instancia.
La diferencia principal entre el paradigma de la programación orientada a objetos y el uso de los módulos de función en la programación procedural, es que en este último caso, un programa ABAP puede trabajar con instancias de distintos grupos de función simultáneamente, pero NO con varias instancias de un mismo grupo de función.
Como se mencionara en párrafos anteriores, ABAP Objects permite definir datos y funciones en Clases en vez del uso de Grupo de Funciones. Un programa ABAP, cuando usa clases puede trabajar con cualquier número de instancias (objetos) que están basados en el mismo "template".
En vez de cargar una única instancia de un grupo de función en memoria de manera explícita cuando se llama a un módulo de función, el programa ABAP puede (usando la sentencia especial CREATE OBJECT) generar varias intancias de una misma clase. Estas instancias individuales representan objetos únicos.
La siguiente figura grafica lo expresado anteriormente estableciendo la diferencia relacionada con "instancias" al manejar clases en ABAP Objects.
Consideraciones finales
Debido a las limitaciones que tienen los "Function Groups", es razonable que sean frecuentemente usados como técnicas de modularización en la programación ABAP y no como una técnica de orientación a Objetos.
Los "Function Groups" no ofrecen otras posiblidades de comparación con otros conceptos más generales de la OOP.
Por lo visto anteriormente, para resumir, podemos establecer una diferencia en cuanto al uso de técnicas de modularizaciön:
- Los Function groups y sus modulos de función, usados en la programación ABAP procedural.
- Las clases y métodos utilizados en la programación con ABAP Objects abordando los conceptos de la OOP.
Copyright 2012 - Teknoda S.A.
IMPORTANTE: “Notas técnicas de SAP ABAP" se envía con frecuencia variable y sin cargo como servicio a nuestros clientes SAP. Contiene notas/tutoriales/artículos técnicos desarrollados en forma totalmente objetiva e independiente. Teknoda es una organización de servicios de tecnología informática y NO comercializa hardware, software ni otros productos. |