Modularizacin es el proceso consistente en dividir un programa muy grande en una serie de mdulos mucho ms pequeos y manejables. A estos mdulos se les suele denominar de distintas formas (subprogramas, subrutinas, procedimientos, funciones, etc.) segn los distintos lenguajes. !a divisin de un programa en unidades ms pequeas o funciones presenta las siguientes ventajas" #. Modularizacin. $ada funcin tiene una misin muy concreta, de modo que nunca tiene un nmero de l%neas e&cesivo y siempre se mantiene dentro de un tamao manejable. Adems, una misma funcin (por ejemplo, un producto de matrices, una resolucin de un sistema de ecuaciones lineales, etc.) puede ser llamada muchas veces en un mismo programa, e incluso puede ser reutili'ada por otros programas. $ada funcin puede ser desarrollada y comprobada por separado. (. Ahorro de memoria y tiempo de desarrollo. )n la medida en que una misma funcin es utili'ada muchas veces, el nmero total de l%neas de cdigo del programa disminuye, y tambi*n lo hace la probabilidad de introducir errores en el programa. +. Independencia de datos y ocultamiento de informacin. ,na de las fuentes ms comunes de errores en los programas son los efectos colaterales que se pueden producir entre distintas partes del programa. )s muy frecuente que al hacer una modificacin para aadir una funcionalidad o corregir un error, se introdu'can nuevos errores en partes del programa que antes funcionaban correctamente. ,na funcin es capa' de mantener una gran independencia con el resto del programa, manteniendo sus propios datos y definiendo muy claramente la interfaz o comunicacin con la funcin que la ha llamado y con las funciones a las que llama, y no teniendo ninguna posibilidad de acceso a la informacin que no le compete. Funciones y procei!ientos Sub en "isual #asic )n Visual Basic se distingue entre funciones y procedimientos Sub. )n ocasiones se utili'a la palabra gen*rica procedimiento para ambos. !a fundamental diferencia entre un procedimiento Sub y una funcin es que *sta ltima puede ser utili'ada en una e&presin porque tiene un valor de retorno. )l valor de retorno ocupa el lugar de la llamada a la funcin donde esta aparece. -or ejemplo, si en una e&presin aparece sin(x) se calcula el seno de la variable x y el resultado es el valor de retorno que sustituye a sin(x) en la e&presin en la que aparec%a. -or tanto, las funciones devuelven valores, a diferencia de los procedimientos que no devuelven ningn valor, y por tanto no pueden ser utili'adas en e&presiones. ,n procedimiento Sub es un segmento de cdigo independiente del resto, que una ve' llamado por el programa, ejecuta un nmero determinado de instrucciones, sin necesidad de devolver ningn valor al mismo (puede dar resultados modificando los argumentos), mientras que una funcin siempre tendr un valor de retorno. !os nombres de los procedimientos tienen reglas de visibilidad parecidas a las de las variables. -ara llamar desde un formulario a un procedimiento ublic definido en otro formulario es necesario preceder su nombre por el del formulario en que est definido. .in embargo, si se desea llamar a un procedimiento definido en un mdulo estndar (!"bas) no es necesario precederlo del nombre del mdulo ms que si hay coincidencia de nombre con otro procedimiento de otro mdulo estndar. Funciones $function% !a sinta&is correspondiente a una funcin es la siguiente" /Static0 /Pri&ate0 Function nombre (/parmetros0) /'s tipo0 /sentencias0 /nombre 1 e&presion0 /E(it Function0 /sentencias0 /nombre 1 e&presion0 En Function
donde nombre es el nombre de la funcin. .er de un tipo u otro dependiendo del dato que devuelva. -ara especificar el tipo se utili'a la clusula As #ipo (Inte$er, %on$, Sin$le, &ouble, 'urrency, Strin$ o Variant). par(metros son los argumentos que son pasados cuando se llama a la funcin. Visual Basic asigna el valor de cada argumento en la llamada al parmetro que ocupa su misma posicin. .i no se indica un tipo determinado los argumentos son Variant por defecto. $omo se ver en un apartado posterior, los argumentos pueden ser pasados por referencia o por valor. )l nombre de la funcin, que es el valor de retorno, acta como una variable dentro del cuerpo de la funcin. )l valor de la variable expresion es almacenado en el propio nombre de la funcin. .i no se efecta esta asignacin, el resultado devuelto ser 2 si la funcin es num*rica, nulo (33) si la funcin es de caracteres, o Empty si la funcin es Variant. )xit *unction permite salir de una funcin antes de que *sta finalice y devolver as% el control del programa a la sentencia inmediatamente a continuacin de la que efectu la llamada a la funcin. !a sentencia )nd *unction marca el final del cdigo de la funcin y, al igual que la )xit *unction, devuelve el control del programa a la sentencia siguiente a la que efectu la llamada, pero lgicamente una ve' finali'ada la funcin. !a llamada a una funcin se hace de diversas formas. -or ejemplo, una de las ms usuales es la siguiente" variable 1 nombre(/argumentos0) donde ar$umentos son un lista de constantes, variables o e&presiones separadas por comas que son pasadas a la funcin. )n principio, el nmero de argumentos debe ser igual al nmero de parmetros de la funcin. !os tipos de los argumentos deben coincidir con los tipos de sus correspondientes parmetros, de lo contrario puede haber fallos importantes en la ejecucin del programa. )sta regla no rige si los argumentos se pasan por valor (concepto que se ver ms adelante). )n cada llamada a una funcin hay que incluir los par*ntesis, aunque *sta no tenga argumentos. )l siguiente ejemplo corresponde a una funcin que devuelve como resultado la ra%' cuadrada de un nmero +" Function 4ai' (5 As 6ouble) As 6ouble 7f 5 8 2 9hen )&it :unction )lse 4ai' 1 .qr(5) En Function !a llamada a esta funcin se hace de la forma siguiente" $uadrada 1 4ai'(5um) A diferencia de $ y $;; en Visual Basic no es necesario devolver e&pl%citamente el valor de retorno, pues el nombre de la funcin ya contiene el valor que se desea devolver. 9ampoco es necesario declarar las funciones antes de llamarlas. Procei!ientos Sub !a sinta&is que define un procedimiento Sub es la siguiente" /Static0 /Pri&ate0 Sub nombre /(parmetros)0 /sentencias0 /E(it Sub0 /sentencias0 En Sub !a e&plicacin es anloga a la dada para funciones. !a llamada a un procedimiento Sub puede ser de alguna de las dos formas siguientes" Call nombre/(argumentos)0 o bien, sin pasar los argumentos entre par*ntesis, sino poni*ndolos a continuacin del nombre simplemente separados por comas" nombre /argumentos0 A diferencia de una funcin, un procedimiento Sub no puede ser utili'ado en una e&presin pues no devuelve ningn valor. -or supuesto una funcin puede ser llamada al modo de un procedimiento Sub, pero en este caso no se hace nada con el valor devuelto por la funcin. )l siguiente ejemplo corresponde a un procedimiento Sub que devuelve una variable F que es la ra%' cuadrada de un nmero N. Sub 4ai' (5 As 6ouble, : As 6ouble) 7f 5 8 2 9hen E(it Sub <.e mandar%a un mensaje de error )lse : 1 .qr(5) )nd 7f En Sub !a llamada a este procedimiento Sub puede ser de cualquiera de las dos formas siguientes" 4ai' 5, : $all 4ai'(5, :) )n el ejemplo anterior, el resultado obtenido al e&traer la ra%' cuadrada al nmero N se devuelve en la variable F pasada como argumento, debido a que como se ha mencionado anteriormente, un procedimiento Sub no puede ser utili'ado en una e&presin. 'rgu!entos por referencia y por &alor )n las funciones (*unction) y en los procedimientos Sub de Visual Basic, por defecto los argumentos se pasan por referencia= de este modo, cualquier cambio de valor que sufra un parmetro dentro de la funcin o del procedimiento Sub tambi*n se produce en el argumento correspondiente de la llamada a la funcin o al procedimiento Sub. $uando se llama a una funcin o a un procedimiento Sub, se podr especificar que el valor de un argumento no sea cambiado por la funcin o por el procedimiento, poniendo dicho argumento entre par*ntesis en la llamada. ,n argumento entre par*ntesis en la llamada es un ar$umento pasado por valor. -or ejemplo, 4ai' ((5um)) < )n el caso de la funcin 4ai' (5um), : < )n el caso del procedimiento )l argumento +um es pasado por valor. .ignifica que lo que se pasa es una copia de +um. .i el procedimiento cambia ese valor, el cambio afecta slo a la copia y no a la propia variable +um. >tra forma de especificar que un argumento ser siempre pasado por valor es anteponiendo la palabra ByVal a la declaracin del parmetro en la cabecera del procedimiento (Sub o *unction). -or ejemplo" :unction 4ai' (#y"al 5 As 6ouble) .ub 4ai' (#y"al 5 As 6ouble, : As 6ouble) -asar argumentos por valor evita modificaciones accidentales, pero tiene un coste en tiempo y memoria que puede ser significativo cuando se pasan grandes volmenes de informacin, como sucede con vectores, matrices y estructuras. Procei!ientos recursi&os .e dice que una funcin (*unction) es recursiva o que un procedimiento Sub es recursivo si se llaman a s% mismos. A continuacin se presenta un ejemplo de una funcin que calcula el factorial de un nmero programada de forma recursiva. :unction :actorial (5 As 7nteger) As !ong 7f 5 1 2 9hen :actorial 1 # <$ondicin de final )lse :actorial 1 5 ? :actorial (5 @ #) )nd 7f )nd :unction )n este ejemplo, si la variable 5 que se le pasa a la funcin vale 2, significar que se ha llegado al final del proceso, y por tanto se le asi$na el valor # al valor del factorial (recordar que 2A 1 #). .i es distinto de 2, la funcin se llama a ella misma, pero variando el argumento a (5@#), hasta llegar al punto en el que 5@#12, finali'ndose el proceso. ( -asar un argumento por referencia implica que en realidad se pasa a la funcin la variable original, de modo que la funcin puede modificar su valor. -asar por valor implica crear una nueva variable dentro de la funcin y pasarle una copia del valor de la variable e&terna. .i se modifica el valor de la variable copia, la variable original queda inalterada. $uando en la llamada a una funcin se ponen como argumentos constantes num*ricas o e&presiones los valores se pasan por valor. Procei!ientos con argu!entos opcionales -uede haber procedimientos en los que algunos de los argumentos incluidos en su definicin sean opcionales, de forma que el programador pueda o no incluirlos en la llamada de dichos procedimientos. !a forma de incluir un argumento opcional es incluir la palabra ,ptional antes de dicho argumento en la definicin del procedimiento. .i un argumento es opcional, todos los argumentos que vienen a continuacin deben tambi*n ser opcionales. $uando un argumento es opcional y en la llamada es omitido, el valor que se le pasa es un Variant con valor Empty. A los argumentos opcionales se les puede dar en la definicin del procedimiento un valor por defecto para el caso en que sean omitidos en la llamada, como por ejemplo" -rivate .ub mi-roc(& as 6ouble, Optional n1+ As 7nteger) sentencias )nd .ub N)!ero ineter!inao e argu!entos )ste caso es similar pero diferente del anterior. )n este caso no es que haya argumentos opcionales que puedan omitirse en la llamada, sino que realmente no se sabe con cuntos argumentos va a llamarse la funcin= unas veces se llamar con (, otras con + y otras con B. )n este caso los argumentos se pasan al procedimiento por medio de un array, especificndolo con la palabra aramArray en la definicin del procedimiento, como por ejemplo" -ublic :unction ma&imo(Para!'rray numeros()) :or )ach & in numeros sentencias ma&imo 1 & 5e&t & )nd :unction Utili*aci+n e argu!entos con no!bre Visual Basic ofrece tambi*n la posibilidad de llamar a las funciones y procedimientos Sub de una forma ms libre y menos formal, pasando los argumentos en la llamada al procedimiento con un orden arbitrario. )sto se consigue incluyendo el nombre de los argumentos en la llamada y asignndoles un valor por medio de una construccin del tipo miAr$umento-.unValor. ,nos argumentos se separan de otros por medio de comas (,). $onsid*rese el siguiente ejemplo" -ublic .ub )nviar$arta(ireccion As .tring, estinatario As .tring) sentencias )nd .ub que se puede llamar en la forma" )nviar$arta estinatario,-3!ic. Cenite'3, ireccion,-3D*&ico, 6:3 5o todas las funciones que se pueden llamar en Visual Basic admiten argumentos con nombre.