[Utu-emt-prog2-info] clase 1 teórico - Principios de la programación modular
Federico Kouyoumdjian
fedekp en autistici.org
Vie Jul 15 18:39:32 CEST 2011
fuente:
http://www.etnassoft.com/biblioteca/introduccion-al-desarrollo-de-software/
2,11 Principios de la programación modular
La lectura del código fuente de un programa implica realizar el
seguimiento del flujo de ejecución de sus instrucciones (el flujo de
control). Evidentemente, una ejecución en el orden secuencial de las
instrucciones no precisa de mucha atención. Pero ya se ha visto que los
programas contienen también instrucciones condicionales o alternativas e
iterativas. Con todo, el seguimiento del flujo de control puede resultar
complejo si el código fuente ocupa más de lo que se puede observar (por
ejemplo, más de una veintena de líneas).
Por ello, resulta conveniente agrupar aquellas partes del código que
realizan una función muy concreta en un subprograma identificado de
forma individual. Es más, esto resulta incluso provechoso cuando se
trata de funciones que se realizan en diversos momentos de la ejecución
de un programa.
En los apartados siguientes, se verá cómo se distribuye en distintos
subprogramas un programa en C. La organización es parecida en otros
lenguajes de programación.
2,12 Funciones
En C, a las agrupaciones de código en las que se divide un determinado
programa se las llama, precisamente, funciones. Más aún, en C, todo el
código debe estar distribuido en funciones y, de hecho, el propio
programa principal es una función: la función principal (main).
Generalmente, una función incluirá en su código, como mucho, la
programación de unos pocos esquemas algorítmicos de procesamiento de
secuencias de datos y algunas ejecuciones condicionales o alternativas.
Es decir, lo necesario para realizar una tarea muy concreta.
2.12.1. Declaración y definición
La declaración de cualquier entidad (variable o función) implica la
manifestación de su existencia al compilador, mientras que definirla
supone describir su contenido. Tal diferenciación ya se ha visto para
las variables, pero sólo se ha insinuado para las funciones.
La declaración consiste exactamente en lo mismo que para las variables:
manifestar su existencia. En este caso, de todas maneras hay que
describir los argumentos que toma y el resultado que devuelve para que
el compilador pueda generar el código, y poderlas emplear.
Declaraciones
La declaración de una función consiste en especificar el tipo de dato
que devuelve, el nombre de la función, la lista de parámetros que recibe
entre paréntesis y un punto y coma que finaliza la declaración:
tipo_de_dato nombre_función( lista_de_parámetros );
Hay que tener presente que no se puede hacer referencia a funciones que
no estén declaradas previamente. Por este motivo, es necesario incluir
los ficheros de cabeceras de las funciones estándar de la biblioteca de
C como stdio.h, por ejemplo. En caso de tener funciones que se invoquen
mutuamente es necesario declararlas a ambas antes de definirlas.
La lista de parámetros es opcional y consiste en una lista de
declaraciones de variables que contendrán los datos tomados como
argumentos de la función. Cada declaración se separa de la siguiente por
medio de una coma. Por ejemplo:
float nota_media( float teo, float prb, float pract );
bool aprueba( float nota, float tolerancia );
Si la función no devuelve ningún valor o no necesita ningún argumento,
se debe indicar mediante el tipo de datos vacío (void):
void avisa( char mensaje[] );
bool si_o_no( void );
int lee_codigo( void );
Definiciones
La definición de una función está encabezada siempre por su declaración,
que ahora debe incluir forzosamente la lista de parámetros si los tiene.
Esta cabecera no debe finalizar con punto y coma, sino que irá seguida
del cuerpo de la función, delimitada entre llaves de apertura y cierre:
tipo_de_dato nombre_función( lista_de_parámetros )
{ /* cuerpo de la función: */
/* 1) declaración de variables locales */
/* 2) instrucciones de la función */
} /* nombre_función */
Llamadas
El mecanismo de uso de una función en el código es el mismo que se ha
empleado para las funciones de la biblioteca estándar de C: basta con
referirse a ellas por su nombre, proporcionarles los argumentos
necesarios para que puedan llevar a cabo la tarea que les corresponda y,
opcionalmente, emplear el dato devuelto dentro de una expresión, que
será, habitualmente, de condición o de asignación.
El procedimiento por el cual el flujo de ejecución de instrucciones pasa
a la primera instrucción de una función se denomina procedimiento de
llamada. Así pues, se hablará de llamadas a funciones
cada vez que se indique el uso de una función en un programa.
A continuación se presenta la secuencia de un procedimiento de llamada:
1.Preparar el entorno de ejecución de la función; es decir, reservar
espacio para el valor de retorno, los parámetros formales (las variables
que se identifican con cada uno de los argumentos que tiene), y las
variables locales.
2.Realizar el paso de parámetros; es decir, copiar los valores
resultantes de evaluar las expresiones en cada uno de los argumentos de
la instrucción de llamada a los parámetros formales.
3.Ejecutar el programa correspondiente.
4.Liberar el espacio ocupado por el entorno local y devolver el posible
valor de retorno antes de regresar al flujo de ejecución de
instrucciones en donde se encontraba la llamada.
El último punto se realiza mediante la instrucción de retorno que, claro
está, es la última instrucción que se ejecutará en una función:
return expresión;
Esta instrucción debe aparecer vacía o no aparecer si la función es de
tipo void; es decir, si se la ha declarado explícitamente para no
devolver ningún dato.
Más información sobre la lista de distribución Utu-emt-prog2-info