miércoles, enero 18, 2006

SUBRUTINAS Y FUNCIONES

  • Clase .NET

  • 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 key to end the program")
    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 key to end the program")
    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 key to end the program")
    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 to end the program")
    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 to end the program")
    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