SUBRUTINAS Y FUNCIONES
SUBRUTINAS Y FUNCIONES
Todos los programas que has escrito hasta ahora, tienen el mismo patrón: Tienes un modulo (Module1) creado por default, y este modulo tiene un Sub Main, en el cual reside tu código. Cuando tu programa llega al final del Sub, el programa termina.
El partir un programa en secciones le llamamos Procedimiento. Cada procedimiento trabaja como un programa independiente, aceptando entradas y produciendo salidas.
Introducción a la programación estructurada.
Como ya se ha visto un programa consiste en una secuencia de enunciados que la computadora ejecuta. Existe un punto inicial (el primer enunciado a ser ejecutado) y un punto final (el ultimo enunciado a ejecutarse). Hemos visto que hay enunciados que te permiten el control de que enunciado ha de ser ejecutado (enunciados condicionales If y Select Case) y enunciados que te permiten repetir enunciado un determinado numero de veces (Loop, For y Do). Estos enunciados están, en efecto, controlando del flujo de ejecución del programa, determinando que enunciado será ejecutado dependiendo de un criterio especifico proveído.
Habrá ocasiones en que el programa deberá ser partido en pequeñas unidades, llamados procedimientos, los cuales ejecutan una determinada tarea. Las razones para partir un programa es porque el programa puede convertirse muy grande para entenderse y, lo mas importante, puede haber partes del programa que hagan lo mismo (o una tarea muy similar) una y otra ves. Si tienes un procedimiento que permite ejecutar una tarea específica, puedes llamar a este procedimiento cada ves que sea necesario.
Module Module1
Sub Main()
Dim vals() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Console.Out.WriteLine("Enter the start index an press
Dim index As Integer
index = CInt(Console.In.ReadLine())
If index < 0 Or 9 <= index Then
Console.Out.WriteLine("Invalid index, must be between 0 and 9")
Console.WriteLine("Press the
Console.In.ReadLine()
End
End If
Dim i As Integer, total As Integer
For i = index To 9
total = total + vals(i)
Console.Out.WriteLine("The total value is {0} at i = {1}", total, i)
Next
Console.Out.WriteLine("The Final total value is {0}", total)
Console.Out.WriteLine("Press the
Console.In.ReadLine()
End Sub
End Module
Este es un ejemplo usado para ilustrar un For Loop. Las lineas en negro nos muestran que son idénticas; hacen lo mismo. Tienes que teclear el mismo código dos veces.
Nota: Es actualmente uno de los errores mas usuales en programas reales. La tecnica de duplicar porciones de código en diferentes lugares en el programa (con algunas diferencias) es conocido como la tecnica Copy-Paste. El error mas común relacionado al copy-paste es que modifican el código en algunos lugares y olvidan cambiarlo en otros.
Hay una mejor manera de resolver este asunto: Definir un procedimiento que ejecute la tarea que necesitas repetir, y llamar a este procedimiento desde el programa principal en cualquier momento que se requiera. Consideremos este programa:
Module Module1
Sub Main()
Dim vals() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Console.Out.WriteLine("Enter the start index an press
Dim index As Integer
index = CInt(Console.In.ReadLine())
If index < 0 Or 9 <= index Then
Console.Out.WriteLine("Invalid index, must be between 0 and 9")
WaitForEnter()
End
End If
Dim i As Integer, total As Integer
For i = index To 9
total = total + vals(i)
Console.Out.WriteLine("The total value is {0} at i = {1}", total, i)
Next
Console.Out.WriteLine("The Final total value is {0}", total)
WaitForEnter()
End Sub
Sub WaitForEnter()
Console.Out.WriteLine("Press the
Console.In.ReadLine()
End Sub
End Module
En este este ejemplo hemos movido el codigo repetido a un procedimiento (llamdo WaitForEnter), y en el programa principal lo reemplazamos el codigo llamando al procedimiento.
El sub no es mas que un pequeño programa en si mismo. Puedes darle cualquier nombre que quieras. Es muy comun darle un nombre con significado relacionado a lo que hace, para que puedas recordar facilmente después que tarea hace la subrutina. La subrutina es muy similar al Sub Main, con la excepción de que tiene el nombre diferente. Usa la palabra Sub seguida de un nombre y un par de paréntesis que nos marcan el punto de inicio y las palabras End Sub que nos indican el final de la subrutina.
El cuerpo de la subrutina debe de estar entre la Declaracion SUB y el END SUB. Este codigo va a ser ejecutado cuando la subrutina sea llamada.
Subrutina
Habra algunas ocaciones que quieras que la subrutina haga lo mismo pero con algunas diferencias. Esto es posible a traves del uso de subrutinas con argumentos. Un argumento es una variable que es declarada en la linea de la subrutina. La palabra ByVal frente al nombre de la variable nos indica como el valor es enviado.
Argumentos multiples y ByVal versus ByRef
La palabra ByVal (By Value) le indica al compilador de una forma precisa como manejar los valores enviados a traves de la subrutina. La alternativa es ByRef (By Referente). Como lo indica o sigiere el nombre (ByVal), el compilador envia el valor de la variable. Esto es, hara una copia de la variable, y lo pasara la copia a la subrutina. La subrutina puede cambiar el valor, pero cuando la subrutina termine, el valor de la variable original no va a cambiar.
Es muy importante entender el comportamiento correctamente porque podria tener resultados nada placenteros. Es recomendable usar tanto como sea posible el metodo ByVal para pasar los valores; Usar ByRef solo cuando la subrutina necesita modificar los valores.
Funciones
Ya se ha visto que en VB hay funciones para convertir valores de diferentes tipos. Hemos usado estas funciones en algunos ejemplos. Una funcion es una subrutina que nos regresa un valor. La sintaxis es un poco diferente pero funcionhabilidad es idéntica. La diferencia es que regresa un valor.
Module Module1
Sub Main()
Console.Out.WriteLine("enter a value for i and press
Dim i As Integer
i = CInt(Console.In.ReadLine())
Console.Out.WriteLine("Enter a value for j and press
Dim j As Integer
j = CInt(Console.In.ReadLine())
Dim sum As Integer
sum = Add(i, j)
WaitForEnter("The value of i + j is " & CStr(sum))
End Sub
Function Add(ByVal i As Integer, ByVal j As Integer) As Integer
'Add i to j and return the result
Return j + i
End Function
Sub WaitForEnter(ByVal message As String)
Console.Out.WriteLine(message)
Console.Out.WriteLine("Press
Console.In.ReadLine()
End Sub
End Module
Module Module1
Sub Main()
Console.Out.WriteLine("enter a value for i and press
Dim i As Integer
i = CInt(Console.In.ReadLine())
Console.Out.WriteLine("Enter a value for j and press
Dim j As Integer
j = CInt(Console.In.ReadLine())
Dim sum As Integer
sum = Add(i, j)
WaitForEnter("The value of i + j is " & CStr(sum))
End Sub
Function Add(ByVal i As Integer, ByVal j As Integer) As Integer
Dim sum As Integer
Sum = i + j
‘if sum es negative return 0
iF sum < 0 Then
Return 0
End If
‘Otherwise return the sum
Return sum
End Function
Sub WaitForEnter(ByVal message As String)
Console.Out.WriteLine(message)
Console.Out.WriteLine("Press
Console.In.ReadLine()
End Sub
End Module
Esta es una version de VB mas vieja que nos regresan un valor de una function. Vemos la notacion difícil de leer, y menos intuitiva, no es recomendable.
Function Add(ByVal i As Integer, ByVal j As Integer) As Integer
Dim sum As Integer
Sum = i + j
‘if sum es negative return 0
If sum < 0 Then
Add =0
Exit Function
End If
‘Otherwise return the sum
Add = sum
End Function
Bibliografia:
Visual Basic .NET By example p 166-178