Buscador

Sintaxis de un procedimiento Function - II

El Código fuente 100 muestra un sencillo ejemplo de procedimiento Function, en el cual se pide al usuario que introduzca un número que es devuelto como resultado de la función.


Function Calcular() As Integer
Dim MiValor As Integer
Console.WriteLine("Introducir un número de 1 a 100")
MiValor = Console.ReadLine()
Return MiValor
' también podemos utilizar esta
' sintaxis para devolver el valor
' de retorno de la función:
'Calcular = MiValor
End Function
Código fuente 100

En el caso de devolver el valor de retorno de una función utilizando el propio nombre de la función, nos encontramos con el problema de que si en un momento determinado tenemos que cambiar el nombre de la función, también deberemos cambiar todos aquellos puntos de la rutina en donde devolvemos el valor. Por este motivo es recomendable el uso de Return para el devolver el valor de la función, ya que si tenemos que cambiar el nombre de la función, no será necesario modificar los puntos en los que se devuelve el valor de este tipo de procedimiento

Sintaxis de un procedimiento Function - I

El formato para la escritura de un procedimiento Function se muestra en el Código fuente 99.

[Ámbito] Function NombreFunción[(ListaParámetros)] As TipoDato
[CódigoEjecutable]
[Return Valor]
[NombreFunción = Valor]
[Exit Function]
[CódigoEjecutable]
End Function
Código fuente 99
Los elementos que forman parte de este tipo de rutina son los siguientes: 
• Ámbito. Define el modo en que vamos a poder acceder o llamar al procedimiento desde otro punto de la aplicación. El ámbito de los elementos del lenguaje será tratado en un apartado posterior. 
• Function...End Function. Palabras clave que indican el comienzo y final de la función respectivamente. Cuando hagamos una llamada a la función, el compilador ejecutará el código comprendido entre estas dos palabras clave. 
• NombreFunción. Identificador que utilizamos para reconocer y llamar a la función. En este tipo de procedimiento, también utilizamos su nombre para asignar el valor que será devuelto al código llamador en el modo NombreFunción = Valor, en esta última situación, podemos situar esta expresión de devolución en tantos lugares como necesitemos dentro de la función. 
• TipoDato. Tipo de dato del valor devuelto como resultado de la ejecución de la función. 
• ListaParámetros. Lista de identificadores separados por comas, y encerrados entre paréntesis, que representan la información que recibe la función desde el código llamador. Dentro del cuerpo del procedimiento, estos identificadores o parámetros se utilizarán igual que variables. 
• Return. Esta palabra clave permite salir de la ejecución de la función devolviendo al mismo tiempo un valor al código que hizo la llamada. Podemos utilizarla dentro de una función, en tantos lugares como necesitemos.
• Exit Function. Esta palabra clave permite salir de la ejecución de la función sin haber llegado a su fin. Podemos utilizarla dentro de una función, en tantos lugares como necesitemos.

Llamada a un procedimiento Sub

Para realizar una llamada o ejecutar un procedimiento Sub, debemos escribir su nombre en un punto del programa. El Código fuente 98 muestra el código al completo del módulo de nuestra aplicación de consola. La ejecución de este programa comienza como es habitual por Main( ), dentro del cual se realiza una llamada al procedimiento Prueba( ).

Module Module1
Sub Main()
Console.WriteLine("Estamos en el procedimiento Main")
' llamada a un procedimiento
Prueba()
Console.ReadLine()
End Sub
Sub Prueba()
Console.WriteLine("Estamos en el procedimiento Prueba")
End Sub
End Module
Código fuente 98
En la llamada a un procedimiento Sub, el uso de los paréntesis es opcional, independientemente de si pasamos o no parámetros. No obstante, es muy recomendable especificar dichos paréntesis, ya que aportan una gran claridad a nuestro código, de forma que al leerlo podemos ver rápidamente los puntos en los que se realiza una llamada a una rutina de código. Debido a esto, el IDE sitúa automáticamente los paréntesis en el caso de que no los especifiquemos de forma explícita. No es posible situar la llamada a un procedimiento Sub como parte de una expresión, puesto que este tipo de procedimientos, al no devolver un valor, provocaría un error de compilación. Ver Figura 66.
Figura 66. No es posible hacer una llamada a un procedimiento Sub en una expresión.

Sintaxis de un procedimiento Sub

El formato para la escritura de un procedimiento Sub se muestra en el Código fuente 96.

[Ámbito] Sub NombreProcedimiento[(ListaParámetros)]
[CódigoEjecutable]
[Exit Sub | Return]
[CódigoEjecutable]
End Sub
Código fuente 96

Los elementos que forman parte de este tipo de rutina son los siguientes: 
• Ámbito. Define el modo en que vamos a poder acceder o llamar al procedimiento desde otro punto de la aplicación. El ámbito de los elementos del lenguaje será tratado en un apartado posterior. 
• Sub...End Sub. Palabras clave que indican el comienzo y final del procedimiento respectivamente. Cuando hagamos una llamada al procedimiento, el compilador ejecutará el código comprendido entre estas dos palabras clave. 
• NombreProcedimiento. Identificador que utilizamos para reconocer y llamar al procedimiento. 
• ListaParámetros. Lista de identificadores separados por comas, y encerrados entre paréntesis, que representan la información que recibe el procedimiento desde el código llamador. Dentro del cuerpo del procedimiento, estos identificadores o parámetros se utilizarán igual que variables.
• Return. Esta palabra clave permite salir de la ejecución del procedimiento sin haber llegado a su fin. Podemos utilizarla en tantos lugares dentro de un procedimiento como sea necesario. Se recomienda su uso en lugar de Exit Sub, ya que podemos emplear Return para salir de cualquier tipo de procedimiento, con lo cual se unifica la escritura del código. 
• Exit Sub. Al igual que en el punto anterior, esta palabra clave permite salir de la ejecución del procedimiento sin haber llegado a su fin, pudiendo igualmente, situarla en tantos lugares dentro del procedimiento como sea necesario.
El Código fuente 97 muestra el modo más simple de crear un procedimiento. Escriba el lector este procedimiento en la aplicación de consola sobre la que está realizando las pruebas, a continuación de Main( ).

Sub Prueba()
Console.WriteLine("Estamos en el procedimiento Prueba")
End Sub
Código fuente 97

Procedimientos

Todo el código ejecutable de una aplicación se ubica en rutinas de código o procedimientos. Un procedimiento es un elemento del lenguaje compuesto por un conjunto de líneas de código, a las que se denomina cuerpo del procedimiento. 
Su comienzo y fin lo establecemos mediante ciertas palabras reservadas del lenguaje, asociándole un identificador, que nos servirá para reconocerlo entre el resto de procedimientos creados en el programa. Podemos enviarle también información adicional en forma de parámetros, con lo que el resultado de la ejecución de un procedimiento variará según los valores que pasemos en cada llamada. En VB.NET disponemos de los siguientes tipos de procedimientos: 
• Sub. Procedimiento que realiza un conjunto de operaciones pero no devuelve valor al punto de llamada. A lo largo del texto también nos referiremos a las rutinas de tipo Sub con el nombre genérico de procedimiento. 
• Function. Procedimiento que realiza un conjunto de operaciones, y devuelve un valor denominado valor de retorno al punto de código que realizó la llamada. A lo largo del texto también nos referiremos a las rutinas de tipo Function con el nombre genérico de función. 
• Property. Procedimiento que se utiliza para labores de acceso y asignación de valores a las propiedades de un objeto. Serán tratados con más profundidad en los temas dedicados a la programación orientada a objetos.

Escritura de varias sentencias en la misma línea

Aquí tenemos el caso opuesto al anterior apartado. El lenguaje nos permite escribir en una misma línea física, varias sentencias separadas por el carácter de dos puntos ( : ), que en condiciones normales se escriben en líneas separadas. Ver Código fuente 95.

Sub Main()
Dim Valor As Integer, Nombre As String, Resultado As Boolean
' en la siguiente línea hay tres sentencias que
' habitualmente se escriben en líneas separadas
Valor = 50 : Nombre = "Julio" : Resultado = 50 <> 275
Console.WriteLine("Contenido de variables: {0} - {1} - {2}", _
Valor, Nombre, Resultado)
Console.ReadLine()
End Sub
Código fuente 95


Si bien en algunas situaciones puede ser útil, esta característica hace que nuestro código sea más complicado de leer, restándole claridad a nuestra aplicación, por lo que recomendamos no utilizarla salvo en casos muy necesarios.

Procedimientos

División de una línea de código 

Si tenemos en nuestro programa líneas de código muy largas, que nos obliguen a desplazarnos hacia una lateral de la ventana del editor de código para poder leerlas, podemos dividir ese tipo de línea lógica de código en varias líneas físicas, situando el carácter de guión bajo ( _ ) en el punto de la línea de código en donde queremos continuar, teniendo en cuenta que siempre debe haber un espacio en blanco antes y después de este carácter, para que la división de la línea sea efectiva. En el Código fuente 94 podemos ver dos líneas exactamente iguales, la primera se muestra en una sola línea física, mientras que la segunda ha sido fraccionada en tres líneas, aunque a efectos de compilación el resultado es el mismo.

Dim Resultado As Boolean
' una sola línea lógica y física
Resultado = ((30 + 5) * 5 > 100) And (52 > 200 / (2 + 5))
' varias líneas físicas, aunque internamente
' el compilador reconoce una sola línea lógica
Resultado = ((30 + 5) * 5 > 100) And _
(52 > 200 / _
(2 + 5))
Código fuente 94

Uso de paréntesis para alterar la prioridad de operadores

Podemos alterar el orden natural de prioridades entre operadores utilizando los paréntesis, encerrando entre ellos los elementos que queramos sean resueltos en primer lugar dentro de una expresión. De esta forma, se resolverán en primer lugar las operaciones que se encuentren en los paréntesis más interiores, finalizando por las de los paréntesis exteriores. 
Es importante tener en cuenta, que dentro de los paréntesis se seguirá manteniendo la prioridad explicada anteriormente. El Código fuente 93 en condiciones normales, devolvería False como resultado. Sin embargo, gracias al uso de paréntesis, cambiamos la prioridad predeterminada, obteniendo finalmente True.

Dim Resultado As Boolean
Resultado = ((30 + 5) * 5 > 100) And (52 > 200 / (2 + 5)) ' devuelve: True
Código fuente 93

Prioridad entre operadores de distintos grupos.

Cuando una expresión contenga operadores de distintos grupos, estos se resolverán en el orden marcado por la Tabla 18.
El Código fuente 92 muestra un ejemplo de expresión en el que intervienen operadores de diferentes tipos.


Dim Resultado As Boolean
Resultado = 30 + 5 * 5 > 100 And 52 > 10 ' devuelve: False
Código fuente 92

Prioridad de operadores - II

Los operadores de comparación tienen todos la misma prioridad, resolviéndose en el orden de aparición dentro de la expresión. Los operadores lógicos se ajustan a la prioridad indicada en la Tabla 17.
En el ejemplo del Código fuente 91, el resultado final de la operación es True debido a que el operador Not cambia la segunda expresión a True, resultando las dos expresiones de la operación True.

Dim Resultado As Boolean
Resultado = 10 < 70 And Not 30 = 20 ' devuelve: True
Código fuente 91

Prioridad de operadores - I

Dentro de una línea de código que contenga varias operaciones, estas se resolverán en un orden predeterminado conocido como prioridad de operadores. Dicha prioridad se aplica tanto entre los operadores de un mismo grupo como entre los distintos grupos de operadores. 
Prioridad entre operadores del mismo grupo. Los operadores aritméticos se ajustan a la prioridad indicada en la Tabla 16
El operador de mayor prioridad es el de potenciación, los de menor son la suma y resta. En el caso de operadores con idéntica prioridad como multiplicación y división, se resolverán en el orden de aparición, es decir, de izquierda a derecha. Veamos un ejemplo en el Código fuente 90


Dim Resultado As Long
Resultado = 5 + 8 ^ 2 * 4 ' devuelve: 261
Código fuente 90

OrElse

Este operador realiza una disyunción lógica de tipo cortocircuito entre dos expresiones. En este tipo de operación, en cuanto la primera expresión devuelva verdadero como resultado, el resto no será evaluado devolviendo verdadero como resultado final. La muestra los diferentes resultados obtenidos con el uso de este operador en función de los valores que tengan sus expresiones.
El Código fuente 89 muestra algunos ejemplos con este operador.



Dim Resultado As Boolean
Resultado = ("H" = "H") OrElse (720 < 150) ' devuelve: True
Resultado = (8 <> 8) OrElse (62 < 115) ' devuelve: True
Resultado = ("W" > "b") OrElse ("Q" = "R") ' devuelve: False

Código fuente 89

AndAlso

Este operador realiza una conjunción lógica de tipo cortocircuito entre dos expresiones. En este tipo de operación, en cuanto la primera expresión devuelva falso como resultado, el resto no será evaluado devolviendo falso como resultado final. La Tabla 14 muestra los diferentes resultados obtenidos con el uso de este operador en función de los valores que tengan sus expresiones
El Código fuente 88 muestra algunos ejemplos con este operador.


Dim Resultado As Boolean
Resultado = (58 > 20) AndAlso ("H" = "H") ' devuelve: True
Resultado = ("H" = "H") AndAlso (720 < 150) ' devuelve: False

Resultado = (8 <> 8) AndAlso (62 < 115) ' devuelve: False

Código fuente 88