Está en la página 1de 38

Universidad Nacional de Jujuy

Facultad de ingeniería
Introducción a la informática

Clase 08
Modularización

Samuel Franco – José Zapana


Contenido
• Crisis del Software
• Modularización: concepto y justificación
• Diseño Top-Down
• Comunicación entre módulos
• Alcance de variables
• Efectos laterales
• Procedimientos y Funciones
Desarrollo del Software
Crisis del Software
• Término utilizado en 1968, en la primera
conferencia organizada por la OTAN sobre
desarrollo de software,

• Refiere a la dificultad de escribir


programas libres de defectos (bugs),
fácilmente comprensibles y que sean
verificables (fines de la década del 60)
Crisis del Software
• Causas:
– Complejidad de la forma de programar
– Cambios a los que se ven afectados los programas
– Ausencia de herramientas para estimar el esfuerzo

• Sucesos que se observan


– Los proyectos no terminan en plazo
– Los presupuestos no se ajustan al presupuesto inicial
– Baja calidad del software generado
– Software que no cumplía con las especificaciones
– Código difícil de mantener
Factores de influencia
Para poder llevar el estado del proceso de software como
un estado de crisis, los críticos han destacado ciertas
características que han permitido esta postura del
software respecto a otras etapas de su corta historia.
Algunos de esos factores son:

• Aumento del poder computacional.


• Reducción del costo del hardware.
• Rápida obsolescencia de hardware y software.
Estrategia: Divide y conquista
• Es fácil resolver pequeños problemas pero es difícil
resolver los grandes problemas.
• Los diseñadores resuelven un problema separando un
algoritmo en partes que son más manejables.
• Las partes son resueltas individualmente; luego las
soluciones pequeñas son integradas y se obtiene la gran
solución.
• Este proceso se denomina descomposición, “divide y
conquista” o mas comunmente diseño…top-down.
Complejidad

P P1

P1 P2 P2 P5

P1.1 P1.2 P2.1


P3 P4
Modularización: Justificación

“Si la probabilidad de que una componente de un


programa sea correcta es p, entonces la probabilidad
de que todo el programa de N componentes sea
correcto es 𝑷P= = p𝒑N𝑵 .
Si N es muy grande, entonces p debe diferir muy
poco de uno si se quiere que P difiera de cero”
Edsger Dijkstra
Modularización: Justificación
Modularización
• Si un problema es difícil de modularizar, hay que
intentar redefinir las tareas involucradas en el
problema.
• Demasiados casos especiales o demasiadas variables
que requieren un tratamiento especial, son signos de
que la definición del problema es inadecuado

• En consecuencia los módulos


• Deberán estar jerarquizados
• Deberán ser pequeños, sencillos e independientes
• Deberán ser legibles
• Deberán usar una estructura de datos y control
adecuados
Modularización
• Ventajas
• Simplifica el Diseño.
• Disminuye la complejidad de los algoritmos.
• Disminuye el tamaño total del programa.
• Promueve la reusabilidad.
• Promueve la abstracción
• Características de caja negra.
• Aislamiento de los detalles mediante.
• Favorece el trabajo en equipo.
• Facilita la depuración y prueba.
• Facilita el mantenimiento.
• Permite la estructuración de librerías específicas.
Modularización
Desventajas
• La integración de los módulos puede ser
compleja en particular si fueron escritos por
diferentes personas.
• Los módulos requieren de documentación
cuidadosa dado que pueden afectar a otras
partes del programa. Se debe prestar mucha
atención cuando se utilizan módulos que
modifican estructuras de datos compartidas
con otros módulos.
• La prueba de un modulo puede ser difícil en
situaciones en las que se necesitan datos
generados por otros módulos.
Llamado a un módulo

Parámetro

Modulo o
Subrutina

Valor de
Retorno
Definición de módulo
Un módulo es una rutina, subrutina, subalgoritmo,
procedimiento o función que puede definirse dentro de
un algoritmo u otro módulo superior con el fin de ejecutar
una tarea específica y puede ser llamado o invocado
desde el algoritmo principal o desde un módulo superior
cuando sea necesario.
Diseño Top-Down: Comunicación

Nivel 0 P

Nivel 1 P1 P2

Nivel 2 P1.1 P1.2 P2.1


Términos
• A las variables definidas en el contexto general,
se les llama variables globales y pueden ser
utilizadas en cualquier parte del algoritmo.
• Las variables locales definidas en un determinado
módulo, sólo pueden utilizarse en el contexto de
dicho módulo.
• La lista de argumentos es un medio de
comunicación entre los distintos módulos en
forma bidireccional no necesariamente.
• Los parámetros son variables o valores que son
copiados en los argumentos de un módulo, para
que éste realice su tarea específica.
Comunicación: Llamado y recepción
• Las subrutinas parametrizadas toman argumentos
que controlan aspectos de su comportamiento o
especifican los datos sobre los que operan.

• Tipos de parámetros
• Parámetros Formales: aparecen en la
declaración de la subrutina.

• Parámetros Actuales: variables y expresiones


que son pasadas a la subrutina en el momento de
la invocación.
Modo de Comunicación
Clasificación de parámetros por su forma de envío

• Por Valor: cada parámetro actual es asignado en el


parámetro formal correspondiente cuando una subrutina es
llamada. Debe ser tratado como una variable de la cuál el
módulo hace una copia y la utiliza localmente.
En pascal por defecto el pasaje es por valor, por lo tanto no existe
ninguna palabra reservada que lo indique.

• Por Referencia: cada parámetro formal es un alias del


parámetro actual correspondiente, significa que el módulo
recibe la dirección de memoria de una variable conocida en
el punto de invocación. Operan directamente sobre la
dirección de la variable original, en el contexto del módulo
que llama, esto significa que no requiere memoria local.
En pascal se antepone la palabra reservada var
Modo de Comunicación
• El número, orden y tipo de los
parámetros o argumentos utilizados en la
invocación a una Función o un
Procedimiento deben coincidir con el
número, orden y tipo de parámetros del
encabezamiento del módulo.
Alcance de las Variables
• Variable local: Es aquella declarada dentro de un
subprograma y es distinta de las variables que
tengan el mismo nombre en cualquier parte del
programa principal. Cuando se hace referencia a
una variable con el mismo nombre que otra
dentro de un programa, se refiere a una posición
diferente de memoria.

• Variables Globales: Es aquella que está


declarada en el programa principal y se puede
referenciar desde cualquier parte del programa,
inclusive desde otros subprogramas.
Ámbito de las variables

P
A, B, C

P1 P2
A, D C, D, F

P1.1 P1.2 P2.1


E, C A D
Comunicación ≠ Efectos laterales
• La comunicación entre el programa principal (o módulos)
con los demás módulos, debe realizarse a través de
parámetros. Cualquier otra comunicación se conoce como
efectos laterales.
Funciones: Declaración
• Representan rutinas de programas que son invocadas desde
algún otro programa.

• Son referenciadas a través de un nombre en una expresión y


una lista de parámetros actuales y devuelve un valor.

function <nombre> (<parámetros><tipo><modo>): <tipo>;


[declaraciones de variables locales]
begin
<acciones> /*cuerpo de la función*/
nombre := <valorRetorno>
end;
Procedimientos: Declaración

• Es un subprograma que ejecuta un proceso específico.


• Ningún valor está asociado con el nombre del
procedimiento.
• A diferencia de las funciones no devuelven valores.

procedure <nombre> (<parámetros><tipo><modo>);


[declaraciones locales]
begin
<acciones> /*cuerpo del procedimiento*/
end;
Procedimientos vs Funciones
• Un procedimiento es llamado desde el proceso
principal o un módulo superior mediante su
nombre y una lista de parámetros actuales.

• Las funciones devuelven un valor

• Los procedimientos pueden devolver 0, 1 o N


valores y en forma de lista de parámetros.

• El procedimiento se declara igual que la función


pero su nombre NO esta asociado a ninguno de
los resultados que obtiene.
Llamar a una Función vs procedimiento

• En una asignación:
p := factorial(5)
• En una operación escribir:
writeln(factorial(5));
• En una expresión algebraica
y := 1 / factorial(x) - 1 / factorial(z);
• En una condición
if (y > factorial(x)) then …
if (primo(x)) then …
Procedimiento como una acción simple
Menu(OP)
Intercambiar(A,B)
LimpiarPantalla
Ejemplo

Mediante un menú de opciones resolver lo siguiente:


1. Ingresar dos valores A y B validando que estén en
el intervalo [0,9] y mostrarlos en letras separados
por una serie de asteriscos
2. Si A y B son pares intercambiar los valores y
mostrarlos en letras
3. Salir
Ejemplo: Módulos jerarquía

principal

menu(OP) ingresar(N) par(A) cambiar(A,B)

validar09(X) Mostrar(X) resto(A,B)

nroletra(N) Separarador
Ejemplo: Módulos a diseñar
Módulo Descripción
El módulo tiene un parámetro formal (OP tipo numérico
menu(OP) entero) dónde recibe un valor indefinido y devuelve en el
parámetro un valor entre 1 y 4.
El módulo tiene un parámetro formal (N tipo numérico
entero) que recibe un valor indeterminado y devuelve en
ingresar(N)
N un valor validado en [0,9] y muestra el valor de N en
letras
El módulo tiene un parámetro formal (X tipo numérico
Mostrar(X) entero) que recibe un valor indeterminado y escribe el
valor del parámetro en letras entre dos separadores
El módulo tiene un parámetro formal (X de tipo numérico
entero) dónde recibe un valor numérico y devuelve en su
validar09(X)
identificador del módulo el valor lógico Verdadero si el
valor del parámetro X está en [0,9] o devuelve el valor
lógico Falso en caso contrario.
Ejemplo: Módulos a diseñar
Módulo Descripción
El módulo recibe en el parámetro formal(N tipo entero)
donde recibe un valor numérico y devuelve en su
nroletra(N)
identificador una cadena de caracteres que es el número
en letras.
El módulo tiene dos parámetros formales (A,B tipo entero)
donde recibe dos valores y devuelve los valores
cambiar(A,B)
intercambiados, el valor de A se asigna a B y el de B se
asigna a A.
Este módulo devuelve en su identificador el valor lógico
par(A) verdadero si el valor recibido en el parámetro formal A es
par o devuelve el valor lógico Falso en caso contrario.
Módulo que devuelve en su identificador un valor entero
resto(A,B) que es el resto de la división entera entre el parámetro A
dividido el parámetro B ambos de tipo entero.
separador Módulo sin parámetros que escribe asteriscos
Ejemplo: principal
program principal;
var
A,B,OP: integer;
begin
Repeat
menu(OP);
case OP of
1: begin
ingresar(A);
ingresar(B);
end;
2: if (par(A)) and (par(B)) then
begin
cambiar(A,B);
mostrar(A);
mostrar(B);
end;
3: writeln('Hasta la vista baby…‘);
else
writeln('error‘);
end;
until OP=3;
End.
Ejemplo: menu, ingresar
procedure menu(var OP: integer);
begin
writeln('1-Ingresar Datos de A, B y mostrar‘);
writeln('2-Cambiar A con B si son pares y mostrar‘);
writeln('3-Salir‘);
writeln('Elija una opcion‘);
readln(OP);
End; procedure ingresar(var N: integer);
begin
Repeat
writeln('ingrese un nro en [0,9]‘);
readln(N);
until validar09(N);
mostrar(N);
End;
Ejemplo: validar09, mostrar,separador
function validar09(X: integer):boolean;
var procedure mostrar(X: integer);
Aux: boolean; Begin
begin separador;
Aux := False; writeln(X, nroletra(X));
if (X>=0) and (X<=9) then separador;
Aux := true; End;
validar09 := Aux;
End;

procedure separador;
begin
writlen('**********************‘);
End;
Ejemplo function par(A: integer):boolean;
var
function nroLetra(N: integer):String; Aux: boolean;
var begin
cadena: string; Aux := False;
begin
case N of if resto(A,2)=0 then
0: cadena := 'cero‘; Aux := true;
1: cadena := 'uno‘; par := Aux;
2: cadena := 'dos‘; End;
3: cadena := 'tres‘;
4: cadena := 'cuatro‘;
5: cadena := 'cinco‘;
6: cadena := 'seis‘;
7: cadena := 'siete‘; function resto(A, B: integer):integer;
8: cadena := 'ocho‘; var
9: cadena := 'nueve‘; R: integer;
else begin
cadena := 'error‘; R := A–A/B*B;
end; resto := R;
nroLetra := cadena; End;
End;
Serie de Taylor del coseno x

• Función Potencia
• Función División
• Función Factorial
Cajero automático

Cajero
automático

Lectura y Selección de Selección de


validación tipo de tipo de Finalizar
Clave cuenta operación

Consulta de Retiro de Pago de


Transferencia
saldo efectivo servicios
Bibliografía

• Fundamentos de Programación: Joyanes


Aguilar – Libro de problemas (Capítulo 5)

Recuerde que le estudio de estos temas debe ser complementado con la


lectura de un libro

También podría gustarte