Clase 4
Clase 4
PROGRAMACIÓN MODULAR
La programación modular es uno de los métodos de diseño más flexibles y potentes para
mejorar la productividad de un programa. En programación modular el programa se divide en
módulos (partes independientes), cada uno de los cuales ejecuta una única actividad o tarea
y se codifican independientemente de otros módulos.
Cada uno de estos módulos se analiza, codifica y pone a punto por separado. Cada programa
contiene un módulo denominado programa principal que controla todo lo que sucede; se
transfiere el control a submódulos (posteriormente se denominará subprogramas), de modo
que ellos puedan ejecutar sus funciones; sin embargo, cada submódulo devuelve el control
al módulo principal cuando se haya completado su tarea. Si la tarea asignada a cada
submódulo es demasiado compleja, éste deberá romperse en otros módulos más pequeños.
El proceso sucesivo de subdivisión de módulos continúa hasta que cada módulo tenga
solamente una tarea específica que ejecutar. Esta tarea puede ser entrada, salida,
manipulación de datos, control de otros módulos o alguna combinación de éstos. Un módulo
puede transferir temporalmente (bifurcar) el control a otro módulo; sin embargo, cada módulo
debe eventualmente devolver el control al módulo del cual se recibe originalmente el control.
Los módulos son independientes en el sentido en que ningún módulo puede tener acceso
directo a cualquier otro módulo excepto el módulo al que llama y sus propios submódulos. Sin
embargo, los resultados producidos por un módulo pueden ser utilizados por cualquier otro
módulo cuando se transfiera a ellos el control.
Dado que los módulos son independientes, diferentes programadores pueden trabajar
simultáneamente en diferentes partes del mismo programa. Esto reducirá el tiempo del diseño
del algoritmo y posterior codificación del programa.
Además, un módulo se puede modificar radicalmente sin afectar a otros módulos, incluso sin
alterar su función principal. La descomposición de un programa en módulos independientes
más simples se conoce también como el método de divide y vencerás (divide and conquer).
Cada módulo se diseña con independencia de los demás, y siguiendo un método ascendente
o descendente se llegará hasta la descomposición final del problema en módulos en forma
jerárquica.
Con el paso de los años, la idea de romper el programa en funciones fue evolucionando y se
llegó al agrupamiento de las funciones en otras unidades más grandes llamadas módulos
(normalmente, en el caso de C, denominadas archivos o ficheros); sin embargo, el principio
seguía siendo el mismo: agrupar componentes que ejecutan listas de instrucciones
(sentencias).
Esta característica hace que a medida que los programas se hacen más grandes y complejos,
el paradigma estructurado comienza a dar señales de debilidad y resultando muy difícil
terminar los programas de un modo eficiente. Existen varias razones de la debilidad de los
programas estructurados para resolver problemas complejos. Tal vez las dos razones más
evidentes son éstas. Primero, las funciones tienen acceso ilimitado a los datos globales.
Segundo, las funciones inconexas y datos, fundamentos del paradigma procedimental
proporcionan un modelo pobre del mundo real.
En un programa procedimental, por ejemplo escrito en C, existen dos tipos de datos. Datos
locales que están ocultos en el interior de la función y son utilizados, exclusivamente, por la
función. Estos datos locales están estrechamente relacionados con sus funciones y están
protegidos de modificaciones por otras funciones.
Otro tipo de datos son los datos globales a los cuales se puede acceder desde cualquier
función del programa. Es decir, dos o más funciones pueden acceder a los mismos datos
siempre que estos datos sean globales.
Un programa grande (Figura 2.8) se compone de numerosas funciones y datos globales y
ello conlleva una multitud de conexiones entre funciones y datos que dificulta su comprensión
y lectura.
Todas estas conexiones múltiples originan diferentes problemas. En primer lugar, hacen difícil
conceptuar la estructura del programa. En segundo lugar, el programa es difícil de modificar
ya que cambios en datos globales pueden necesitar la reescritura de todas las funciones que
acceden a los mismos. También puede suceder que estas modificaciones
de los datos globales pueden no ser aceptadas por todas o algunas de las funciones.
Los atributos o características de los objetos son, por ejemplo: en las personas, su edad, su
profesión, su domicilio, etc.; en un auto, la potencia, el número de matrícula, el precio, número
de puertas, etc; en una casa, la superficie, el precio, el año de construcción, la dirección, etc.
En realidad, los atributos del mundo real tienen su equivalente en los datos de un programa;
tienen un valor específico, tal como 200 metros cuadrados, 20.000 dólares, cinco puertas,
etc.
El comportamiento es una acción que ejecutan los objetos del mundo real como respuesta a
un determinado estímulo. Si usted pisa los frenos en un auto, el coche (carro) se detiene; si
acelera, el auto aumenta su velocidad, etcétera. El comportamiento, en esencia, es como una
función: se llama a una función para hacer algo (visualizar la nómina de los empleados de
una empresa).
Por estas razones, ni los datos ni las funciones, por sí mismas, modelan los objetos del mundo
real de un modo eficiente.
La programación estructurada mejora la claridad, fiabilidad y facilidad de mantenimiento de
los programas; sin embargo, para programas grandes o a gran escala, presentan retos de
difícil solución.
La idea fundamental de los lenguajes orientados a objetos es combinar en una única unidad
o módulo, tanto los datos como las funciones que operan sobre esos datos. Tal unidad se
llama un objeto. Las funciones de un objeto se llaman funciones miembro en C++ o métodos
(éste es el caso de Smalltalk, uno de los primeros lenguajes orientados a objetos), y son el
único medio para acceder a sus datos.
Los datos están ocultos, de modo que están protegidos de alteraciones accidentales. Los
datos y las funciones se dice que están encapsulados en una única entidad. El
encapsulamiento de datos y la ocultación de los datos son términos clave en la descripción
de lenguajes orientados a objetos.
Si se desea modificar los datos de un objeto, se conoce exactamente cuáles son las funciones
que interactúan con miembros del objeto. Ninguna otra función puede acceder a los datos.
Esto simplifica la escritura, depuración y mantenimiento de un programa.
Propiedades fundamentales de la orientación a objetos
Abstracción
La abstracción es la propiedad de los objetos que consiste en tener en cuenta sólo los
aspectos más importantes desde un punto de vista determinado y no tener en cuenta los
restantes aspectos. El término abstracción que se suele utilizar en programación se refiere al
hecho de diferenciar entre las propiedades externas de una entidad y los detalles de la
composición interna de dicha entidad.
EJEMPLO 2.3
Diferentes modelos de abstracción del término coche:
• Un coche es la combinación (o composición) de diferentes partes, tales como motor,
carrocería, cuatro ruedas, cinco puertas, etc.
Un objeto:
Cada clase tiene sus propias características y comportamiento; en general, una clase define
los datos que se utilizan y las operaciones que se pueden ejecutar sobre esos datos. Una
clase describe un objeto. En el sentido estricto de programación, una clase es un tipo de
datos. Diferentes variables se pueden crear de este tipo.
En programación orientada a objetos, éstas se llaman instancias. Las instancias son, por
consiguiente, la realización de los objetos descritos en una clase. Estas instancias constan
de datos o atributos descritos en la clase y se pueden manipular con las operaciones definidas
dentro de ellas.
Ejemplos de Objetos:
• Recursos Humanos:
— Empleados.
— Estudiantes.
— Clientes.
— Vendedores.
— Socios.
• Objetos físicos:
— Carros.
— Aviones.
— Trenes.
— Barcos.
— Motocicletas.
— Casas.
• Colecciones de datos:
— Arrays (arreglos).
— Listas.
— Pilas.
— Árboles.
— Árboles binarios.
— Grafos.
Clases
En POO los objetos son miembros de clases. En esencia, una clase es un tipo de datos al
igual que cualquier otro tipo de dato definido en un lenguaje de programación. La diferencia
reside en que la clase es un tipo de dato que contiene datos y funciones. Una clase contiene
muchos objetos y es preciso definirla, aunque su definición no implica creación de objetos.
Una clase es, por consiguiente, una descripción de un número de objetos similares. Madonna,
Sting, Prince, Juanes, Carlos Vives o Juan Luis Guerra son miembros u objetos de la clase
"músicos". Un objeto concreto, Juanes o Carlos Vives, son instancias de la clase "músicos".
Una clase es una descripción general de un conjunto de objetos similares. Por definición
todos los objetos de una clase comparten los mismos atributos (datos) y las mismas
operaciones (métodos). Una clase encapsula las abstracciones
de datos y operaciones necesarias para describir una entidad u objeto del mundo real.
El proceso inverso de la generalización por el cual se definen nuevas clases a partir de otras
ya existentes se denomina especialización. En orientación a objetos, el mecanismo que
implementa la propiedad de generalización se denomina herencia.
La herencia permite definir nuevas clases a partir de otras clases ya existentes, de modo
que presentan las mismas características y comportamiento de éstas, así como otras
adicionales.
La idea de clases conduce a la idea de herencia. Clases diferentes se pueden conectar
unas con otras de modo jerárquico. Como ya se ha comentado anteriormente con las
relaciones de generalización y especialización, en nuestras
vidas diarias se utiliza el concepto de clases divididas en subclases. La clase animal
se divide en anfibios, mamíferos, insectos, pájaros, etc., y la clase vehículo en carros,
motos, camiones, buses, etc.
Reusabilidad
Una vez que una clase ha sido escrita, creada y depurada, se puede distribuir a otros
programadores para utilizar en sus propios programas. Esta propiedad se llama reusabilidad
o reutilización. Su concepto es similar a las funciones incluidas en las bibliotecas de funciones
de un lenguaje procedimental como C que se pueden incorporar en diferentes programas.
Polimorfismo
Así, por ejemplo, la operación de abrir se puede dar en diferentes clases: abrir una puerta,
abrir una ventana, abrir un periódico, abrir un archivo, abrir una cuenta corriente en un banco,
abrir un libro, etc. En cada caso se ejecuta una operación diferente, aunque tiene el mismo
nombre en todos ellos “abrir”. El polimorfismo es la propiedad de una operación de ser
interpretada sólo por el objeto al que pertenece.