Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Facultad de Ingeniería. Extensión Áulica Libertador General San Martín Capítulo 3. Programación Modular Introducción a la Informática E.A.L.G.S.M. Página 1 Introducción Un mismo programa puede ser creado de muchas maneras distintas, dependiendo del estilo de cada programador. Sin lugar a duda, un buen programa no es solo aquel que tiene un número reducido de líneas de código, sino también una buena organización y suficientes comentarios descriptivos que expliquen qué es lo que está haciendo en cada parte del programa. Desde hace ya algunos años se han ido creando y perfeccionando diferentes técnicas de programación, con el objetivo de crear programas con un alto grado de organización, haciéndolos fáciles de leer y modificar. Esta técnica consiste en dividir un problema en distintos módulos con el fin de que cada uno realice una única actividad o tarea. De esta manera cada uno de los módulos se analizan, codifican y ponen a punto por separado de los demás módulos. Cada programa contiene un programa principal que controla todo lo que sucede; este transfiere el control a módulos de manera que ellos puedan ejecutar sus propios submódulos. Los submódulos son independientes en el sentido en que ninguno de ellos puede tener acceso directo a cualquier otro módulo o submódulo excepto el módulo que llama y sus propios submódulos. Permiten también hacer pequeñas porciones de código reutilizable, que pueden ser llamados desde el resto del programa sin necesidad de repetir esas partes de código cada vez que se necesiten. Breve reseña histórica de la evolución del Software En la siguiente figura se muestra 4 décadas de evolución del Software desde la década del 50 hasta el año 2.000 En la primera era, la programación de computadoras era un "arte" para el que existían pocos métodos sistemáticos. El desarrollo del software se realizaba sin ninguna planificación, hasta que los planes comenzaron a complicarse y los costes a aumentar. Los programadores trataban de hacer las cosas lo mejor que se podía y con gran esfuerzo, resultaban con éxito. El software se diseñaba a medida para cada aplicación y tenía una distribución relativamente pequeña. La mayoría del software se desarrollaba y era utilizado por la misma persona u organización. La misma persona lo escribía, lo ejecutaba y, si fallaba, lo depuraba (corregía). Debido a este entorno personalizado del software, el diseño era un proceso implícito, realizado en la mente de alguien y la documentación normalmente no existía. Facultad de Ingeniería. Extensión Áulica Libertador General San Martín Capítulo 3. Programación Modular Introducción a la Informática E.A.L.G.S.M. Página 2 La segunda era en la evolución de los sistemas de computadora se extiende desde la mitad de la década de 1960 hasta finales de la de 1970. La multiprogramación y los sistemas multiusuario introdujeron nuevos conceptos de interacción hombre-máquina. Las técnicas interactivas abrieron un nuevo mundo de aplicaciones y nuevos niveles de sofisticación del hardware y del software. Los sistemas de tiempo real podían recoger, analizar y transformar datos de múltiples fuentes, controlando así los procesos y produciendo salidas en milisegundos en lugar de minutos. Los avances en los dispositivos de almacenamiento en línea condujeron a la primera generación de sistemas de gestión de bases de datos. La segunda era se caracterizó también por el establecimiento del software como producto y la llegada de las "empresas del software". Las empresas, el gobierno y la universidad se aprestaban a "desarrollar el mejor paquete de software" con el cual obtendrían grandes ganancias. Conforme crecía el número de sistemas informáticos, comenzaron a extenderse las bibliotecas de software de computadora. Las casas desarrollaban proyectos en los que se producían programas de decenas de miles de líneas de código. Todos esos programas tenían que ser corregidos cuando se detectaban fallos, modificados cuando cambiaban los requisitos de los usuarios o adaptados a nuevos dispositivos hardware que se hubieran adquirido. Estas actividades se llamaron colectivamente mantenimiento del software. La tercera era en la evolución de los sistemas de computadora comenzó a mediados de los años setenta y continuó más allá de una década. El sistema distribuido incrementó notablemente la complejidad de los sistemas informáticos. Las redes de área local y de área global, las comunicaciones digitales y la creciente demanda de acceso "instantáneo" a los datos, impusieron una fuerte presión sobre los desarrolladores del software. En conclusión, la tercera era se caracterizó por la llegada y amplio uso de los microprocesadores. El microprocesador produjo un extenso grupo de productos inteligentes, desde automóviles hasta hornos de microondas; desde robots industriales a equipos de diagnósticos médicos. En la cuarta era, computadoras personales controladas por sistemas operativos sofisticados, en redes globales y locales, acompañadas por aplicaciones de software avanzadas se convirtieron en lo más destacado. Finalmente, en la quinta era (2000-actualidad) aumentó la omnipresencia de la web, la reutilización de la información y de los componentes del software. Crisis del software La crisis del software es un término informático acuñado a principios de los años 70, en la primera conferencia organizada por la OTAN sobre desarrollo de software, de la cual nació formalmente la rama de la Ingeniería de Software. El término se adjudica a F. L. Bauer, aunque previamente había sido utilizado por Edsger Dijkstra. (1972) en “The Humble Programmer”. La crisis del software expresaba las dificultades para escribir programas frente al rápido crecimiento de la demanda, de la complejidad de los problemas a ser resueltos y de la inexistencia de técnicas Facultad de Ingeniería. Extensión Áulica Libertador General San Martín Capítulo 3. Programación Modular Introducción a la Informática E.A.L.G.S.M. Página 3 establecidas para escribir programas libres de problemas (bugs), fácilmente comprensibles y pudieran ser verificables. La crisis se caracterizó por los siguientes problemas: • Complejidad de la forma de programar • Cambios a los que se ven afectados los programas • Ausencia de herramientas para estimar el esfuerzo • Funcionalidad incorrecta. • Desarrollo y mantenimiento inadecuados. • Insatisfacción de la demanda. • Imprecisión en la planificación del proyecto y estimación de los costos. • Baja calidad del software. • Dificultad de mantenimiento de programas con un diseño poco estructurado, difícil y costoso. • Insatisfacción de clientes y usuarios. Factores de influencia • Aumento del poder computacional. • Reducción del costo del hardware. • Rápida obsolescencia de hardware y software. Programación Modular Una de las grandes ventajas que tiene la programación estructurada es la división de problemas grandes en subproblemas. Estos problemas pueden a su vez dividirse repetidamente en problemas más pequeños hasta que los problemas sean de fácil solución: Divide y vencerás. La programación modular es un paradigma de la programación que consiste en dividir un programa en módulos o subprogramas con el fin de hacerlo más legible y manejable. Cada subproblema es deseable que sea independiente de los demás y se denomina módulo. El problema original se resuelve con un programa principal (llamado también driver o main), y los subproblemas (módulos) mediante subprogramas: procedimientos y funciones. La resolución de un problema comienza con una descomposición modular y luego nuevas descomposiciones de cada módulo en un proceso denominado refinamiento sucesivo. Facultad de Ingeniería. Extensión Áulica Libertador General San Martín Capítulo 3. Programación Modular Introducción a la Informática E.A.L.G.S.M. Página 4 Estatécnica permite dar más legibilidad y facilidad en la construcción y corrección de los errores que se presentan en la solución de un problema determinado. Cada una de las divisiones que se hacen para obtener la solución de un problema se denomina módulo y éstos son implementados por medio de los subprogramas. Por lo tanto, los subprogramas (sean funciones o procedimientos) permiten hacer pequeñas porciones de código reutilizable, que pueden ser llamados desde el resto del programa sin necesidad de repetir esas partes de código cada vez que se necesiten. Un subprograma es un algoritmo diseñado para efectuar una tarea particular, bajo la dependencia de un algoritmo u otro subprograma que lo utiliza. De esta manera, el subprograma se diseña para ser utilizado por otros procesos más amplios, dentro de los cuales existe una comunicación y flujo de recibo y entrega de información. La utilización de subprogramas en la solución de problemas grandes tiene muchas ventajas. Por ejemplo, para tareas que deban efectuarse más de una vez, la modularidad evita la necesidad de programación redundante, esencialmente tener que repetir el mismo conjunto de instrucciones; en vez de ello, un módulo puede construirse e invocarse cada vez que se necesite hacer la misma tarea, por lo tanto, el uso de módulos permite que los programas sean más cortos. De igual manera, la fragmentación en módulos individuales proporciona claridad, facilidad de distribución de trabajo en equipo y, por ser algoritmos cortos, son más fáciles de escribir, corregir y su estructura lógica es más clara que la de los programas que no están divididos en módulos. El subprograma, por ser un algoritmo, debe cumplir con las mismas características de éste y hacer tareas similares como aceptar datos, escribir datos y hacer cálculos; sin embargo, es utilizado para un propósito específico. El subprograma recibe datos del algoritmo o de otro subalgoritmo que lo invoca y éste le devuelve resultados. Su tarea puede compararse con la de un jefe que le da instrucciones a un empleado (subprograma), para que realice una determinada tarea y así poder continuar con su trabajo; se detiene mientras su subalterno realiza la tarea y cuando éste le devuelve los resultados reanuda su trabajo. Asimismo, cuando un algoritmo invoca un subprograma le cede el control de ejecución a éste, por lo tanto, detiene la ejecución de la próxima instrucción hasta que el subprograma se ejecute, le entregue resultados y le devuelva el control de ejecución. La comunicación que se establece entre el algoritmo llamante y el subprograma se hace a través de variables denominadas parámetros. Un subprograma puede ser invocado tantas veces como se necesite y, a su vez, los subprogramas también pueden invocar a otros subprogramas, como puede verse en la figura siguiente. Facultad de Ingeniería. Extensión Áulica Libertador General San Martín Capítulo 3. Programación Modular Introducción a la Informática E.A.L.G.S.M. Página 5 En el gráfico las flechas indican el flujo de ejecución del algoritmo; observe que cuando se ejecuta una instrucción de llamada a un subprograma, el algoritmo llamante se detiene, ya que no solamente le transfiere información al subprograma sino también el control de ejecución; esto hace que se active el subprograma, se les dé valor a las variables que lo conforman y se ejecuten una a una las instrucciones. Una vez que finaliza su ejecución, tiene la información requerida por el algoritmo llamante; por lo tanto, se la entrega y devuelve el control de ejecución a la instrucción siguiente o a la misma instrucción desde donde fue llamado, dependiendo de la clase de subprograma. En la figura también se muestra que un algoritmo puede invocar las veces que sea necesario al mismo subprograma y que un subprograma puede, a su vez, invocar a otros subalgoritmos. Cuando un algoritmo invoca a un subprograma es como si las instrucciones de éste se copiaran dentro del algoritmo y las ejecutara; en el caso del subprograma A, no tiene sentido tener el mismo grupo de instrucciones repetidas dentro del algoritmo; los subprogramas se diseñan para que sean usados en diferentes programas. Ventajas de la programación modular • Disminuye la complejidad del algoritmo. • Disminuye el tamaño total del programa. • Facilita la programación: Es más sencillo resolver varios problemas simples que uno complejo. Facultad de Ingeniería. Extensión Áulica Libertador General San Martín Capítulo 3. Programación Modular Introducción a la Informática E.A.L.G.S.M. Página 6 • Mayor claridad: Programación estructurada en bloques y código más compacto. • Ahorro de tiempo: Cada parte de la solución puede desarrollarse independientemente en paralelo. • Facilita la modificación/mantenimiento: comprobación individual de los módulos • Permite la reutilización del código: Empaquetado de funciones y procedimientos en o bibliotecas reutilizables. • Trabajo en equipo: división de la programación entre un equipo de programadores → reducción del tiempo de desarrollo. Los Módulos Un módulo es una rutina, subrutina, subprograma, subalgoritmo o subproceso 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. Los módulos se clasifican en procedimientos y funciones. Los procedimientos y funciones son unidades de programas diseñados para ejecutar una tarea específica. Por ejemplo, los procedimientos predefinidos LEER y ESCRIBIR están diseñados para realizar operaciones de entrada y salida de datos de un programa. El proceso de descomposición de un problema en módulos se denomina modularización. Los procedimientos y funciones asisten a la programación modular. Funciones Desde el punto de vista matemático, una función es una expresión que toma uno o más valores llamados argumentos y produce un valor que se llama resultado. Este resultado es, además, único. Ejemplos de funciones matemáticas son los logaritmos, funciones trigonométricas (seno, coseno, etc.). El en ambiente de programación y diseño de algoritmos, las funciones tienen exactamente el mismo significado. Es decir, se realizan ciertos cálculos con una o más variables de entrada y se produce un único resultado. En programación y diseño de algoritmos, este resultado podrá ser un valor numérico, alfanumérico o lógico. Es decir, una función puede devolver un resultado que puede ser una cadena, un número o un valor de tipo lógico (verdadero o falso). Esto hace que, en los lenguajes de programación, se deba especificar de qué tipo es una función. Una función será de tipo numérica cuando devuelva un número y será de tipo alfanumérica o string (o char) cuando devuelva una cadena. Facultad de Ingeniería. Extensión Áulica Libertador General San Martín Capítulo 3. Programación Modular Introducción a la Informática E.A.L.G.S.M. Página 7 Formas de llamar o invocar funciones: 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 Se ha visto que las funciones se utilizan para devolver como resultado un valor, sin embargo, en ocasiones necesitaremos devolver más de un resultado o también ejecutar las mismas líneas de código varias veces en un algoritmo (como por ejemplo una ordenación, etc.) En estas situaciones la función no es apropiada y se utilizarán los procedimientos. Un procedimiento es un conjunto de sentencias o instrucciones que realizan una determinada tarea y que pueden ser ejecutados desde más de un punto del programa principal. Un procedimiento tiene una llamada, cuando el procedimientose ejecuta totalmente, vuelve al punto desde donde fue llamado y se ejecuta la siguiente instrucción. El procedimiento se escribe como cualquier otro algoritmo, solo existen diferencias en la parte inicial y final. Para nombrar los procedimientos se deben seguir las mismas reglas que para las variables. Notemos que el objetivo de los procedimientos es ayudar en la modularidad del programa y evitar la repetición de instrucciones ya que estas se pueden escribir en un procedimiento y en lugar de repetirlas, llamar al procedimiento cuantas veces sea necesario. Desde el programa principal es posible pasar valores (numéricos, alfanuméricos o combinación de ambos) al procedimiento. Este utilizará esos valores para realizar un determinado proceso. Los valores que se pasan a un procedimiento (en forma de variables) se llaman parámetros (de igual forma que en las funciones). Facultad de Ingeniería. Extensión Áulica Libertador General San Martín Capítulo 3. Programación Modular Introducción a la Informática E.A.L.G.S.M. Página 8 Podemos utilizar procedimientos, por ejemplo, para dibujar recuadros en la pantalla, mostrar mensajes de error, realizar procesos en los que se debe devolver más de un resultado, colocar en un procedimiento las líneas de código que se repiten varias veces en un algoritmo. Formas de llamar o invocar procedimientos: Menu(OP) Intercambiar(A,B) LimpiarPantalla Procedimiento vs Función Las funciones, normalmente, devuelven un sólo valor a la unidad de programa (programa que invoca a la función) que las referencia. Los procedimientos pueden devolver cero, uno o varios valores. En el caso de no devolver ningún valor, realiza alguna tarea tal como alguna operación de entrada y/o salida. El procedimiento se declara igual que la función, pero su nombre NO está asociado a ninguno de los resultados que obtiene Una función se referencia utilizando su nombre en una expresión, mientras que un procedimiento se referencia por su llamada o invocación al mismo. Ámbito de las variables En programación existen dos tipos de variables, las llamadas locales y las variables globales. Variables Locales: Son aquellas que se encuentran dentro de un subprograma (procedimiento o función) y es distinta de las variables que están en el algoritmo principal. El valor se confina al subprograma en el que está declarada. Variables Globales: Son las que se definen o están declaradas en el algoritmo principal y tiene efecto tanto en el algoritmo principal como en cualquiera de sus subprogramas. Una variable local (de un subprograma) no tiene ningún significado en el algoritmo principal y otros subprogramas. Si un subprograma asigna un valor a una de sus variables locales, este valor no es accesible a otros subprogramas, es decir, no pueden utilizar este valor. Las variables globales tienen la ventaja de compartir información de diferentes subprogramas. Facultad de Ingeniería. Extensión Áulica Libertador General San Martín Capítulo 3. Programación Modular Introducción a la Informática E.A.L.G.S.M. Página 9 En resumen: las variables locales son las que se definen en subprogramas y solo tienen valor dentro de él. Las variables globales son las definidas en el algoritmo principal y tienen valor y se pueden utilizar en cualquier parte de algoritmo o en cualquier subprograma. Los parámetros Los parámetros permiten que el programa y los procedimientos y funciones puedan comunicarse entre sí intercambiando información. Si la ejecución de los subprogramas produce resultados necesarios en el punto de llamada, los parámetros pueden actuar como el medio de trasmisión de esos resultados. 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. Clasificación de parámetros • Parámetros Formales: aparecen en la declaración de la subrutina. Ejemplo: f(x,y), x e y son los parámetros formales. • Parámetros Actuales: variables y expresiones que son pasadas a la subrutina en el momento de la invocación. Ejemplo: f(3,4), 3 y 4 son parámetros actuales. Pasaje de información entre argumento y parámetro Cada vez que un algoritmo llama a un subprograma, se establece una correspondencia automática entre los argumentos y los parámetros correspondientes. En el pasaje de estos parámetros se distinguen básicamente dos formas: pasaje por valor y pasaje por referencia. Pasaje de parámetros por valor: es la forma más simple de pasar los datos, donde los parámetros reciben como valores iniciales una copia de los valores de los argumentos y con estos valores se comienza a ejecutar el subprograma. Cada parámetro actual es asignado en el parámetro formal correspondiente cuando un subprograma es llamado. Debe ser tratado como una variable de la cual el módulo hace una copia y la utiliza localmente. Facultad de Ingeniería. Extensión Áulica Libertador General San Martín Capítulo 3. Programación Modular Introducción a la Informática E.A.L.G.S.M. Página 10 Pasaje de parámetros por referencia: en lugar de pasar el valor del argumento como valor inicial para su respectivo parámetro, el pasaje de parámetros por referencia, también llamado por dirección, establece una conexión directa a través de su dirección de memoria. 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. 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. Si un procedimiento o función modifica una variable global (distinta de un parámetro actual), éste es un efecto lateral
Compartir