Tema 26 – Programación modular. Diseño de funciones. Recursividad. Librerías.

1. Introducción. 1

1.1. Relación con los ciclos impartidos en FP. 1

1.2. Introducción a la Programación. 1

2. Programación Modular 1

2.1. Definición. 1

2.2. Metodologías de diseño. 2

3. Diseño de Funciones. 2

3.1. Procedimientos. 3

3.2. Funciones. 3

4. Recursividad. 3

5. Bibliotecas (librerías) 3

6. La programación en la actualidad y algunos lenguajes de programación. 4

6.1. Programación orientada a objetos. 4

6.2. C, C++ y C#. 4

6.3. JAVA. 4

7. Bibliografía. 4

1. Introducción

1.1. Relación con los ciclos impartidos en FP

Este tema está directamente relacionado con los siguientes módulos y ciclos formativos de la rama de informática:

· CFGS Administración de Sistemas Informáticos:

o Fundamentos de programación (Informática).

· CFGS Desarrollo de Aplicaciones Informáticas:

o Programación en lenguajes estructurados (Informática).

1.2. Introducción a la Programación

· Instrucción: Es una cadena de símbolos de un alfabeto, formada de acuerdo con ciertas reglas sintácticas que el procesador (o el compilador) entiende, y que finalmente serán interpretadas y ejecutadas por el procesador.

· Programa: Conjunto de instrucciones en algún lenguaje de programación suministradas al ordenador, ordenadas de una forma determinada, para que éste ejecute las operaciones para resolver un problema.

· Lenguaje de programación: Técnica estándar de comunicación que permite expresar las instrucciones que han de ser ejecutadas en una computadora. Consiste en un conjunto de reglas sintácticas y semánticas que definen un programa informático.

Un lenguaje de programación permite a un programador especificar de manera precisa: sobre qué datos una computadora debe operar, cómo deben ser estos almacenados y transmitidos y qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural, tal como sucede con el lenguaje Léxico.

· Algoritmo: Una lista bien definida, ordenada y finita de operaciones que permite hallar la solución a un problema. Dado un estado inicial y una entrada, a través de pasos sucesivos y bien definidos se llega a un estado final obteniendo una solución. Debe de ser eficiente, definido, finito y preciso:

2. Programación Modular

2.1. Definición

· Módulo: Colección de declaraciones definidas en un ámbito de visibilidad particular y oculto al resto del programa con el que se comunica por una sección de interna donde se incluyen la lista de exportaciones.

· Usando módulos se construyen las unidades en que se ha de descomponer cualquier programa mínimamente importante. Los módulos se conectan entre sí dando lugar a una estructura modular que permite resolver el problema de programación planteado, facilita la comprensión del programa. Se debe evitar tanto la modularización excesiva como que ésta quede pobre.

· La Programación modular es un primer paso en la evolución hacia la programación orientada a objetos y por componentes.

· Los algoritmos se han de concebir como una jerarquía de módulos intercomunicados donde cada uno de ellos presenta una función clara y diferenciada y en la que ningún módulo accede directamente al interior de otros módulos sino que simpre utiliza los mecanismos de interfaz.

· Interfaz: Un módulo actúa como una caja negra con la cual el resto del programa interactúa a través de una sección de interfaz. Es pues una colección de declaraciones de constantes, tipos, variables, procedimientos, funciones, etc..

· Implementación: Incluye el código de los procedimientos y demás elementos constitutivos de la parte ejecutable del módulo. Detalla las definiciones y el diseño de todos los elementos que el módulo contiene. La implementación puede incluir, asimismo, la lista de importaciones correspondiente a los elementos exteriores utilizados por el módulo.

· En “C”, el concepto de módulo se corresponde con el de fichero, así la implementación de un programa en módulos se efectúa distribuyendo el código entre diversos ficheros. Para crear un módulo se crea un archivo de cabeceras “.h” (header), en el que se incluyen las declaraciones de todos los elementos, y otro “.c” en el que, además de la implementación, se ha de incluir las declaraciones del primero así: #include “mifichero.h” “C” no permite ocultar la implementación. Las importaciones se pueden incluir explícitamente haciendo uso de un archivo de cabeceras con la sintaxis #include “archivo.h”.

· Un ejemplo de lenguaje que sí permite exportar tipos (punteros y enumerados),ocultando su implementación, y que tiene perfectamente definido el concepto de lista de importación es MODULA 2.

· Diseño Top Down: Diseño descendente que se basa en una serie de descomposiciones sucesivas del problema inicial (refinamiento progresivo). Con esto se consigue la simplificación del problema y de los bloques resultantes; las diferentes partes del problema pueden ser diseñadas y desarrolladas de modo independiente; el diseño final queda estructurado en forma de bloques o módulos; aminora la dificultad de resolución y posterior mantenimiento.

· Independencia funcional: se adquiere desarrollando módulos con una clara función y una aversión a una excesiva interacción con otros módulos. Cada módulo se ha de centrar en una subfunción específica de los requisitos y debe tener una interfaz sencilla. Con esto, se facilita el desarrollo y el mantenimiento, y se fomenta la reutilización.

· Estructura de un programa: Representa la organización de los componentes del programa (módulos) e implica una jerarquía de control. La notación más común es un diagrama en forma de árbol denominado diagrama de estructura. Representa la visibilidad y la conectividad.

2.2. Metodologías de diseño

· Top-down: Es la más aconsejada para la programación estructurada. Se define el sistema como desde un punto de vista global como si de una caja negra se tratara, y en la que lo importante es el funcionamiento global, sus entradas y salidas, y no como se realizan las operaciones. Después, se va descomponiendo el sistema por medio de refinamientos sucesivos hasta que el sistema queda totalmente especificado mediante las instrucciones en algún lenguaje de programación.

· Bottom-up: En contraste, en el diseño Bottom-up las partes individuales se diseñan con detalle y luego se enlazan para formar componentes más grandes, que a su vez se enlazan hasta que se forma el sistema completo.

· El desarrollo de software moderno usualmente combina tanto Top-down como Bottom-up. Aunque un conocimiento completo del sistema se considera usualmente necesario para un buen diseño, la mayoría de proyectos de desarrollo de software tratan de reutilizar componentes software desarrollados y probados previamente.

3. Diseño de Funciones

· Son estructuras que contienen un conjunto de instrucciones, y que permiten reutilizarlas tantas veces como sea necesario. Pueden recibir o no valores de entrada y devolver o no valores de salida. Se trata de sustituir todo un conjunto de instrucciones por un identificador que puede incorporar la declaración de valores. Posteriormente en cualquier lugar del programa se podrá invocar al conjunto de instrucciones utilizando el identificador. Pudiéndose obtener resultados devueltos. Existen dos tipos, funciones y procedimientos, que realmente se diferencian en poco.

· Ámbito de un identificador: El ámbito de un identificador (nombres de variables, constantes, funciones, procedimientos, etc.), es la parte del programa donde ese identificador puede ser utilizado, porque se conoce su existencia. Así, las variables pueden clasificarse en:

o Variables locales: Son las que se definen dentro de un subprograma, por lo tanto su ámbito coincide con el del subprograma y no pueden utilizarse fuera de él. Incluso se podrá definir una variable con el mismo nombre fuera de éste.

o Variables globales: Son las que se definen en el programa principal, o incluso fuera de éste como en el caso del lenguaje C, y que son visibles para todo el programa y los subprogramas que dependen de él. Sin embargo, si dentro de un subprograma se define una variable con el mismo nombre, dentro de éste subprograma se accede a la local, y no a la global.

3.1. Procedimientos

· Sirven para definir partes de un programa mediante la asociación de un identificador.

· En tiempo de ejecución, las instrucciones que siguen a la llamada al procedimiento contarán ya con los resultados del mismo.

· La llamada a un procedimiento se realiza escribiendo su nombre seguido de los parámetros sobre las que deseemos que trabaje, estas van encerrados entre paréntesis y en el orden en que han sido especificadas en el procedimiento llamado. En algunos lenguajes es necesario predecir una palabra de llamada como CALL delante del identificador del procedimiento que se desea ejecutar.

· Parámetros: Tanto las variables usadas en la definición del procedimiento como los valores utilizados en la llamada se denominan parámetros (los primeros formales y los segundos reales). Hay de tres tipos:

o De entrada: Son aquellos que se utilizan para aportar datos al procedimiento. Si dentro del procedimiento se actualiza el valor del parámetro formal, el parámetro real no se verá afectado.

o De salida: Son aquellos que se utilizan para exportar datos desde el procedimiento. No aportan un valor inicial, el procedimiento les asignará valores.

o De Entrada/Salida: Aportan datos al procedimiento, y si son modificados dentro de éste, se modificarán los parámetros reales, por lo que también pueden exportar datos.

3.2. Funciones

· Es un procedimiento cuyos parámetros son todos de entrada a excepción de uno que será de salida. No obstante, algunos lenguajes permiten dos formas de pasar parámetros: por valor, en la que si los parámetros formales se modifican dentro de la función, no se actualiza el valor de los reales, y por referencia en la que si los parámetros formales se modifican, sí se actualiza el valor de los reales.

· El parámetro de salida sirve para albergar el valor devuelto por la función. Éste, no debe aparecer en la lista de parámetros y permite realizar llamadas a la función dentro de una expresión de la misma forma que iría el dato que proporciona como resultado.

· Esta estructura facilita la escritura de las aplicaciones y las hace más inteligibles.

· Por ejemplo en el lenguaje C se utilizan funciones y todos los parámetros son de entrada a excepción del valor devuelto que será de salida. No obstante, se puede simular utilizar parámetros de entrada/salida utilizando como parámetros de la función las direcciones de memoria de las variables en vez del valor de éstas (paso por referencia). Así en la llamada a la función se le pasarán como parámetros las direcciones de las variables, de esta forma, la función no podrá cambiar el valor de dichas direcciones, pero sí actualizar los datos que contienen esas direcciones utilizando punteros.

4. Recursividad

· Cuando un algoritmo se invoca a sí mismo o es invocado en otro algoritmo previamente llamado.

· 2 condiciones:

o Las sucesivas invocaciones deben ser efectuadas con versiones cada vez más reducidas del problema inicial

o Debe existir una condición de fin de las llamadas o fin de la recursividad.

· Cualquier algoritmo iterativo puede ser expresado en forma recursiva y viceversa.

· Ejemplos típicos de recursividad son la función Factorial de un número; el recorrido de un árbol; algoritmos “divide y vencerás” o backtracking.

· Hay que tener cuidado con el coste de cómputo y, sobretodo, con el consumo de memoria, ya que cada llamada recursiva ocupa espacio para variables locales y parámetros de función, así como espacio adicional para el contexto de la función.

· La recursividad en datos consiste en definir tipos de datos que incluyen en su definición el tipo definido. Se utiliza en las estructuras dinámicas, listas, etc.

5. Bibliotecas (librerías)

6. La programación en la actualidad y algunos lenguajes de programación

6.1. Programación orientada a objetos

· La evolución de la programación en cuanto a la capacidad de abstracción y reutilización de código se ve reflejada en la programación orientada a objetos. Ésta, se basa en la idea de encapsular estado y operaciones en objetos, definiendo previamente las “Clases” de objetos. En general, la programación se resuelve comunicando dichos objetos a través de mensajes. Suelen permitir herencia y polimorfismo, y se siguen utilizando estructuras de control. Su principal ventaja es la reutilización de códigos y su facilidad para pensar soluciones a determinados problemas dado su alto nivel de abstracción. Ej.: Smalltalk, C++, Java, Visual Basic .NET, etc.

· En la actualidad en un contexto que incluye la generalización de las GUI, de los ordenadores personales y de Internet, los lenguajes de programación vienen integrados en completos entornos de desarrollo (IDE), que incluyen herramientas RAD (Rapid Assistant Development), herramientas CASE, completas librerías y asistentes de apoyo al programador, etc. La mayoría de los lenguajes permiten la programación orientada a objetos, alcanzando cada vez un nivel mayor de abstracción, y muchos de ellos se ejecutan sobre una máquina virtual para soportar múltiples plataformas, algo idóneo para las aplicaciones de Internet, tal como lo hacen JAVA o los lenguajes de Visual Studio .NET. Por otro lado, para el tratamiento de datos es común el uso de lenguajes de cuarta generación (4G) no procedimentales como SQL.

6.2. C, C++ y C#

· C: Es un lenguaje de programación estructurado creado en 1969 por Ken Thompson y Dennis M. Ritchie en los Laboratorios Bell como evolución del anterior lenguaje B, a su vez basado en BCPL. Es un lenguaje orientado a la implementación de Sistemas Operativos, concretamente Unix. C es apreciado por la eficiencia del código que produce y es el lenguaje de programación más popular para crear software de sistemas, aunque también se utiliza para crear aplicaciones.

Se trata de un lenguaje de medio nivel pero con muchas características de bajo nivel como el acceso a memoria mediante punteros. A pesar de su madurez, aún se sigue usando para la creación de múltiples programas.

· C++: Lenguaje de programación diseñado a mediados de los ochenta, como extensión del lenguaje de programación C y que permite la programación orientada a objetos. Algunas de las características soportadas: abstracción (encapsulación), polimorfismo, herencia múltiple, plantillas, sobrecarga de operadores, manejo de excepciones, etc.

· La evolución de C++ ha dado lugar a C#, un lenguaje creado por Microsoft dentro de su plataforma Visual Studio .NET. Tiene una sintaxis similar a C++ pero es más sencillo (por ejemplo se huye del uso de punteros) y parecido a java, el código fuente se traduce a un código intermedio (MSIL, Microsoft Intermediate Lenguaje) que posteriormente se ejecuta sobre una máquina virtual denominada .NET Framework, consiguiendo así la independencia de plataforma hardware. .NET permite además la programación en muchos más lenguajes como Visual Basic, C++, J#, PERL o COBOL.

6.3. JAVA

· Lenguaje desarrollado por Sun Microsystems a principios de los 90. Es ideal para programar en Internet debido a que se ejecuta sobre una “máquina virtual” (MVJ) y por tanto es portable e independiente de la plataforma de ejecución. Por el contrario, y debido precisamente a que su lenguaje intermedio BYTECODE debe ser interpretado sus prestaciones son menores que otros lenguajes compilados.

· Es más simple que C++, permite la ejecución multitarea y los hijos (threads), es robusto y más seguro que C++ (por ejemplo ha eliminado el uso de punteros), incorpora recolección automática de memoria (garbage collection), dispone de una librería de clases estándar y admite un cierto grado de herencia múltiple mediante interfaces.

7. Bibliografía

· Pressman, R.S.: Ingeniería del sofware. Un enfoque práctico. McGraw-Hill

· Alcalde, E y García, M.: Metodología de la programación. McGraw-Hill

· http://es.tldp.org Documentación libre en español de Linux/Unix

· http://www.tutorialparaprofesores.com Documentación de Microsoft para profesores.

· http://technet.microsoft.com Documentación tecnológica de Microsoft

· https://msdn.microsoft.com Centro de desarrollo de Microsoft

· http://algoritmia.com Web sobre el diseño de algoritmos

Publicado: marzo 17, 2019 por Laura Gonzalez

Etiquetas: tema 26 informática