Actualizado el 15 de Diciembre del 2018 (Publicado el 11 de Diciembre del 2018)
1.539 visualizaciones desde el 11 de Diciembre del 2018
2,1 MB
39 paginas
Creado hace 11a (10/04/2014)
10/04/2014
Fundamentos de la programación
2013‐2014
8
Grado en Ingeniería Informática
Grado en Ingeniería del Software
Grado en Ingeniería de Computadores
Facultad de Informática
Luis Hernández Yáñez
Universidad Complutense
Programas multiarchivo y compilación separada
Interfaz frente a implementación
Uso de módulos de biblioteca
Ejemplo: Gestión de una tabla de datos ordenada I
Compilación de programas multiarchivo
El preprocesador
Cada cosa en su módulo
Ejemplo: Gestión de una tabla de datos ordenada II
El problema de las inclusiones múltiples
Compilación condicional
Protección frente a inclusiones múltiples
Ejemplo: Gestión de una tabla de datos ordenada III
Implementaciones alternativas
Espacios de nombres
Implementaciones alternativas
Calidad y reutilización del software
2
7
13
12
22
24
26
27
33
38
39
40
48
52
61
72
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Fundamentos de la programación: Programación modular
Página 1
1
10/04/2014
Fundamentos de la programación: Programación modular
Página 2
Programas multiarchivo
El código fuente del programa se reparte entre varios archivos (módulos) ,
cada uno con las declaraciones y los subprogramas que tienen relación.
Módulos: archivos de código fuente con declaraciones y subprogramas
de una unidad funcional: una estructura de datos, un conjunto de utilidades, ...
ListaLista
Archivos
Archivos
Principal
Principal
Cálculos
Cálculos
const int N = 10;
typedef double tArray[N];
typedef struct {
tArray elem;
int cont;
} tLista;
void init(tLista&);
bool insert(tLista&, double);
bool delete(tLista&, int);
int size(tLista);
void sort(tLista&);
bool cargar(tLista&, string);
bool guardar(tLista, string);
bool mezclar(string, string);
int size(string);
bool exportar(string);
int main() {
tLista lista;
init(lista);
cargar(lista, "bd.txt");
sort(lista);
double dato;
cout << "Dato: ";
cin >> dato;
insert(lista, dato);
cout << min(lista) << endl;
cout << max(lista) << endl;
cout << sum(lista) << endl;
guardar(lista, "bd.txt");
double mean(tLista);
double min(tLista);
double max(tLista);
double desv(tLista);
int minIndex(tLista);
int maxIndex(tLista);
double sum(tLista);
return 0;
}
Ejecutable
Ejecutable
Fundamentos de la programación: Programación modular
Página 3
2
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
10/04/2014
Compilación separada
Cada módulo se compila a código fuente de forma independiente:
ListaLista
Lista.obj
Lista.obj
const int N = 10;
typedef double tArray[N];
typedef struct {
tArray elem;
int cont;
} tLista;
void init(tLista&);
bool insert(tLista&, double);
bool delete(tLista&, int);
void sort(tLista&);
int size(tLista);
Cálculos
Cálculos
double mean(tLista);
double min(tLista);
double max(tLista);
double desv(tLista);
int minIndex(tLista);
int maxIndex(tLista);
double sum(tLista);
...
Archivos
Archivos
bool cargar(tLista&, string);
bool guardar(tLista, string);
bool mezclar(string, string);
int size(string);
bool exportar(string);
...
Archivos.obj
Archivos.obj
11101010110010100100101010010
10100101010111110101010001010
01010101010100101010101010110
01010101010101010101010010101
01010101000001010101011010100
10101010101010000101010111100
10101010101111001100101010110
10101010100100101010011110010
10101010010101001010100101010
01010101001010000100111101001
01010110010101010010101001010
10101010100101010010101010100
00101010111001010100101000111
01010111010011010101001010101
11111101010110011010101110000
10010101001010101010101101111
00101110101011001010010010101
00101010010101011111010101000
10100101010101010010101010101
01100101010101010101010101001
01010101010100000101010101101
01001010101010101000010101011
11001010101010111100110010101
01101010101010010010101001111
00101010101001010100101010010
10100101010100101000010011110
10010101011001010101001010100
10101010101010010101001010101
01000010101011100101010010100
01110101011101001101010100101
01011111110101011001101010111
00001001010100101010101010110
Calculos.obj
Calculos.obj
01011001010010010101001010100
10101011111010101000101001010
10101010010101010101011001010
10101010101010101001010101010
10100000101010101101010010101
01010101000010101011110010101
01010111100110010101011010101
01010010010101001111001010101
01001010100101010010101001010
10100101000010011110100101010
11001010101001010100101010101
01010010101001010101010000101
01011100101010010100011101010
11101001101010100101010111111
10101011001101010111000010010
10100101010101010110001111010
Fundamentos de la programación: Programación modular
Página 4
Compilación separada
Al compilar el programa principal, se adjuntan los módulos compilados:
Bibliotecas del sistema
Módulos del programa
Módulos del programa
Bibliotecas del sistema
Principal
Principal
int main() {
tLista lista;
init(lista);
cargar(lista, "bd.txt");
sort(lista);
double dato;
cout << "Dato: ";
cin >> dato;
insert(lista, dato);
cout << min(lista) << endl;
cout << max(lista) << endl;
cout << sum(lista) << endl;
guardar(lista, "bd.txt");
return 0;
}
Ejecutable
Ejecutable
Lista.obj
Calculos.obj
Archivos.obj
......
iostream.obj
fstream.obj
math.obj
......
Fundamentos de la programación: Programación modular
Página 5
3
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
10/04/2014
Compilación separada
¡Sólo los archivos de código fuente modificados necesitan ser recompilados!
COMPILACIÓN
COMPILACIÓN
iostream.obj
fstream.obj
math.obj
......
ENLACE
ENLACE
Principal
Principal
Lista.cpp
main.cpp
Lista.obj
Calculos.obj
Archivos.obj
......
main.obj
Ejecutable
Ejecutable
Fundamentos de la programación: Programación modular
Página 6
Fundamentos de la programación: Programación modular
Página 7
4
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Creación de módulos de biblioteca
En el código de un programa de un único archivo tenemos:
Definiciones de constantes.
Declaraciones de tipos de datos.
[Quizás, variables globales. Mejor evitar tener variables globales.]
Prototipos de los subprogramas.
Implementación de los subprogramas.
Implementación de la función main().
Las constantes, tipos [, variables] y prototipos de subprogramas que tienen
que ver con alguna unidad funcional indican cómo se usaésta: interfaz.
Estructura de datos con los subprogramas que la gestionan.
Conjunto de utilidades (subprogramas) de uso general.
Etcétera.
La implementación de los subprogramas es eso, implementación.
Fundamentos de la programación: Programación modular
Página 8
Creación de módulos de biblioteca
Interfaz: Definiciones y declaraciones de datos y subprogramas (prototipos).
¡Es todo lo que el usuario de esa unidad funcional necesita saber!
Implementación: Código de los subprogramas que hacen el trabajo.
No necesita conocerse para utilizarlo: ¡Se da por sentado que es correcto!
Separamos la interfaz y la implementación en dos archivos separados:
Archivo de cabecera: Definiciones y declaraciones de datos y subprogramas.
Archivo de implementación: Implementación de los subprogramas.
Archivos de cabecera: extensión .h
Mismo nombre (x.h/ x.cpp)
Mismo nombre (x.h/ x.cpp)
Archivos de implementación: extensión .cpp
Extraemos las definiciones y declaraciones de datos y subprogramas
de la unidad funcional y las colocamos en un archivo de cabecera.
Extraemos las implementaciones de esos subprogramas y los colocamos
en el archivo de implementación de ese archivo de cabecera.
Fundamentos de la programación: Programación modular
Página 9
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
10/04/2014
5
10/04/2014
Interfazfrente a implementación
Creación de módulos de biblioteca
void init(tLista&);
lista.cont = 0;
}
tArray elem;
int cont;
} tLista;
void init(tLista& lista) {
bool delete(tLista&, int);
bool insert(tLista&, double);
Lista.h
Lista.h
Lista.cpp
Lista.cpp
bool insert(tLista& lista,
double valor) {
const int N = 10;
typedef double tArray[N];
typedef struct {
Módulo
Módulo
Unidad
Unidad
Biblioteca
Biblioteca
Si otro módulo (o el programa principal) quiere usar algo de esa biblioteca:
Deberá incluir el archivo de cabecera.
Los nombres de archivos de cabecera
Los nombres de archivos de cabecera
propios (no del sistema) se encierran
propios (no del sistema) se encierran
entre dobles comillas, no entre ángulos.
entre dobles comillas, no entre ángulos.
#include "Lista.h"
...
main.cpp
main.cpp
if (lista.cont == N)
return false;
lista.elem[lista.cont] =
else {
valor;
}
}
int size(tLista);
void sort(tLista&);
#include "Lista.h"
lista.cont++;
Fundamentos de la programación: Programación modular
Página 10
Lista.h
Lista.h
const int N = 10;
typedef double tArray[N];
typedef struct {
tArray elem;
int cont;
} tLista;
void init(tLista&);
bool insert(tLista&, double);
bool delete(tLista&, int);
int size(tLista);
void sort(tLista&);
Creación de módulos de biblioteca
Interfaz
El archivo de cabecera (.h) tiene todo lo que necesita
conocer cualquier otro módulo (o programa principal)
que quiera utilizar los servicios (subprogramas)
de ese módulo de biblioteca.
La directiva #includeañade las declaraciones del archivo
de cabecera en el código del módulo (preprocesamiento):
Preprocesador
Preprocesador
Es todo lo que se necesita saber para
comprobar si el código de main.cpp
hace un uso correcto de la lista
(declaraciones y llamadas a funciones).
#include "Lista.h"
...
main.cpp
main.cpp
main.cpp
main.cpp
tArray elem;
int cont;
const int N = 10;
typedef double tArray[N];
typedef struct {
} tLista;
void init(tLista&);
bool insert(tLista&, double);
bool delete(tLista&, int);
int size(tLista);
...
Fundamentos de la programación: Programación modular
Página 11
6
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
10/04/2014
Lista.cpp
Lista.cpp
#include "Lista.h"
void init(tL
Comentarios de: Programación Modular - Fundamentos de la programación (0)
No hay comentarios