[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