domingo, 17 de marzo de 2024

OpenEdge ABL: creando funciones y procedimientos

Crear nuestras propias funciones o procedimientos nos sirve para la reducción de código y hacer el código más legible. Pero antes de comenzar, debemos hacer una diferencia: las funciones nos devolverán valores y los procedimientos no.

Ejemplo. Se requiere crear una función que convierta grados Celsius a grados Fahrenheit. Fórmula:

F = (9/5 * Celsius) + 32

fahrenheit.p

def var celsius as dec no-undo initial 33.9.

/* Función para realizar la conversión de Celsius a Fahrenheit */
function getFahrenheit dec(valor as dec):
    return (9.0 / 5.0) * valor + 32.0.
end.

display "Celsius: " celsius " , Fahrenheit: " getFahrenheit(celsius).

Nota: Para probar este código puedes entrar a este sitio: https://abldojo.services.progress.com/

Para que el programa funcione, se debe crear primero la función. Recordemos que muchos lenguajes de pogramación hacen una evaluación Top-down. Si invocas una función en el bloque de arriba sin antes definir una función, causará error.

También podríamos agregar otra función que obtenga lo grados Celsius:

/* Función para obtener grados Celsius */
function getCelsius dec (valor as dec):
    return (valor - 32.0) / (1.8).
end function.

También podríamos escribir la misma función pero de esta manera:

FUNCTION getCelsius RETURNS DECIMAL (
    INPUT valor AS DECIMAL
):
    DEFINE VARIABLE celsius AS DECIMAL.
    
    ASSIGN
        celsius = (valor - 32.0) * (5.0 / 9.0).
        
    RETURN celsius.
END FUNCTION.

Código completo:

def var celsius as dec no-undo initial 33.9.

/* Función para realizar la conversión de Celsius a Fahrenheit */
function getFahrenheit dec(valor as dec):
    return (9.0 / 5.0) * valor + 32.0.
end.

FUNCTION getCelsius RETURNS DECIMAL (
    INPUT valor AS DECIMAL
):
    DEFINE VARIABLE celsius AS DECIMAL.
    
    ASSIGN
        celsius = (valor - 32.0) * (5.0 / 9.0).
        
    RETURN celsius.
END FUNCTION.

display "Celsius: " celsius " , Fahrenheit: " getFahrenheit(celsius).
display "Celsius: " getCelsius(getFahrenheit(celsius)).

Como se pude ver usamos ``ASSIGN`` para asignar valores. En este caso asignamos el resultado de la conversión a la variable ``celsius``. El resultado será:

   celsius
          ----------
Celsius:       33.90  , Fahrenheit:       93.02 Celsius:       33.90

Para realizar la conversión de grados Fahrenheit a Celsius usamos ésta fórmula:

Celsius = (valor - 32.0) * (5.0 / 9.0).

Ejemplo 2. Crear un procedimiento que solo imprima un simple "Hola, mundo".

PROCEDURE imprimirHolaMundo():
    MESSAGE "Hola, mundo" VIEW-AS ALERT-BOX.
END PROCEDURE.

Para invocarlo:

RUN imprimirHolaMundo.

Ejemplo 3. Crear una función que no necesite parámetros de entrada.

FUNCTION getSaludo RETURNS CHARACTER:
    RETURN "Hola, programador de OpenEdge".
END FUNCTION.

DISPLAY getSaludo().

Ejemplo 4. Crear una función que calcule el factorial de un número

FUNCTION calcularFactorial RETURNS DECIMAL (
    INPUT numero AS DECIMAL
):
    DEFINE VARIABLE resultado AS DECIMAL INIT 1.
    DEFINE VARIABLE contador AS DECIMAL.
    
    DO contador = 1 TO numero:
        resultado = resultado * contador.
    END.
    
    RETURN resultado.
END FUNCTION.

DISPLAY calcularFactorial(5).

En este caso el resultado será: 120.00

Podríamos modificar la función usando la técnica de recursión:

FUNCTION calcularFactorial RETURNS DECIMAL (
    INPUT numero AS DECIMAL
):
    IF numero = 0 THEN
       RETURN 1.
    ELSE
       RETURN numero * calcularFactorial(numero - 1).
END FUNCTION.

DISPLAY calcularFactorial(5).

Ambas funciones resuelven el mismo problema. Como se ha visto en los primeros ejemplos: OpenEdge nos permite algunas cosas como omitir colocar la palabra ``INPUT`` o no colocar la palabra ``FUNCTION`` al final de una función.

Más ejemplos en próximas entregas.

Enlaces:

https://www.progresstalk.com/
https://abldojo.services.progress.com/

No hay comentarios:

Publicar un comentario