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:
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:
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/