Programación Modular
Ing. Rudy Luis Manzaneda Veizaga
Definición de Programación Modular
Se puede definir a la programación modular como aquella que usa el concepto
de dividir un problema complejo en subproblemas más pequeños, hasta
que estos sean fáciles de tratar y resolver por separado. Así la solución de los
subproblemas en conjunto dan como resultado la solución del problema
completo (López Román, 2003).
Cuando se requieren resolver problemas más complejos, en los que el número
de instrucciones aumenta, existen técnicas que permiten resolverla de forma
eficiente estos problemas, facilitando al programador la construcción de la
solución.
Definición de Programación Modular
Aplicando este principio a la hora de hacer un programa, entonces
habría que dividir el programa en “subprogramas” que realicen tareas
específicas.
Definición de Programación Modular
Dividir la complejidad de un problema convirtiendo problemas complejos en
un conjunto de problemas más simples y por tanto más sencillos de
implementar.
Reutilizar el código de un programa en cualquier momento de la ejecución
del mismo.
La programación modular es la técnica de programación basada en la filosofía
del diseño descendente
Características de la Programación
Modular
Facilita el diseño descendente
Disminuye la complejidad del algoritmo
Disminuye el tamaño total del programa
Reusabilidad: ahorro de tiempo de programación
Problema en términos
de la solución general
Módulos que ejecuten
Módulos más pequeños tareas o funciones
específicas
Características de la Programación
Modular
División de la programación entre un equipo de programadores reducción del
tiempo de desarrollo
Facilidad en la depuración: comprobación individual de los módulos
Programas más fáciles de modificar
Estructuración en librerías específicas (biblioteca de módulos)
Problema en términos
de la solución general
Módulos que ejecuten
Módulos más pequeños tareas o funciones
específicas
Características de la Programación
Modular
Sin embargo, una descomposición desordenada puede producir un efecto
contrario que se puede contrarrestar reagrupando los componentes en
módulos o paquetes.
La descomposición de un sistema en componentes individuales ayuda a
manejar la complejidad.
Diseño Descendente
Técnica que permite diseñar la solución de un problema con base en la
modularizarían o segmentación, dándole un enfoque de arriba hacia abajo
(Top Down Design)
Subprograma
principal
Módulo I Módulo II
Módulo I.I Módulo [Link] Módulo II.I
Acoplamiento
“La modularidad es la descomposición de un sistema en
un conjunto de módulos cohesivos y débilmente
acoplados.”
Muchos aspectos de la modularizarían pueden ser comprendidos solo si se
examinan módulos en relación con otros
En principio veremos el concepto de independencia. Diremos que dos módulos
son totalmente independientes si ambos pueden funcionar completamente sin
la presencia del otro. Esto implica que no existen interconexiones entre los
módulos, y que se tiene un valor cero en la escala de "dependencia".
El concepto de independencia funcional es una derivación directa del de
modularidad y de los conceptos de abstracción y ocultamiento de la
información.
Cohesión
La cohesión es la medida cualitativa de cuan
estrechamente relacionados están los elementos
internos de un módulo.
Este concepto representa la técnica principal que posee un diseñador para
mantener su diseño lo más semánticamente próximo al problema real, o
dominio de problema.
Claramente los conceptos de cohesión y acoplamiento están íntimamente
relacionados. Un mayor grado de cohesión implica un menor de acoplamiento.
Maximizar el nivel de cohesión intramódular en todo el sistema resulta en una
minimización del acoplamiento intermódular.
UNA BUENA MODULARIDAD SE OBTIENE SI
EXISTE UNA ALTA COHESIÓN Y UN BAJO
ACOPLAMIENTO
Cohesión y Acoplamiento
Cohesión Acoplamiento
Contribuir a Mínima
la misma dependencia
tarea
Cohesión y Acoplamiento
Alta cohesión: las instrucciones contenidas dentro de un
módulo deben contribuir a la ejecución de la misma tarea.
Bajo acoplamiento: a dependencia entre módulos debe ser
mínima. Lo que implica que no debe haber dantos
compartidos entre los módulos (ver figura 4).
Por lo general se espera que cada módulo de código realice una
sola tarea; es decir, todos los componentes de un módulo
(sentencias) deben ir dirigidos a resolver un y sólo un problema. A
esta propiedad se le denomina cohesión y se dice que los módulos
deben ser cohesivos.
Cohesión y Acoplamiento
Modulo
Es un segmento, rutina, subrutina, sub algoritmo o procedimiento que puede
ser definido dentro de un algoritmo mayor con el propósito de ejecutar una
tarea específica, pudiendo ser llamado o invocado desde el módulo principal
cuando se requiera.
Tipos de Módulos
Según su función dentro del programa
a) Programa o módulo principal b) Módulos o módulos secundários
Según su uso
A) Funciones devuelven un valor (evaluación de la función)
B) Procedimientos Realizan tareas pero no devuelven ningún valor directamente
Según los mecanismos de activación
Invocados por referencia
Invocados mediante interrupción
Según el Camino de Control
Módulos Convencionales Única entrada y única Salida
Módulos reentrantes Pueden ser usados mas de una tarea recurrente
Modulo Principal y Secundarios
Modulo Principal
El papel más importante del programa principal (main()) es coordinar a las otras
funciones mediante llamadas o invocaciones, es la primer función llamada por el
compilador.
Módulos Secundarios
Es un subprograma que realiza una tarea específica que puede o no recibir valores
(parámetros).
En Java podemos devolver cualquier tipo de datos escalares (puntero, tipo
numérico y el tipo carácter o en su caso regresar un valor nulo que llamaremos
nada o ninguno). Asimismo, no se pueden devolver arreglos ni estructuras.
Módulos
static int esPrimo(int n) public static void main(String[] args) {
{
int i=1,cont=0,c; int[] numeros = {11, 19, 20, 50, 61, 100};
while(cont<=n) { for (int i = 0; i < [Link]; i++) {
i++; c=0; if (esPrimo(numeros[i])) {
for(int k=1;k<=i;k++) [Link]("El número " + numeros[i] + " es primo");
} else {
if (i%k==0) c=c+1; [Link]("El número " + numeros[i] + " no es primo");
if (c==2) cont++; }
} }
return (i);
}
}
Funciones
Cuando existe un cálculo que será usado de manera repetida a lo
largo del programa en distintos momentos se implementan funciones que el
usuario define. Una función es muy parecida a los módulos, con la
diferencia de que sólo devuelve un valor de un tipo de dato simple.
Son procedimientos con características peculiares: a excepción de un
parámetro de salida, todos los demás son de entrada. El parámetro de salida
sirve para albergar el valor devuelto por la función.
Ventajas de las Funciones
Los programas son más sencillos de implementar y corregir, puesto que
son tareas básicas compuestas de unas pocas líneas de instrucciones.
Fomenta la reutilización.
Evitar la repetición de código, ya que agrupar código en forma de funciones
permite que se ejecute dicho código desde distintas posiciones en un
programa, simplemente llamando dicha función.
Se puede llamar a una función desde diferentes partes de un programa.
Funciones
Procedimientos
Sirven para definir partes de un programa mediante la
asociación de un identificador. Posteriormente dichas
partes se pueden activar utilizando sentencias de
llamada.
Un procedimiento es pues un algoritmo diseñado de tal
modo que es susceptible de ser llamado por otros
algoritmos que, a su vez, pueden ser procedimientos
La llamada a un procedimiento se realiza escribiendo
su nombre seguido de las expresiones sobre las que
deseemos que trabaje. Estas van encerradas entre
paréntesis y en el orden en que han sido especificadas
en el procedimiento llamado.
Parametros
Los parámetros son tanto las variables usadas en la
definición del procedimiento como los valores
utilizados en la llamada.
Entrada: son aquellos que se utilizan para aportar datos al
procedimiento.
Salida: son aquellos que se utilizan para exportar datos
desde el procedimiento.
Pasos de Parámetros (comunicación)
Entre los módulos que componen la estructura completa de un problema, se
establece una serie de comunicaciones a través de determinadas interfaces
que permiten el paso de información de un módulo a otro así como la
trasferencia del control de la ejecución del programa.
Un método puede aceptar información para usarla en su cuerpo de
sentencias. Esta información es suministrada en forma de literales, variables
pasadas al método a través de su cabecera y cada uno de estos elementos de
información se denomina parámetro.
Pasos de Parámetros (comunicación)
La comunicación entre los distintos módulos
permite el paso de información y la trasferencia
de control de la ejecución del programa
Parámetros
Valor que se pasa cuando un método
es invocado
En la
Formales definición del
método
Parámetros
En las
Actuales invocaciones
al método
Paso de Parametros
Por valor
Recibe una copia del valor que se le transfiere
La variable original no cambia de valor
Por referencia
Se pasa la identificación de la zona de memoria donde
se almacena el valor
Al cambiar un valor pasado por referencia se manipula
el mismo valor que se utiliza fuera
Paso de parámetros por valor
En este caso el método recibe una copia del valor que se le pasa. La variable
original (parámetro actual) no cambia de valor, independientemente de que
en el método se cambie el contenido del parámetro formal.
Paso de parámetros por Referencia
En el paso por referencia no se pasa una copia del valor sino la identificación
de la zona de memoria donde se almacena dicho valor. Por esta razón al
trabajar dentro del módulo con la entidad pasada por referencia se está
manipulando el mismo valor que se utiliza fuera.
Para efectos prácticos si se realiza una modificación de ese valor dentro del
módulo, la modificación se mantiene al salir del mismo y la diferencia con el
paso por valor, es que el que el módulo maneja una copia del valor original, y
las modificaciones realizadas dentro del método no afectan a la variable
externa.
Paso de parámetros por Referencia
Se define a la variable X en el módulo principal, la
cual tiene su contenido en la memoria, y se le coloca
0.
Variable
Variable Contenido
Contenido
X 0
Cuando se llama al Módulo Cambiar, se conecta X y Y
vía parámetro por referencia, lo que hace que sean
sinónimos, es decir, que Y utilice la misma dirección
de memoria que X.
Variable
X Contenido
Variable Contenido
0
Y
Paso de parámetros por Referencia
Cuando Y se le colca 1 ¿qué le pasa a X?
Variable
X Contenido
Variable Contenido
1
Y
A X le pasa lo mismo que le sucede a Y; es
decir, a Y se le coloca 1 e indirectamente le
sucede lo mismo a X, porque manejan el
mismo contenido en la memoria (López
Román, 2003).
Ventajas de la Modularización
Programas más sencillos de implementar y
corregir
Fomenta la reutilización
Evita repetición de código
Se pueden llamar funciones desde diferentes
partes de un programa
Se pueden crear programas partiendo de
funciones estandarizadas que ejecuten tareas
específicas
Alcance de Variables
Cuando se consideran varios módulos de software y no un solo programa
principal, se pueden declarar variables tanto en el contexto global del
algoritmo, como de manera local en cada módulo a lo que se le conoce como
alcance de las variables, en otras palabras esto permite identificar la zona del
programa donde una variable es accesible “conocida”.
Alcance de Variables
Zona del programa donde la variable es
accesible “conocida”
Variables
Globales Locales
Alcance de Variables
Variables globales
Algoritmo GLOBALES
num: Entero
Módulo principal
num ← 0
Todos los módulos
Llamar resultado
reconocen la variable
Escribir num
num como global y
Fin Módulo principal
la pueden cambiar
Módulo resultado
num ←1
El resultado al Fin Módulo resultado
escribir el
valor de num
sería 1
Variable Globales
Son las que son accesibles desde cualquier punto del programa y se pueden
usar desde cualquier módulo o subprograma, esto lleva a considerar que la
variable puede usarse en cualquier parte del programa y su valor se puede
alterar incontroladamente, y si posteriormente es necesario usar la variable
en otra parte del programa con su valor original, se tendrá un error.
Variables Locales
Las variables locales sólo existen en un ámbito determinado del programa,
por ejemplo en un subprograma o en un bloque de sentencias. Solo pueden
ser utilizadas en el módulo donde fueron definidas