0% encontró este documento útil (0 votos)
60 vistas9 páginas

Clase 4

El documento describe los conceptos de programación modular y orientada a objetos. La programación modular involucra dividir un programa en módulos independientes, cada uno con una tarea específica. La programación orientada a objetos mejora este enfoque al combinar datos y funciones en objetos, donde los datos están ocultos y solo pueden accederse a través de métodos. Esto simplifica el desarrollo de software al modelar objetos del mundo real.

Cargado por

Hugo Cabrera
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
60 vistas9 páginas

Clase 4

El documento describe los conceptos de programación modular y orientada a objetos. La programación modular involucra dividir un programa en módulos independientes, cada uno con una tarea específica. La programación orientada a objetos mejora este enfoque al combinar datos y funciones en objetos, donde los datos están ocultos y solo pueden accederse a través de métodos. Esto simplifica el desarrollo de software al modelar objetos del mundo real.

Cargado por

Hugo Cabrera
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 9

ALGORITMO Y LENGUAJE DE PROGRAMACIÓN

LIC. HUGO A. CABRERA

PROGRAMACIÓN ORIENTADO A OBJETO (POO)

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.

Datos locales y datos globales

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.

Modelado del mundo real

Un segundo problema importante de la programación estructurada reside en el hecho de que


la disposición separada de datos y funciones no se corresponden con los modelos de las
cosas del mundo real. En el mundo físico se trata con objetos físicos tales como personas,
autos o aviones. Estos objetos no son como los datos ni como las funciones.

Los objetos complejos o no del mundo real tienen atributos y comportamiento:

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.

PROGRAMACIÓN ORIENTADA A OBJETOS (POO)

La programación orientada a objetos, tal vez el paradigma de programación más utilizado en


el mundo del desarrollo de software y de la ingeniería de software del siglo XXI, trae un nuevo
enfoque a los retos que se plantean en la programación estructurada cuando los problemas
a resolver son complejos. Al contrario que la programación procedimental que enfatiza en los
algoritmos, la POO enfatiza en los datos.

En lugar de intentar ajustar un problema al enfoque procedimental de un lenguaje, POO


intenta ajustar el lenguaje al problema. La idea es diseñar formatos de datos que se
correspondan con las características esenciales de un problema.

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 de un objeto, se conocen también como atributos o variables de instancia. Si se


desea leer datos de un objeto, se llama a una función miembro del objeto. Se accede a los
datos y se devuelve un valor. No se puede acceder a los datos directamente.

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

Existen diversas características ligadas a la orientación a objetos. Todas las


propiedades que se suelen considerar no son exclusivas de este paradigma, ya que
pueden existir en otros paradigmas, pero en su conjunto definen claramente los
lenguajes orientados a objetos. Estas propiedades son:
● Abstracción (tipos abstractos de datos y clases).
● Encapsulado de datos.
● Ocultación de datos.
● Herencia.
● Polimorfismo.

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 coche es un concepto común para diferentes tipos de coches. Pueden clasificarse


por el nombre del fabricante (Audi, BMW, SEAT, Toyota, Chrisler...), por su categoría
(turismo, deportivo, todoterreno...), por el carburante que utilizan (gasolina, gasoil,
gas, híbrido...).

La abstracción, el coche se utilizará siempre que la marca, la categoría o el carburante no


sean significativos. Así, un carro (coche) se utilizará para transportar personas o ir de
Carchelejo a Cazorla.

Encapsulación y ocultación de datos


El encapsulado o encapsulación de datos es el proceso de agrupar datos y operaciones
relacionadas bajo la misma unidad de programación. En el caso de los objetos que poseen
las mismas características y comportamiento se agrupan en clases, que no son más que
unidades o módulos de programación que encapsulan datos y operaciones.

La ocultación de datos permite separar el aspecto de un componente, definido por su interfaz


con el exterior, de sus detalles internos de implementación. Los términos ocultación de la
información (information hiding) y encapsulación de datos (data encapsulation) se suelen
utilizar como sinónimos, pero no siempre es así, y muy al contrario, son términos similares
pero distintos. Normalmente, los datos internos están protegidos del exterior y no se puede
acceder a ellos más que desde su propio interior y por tanto, no están ocultos. El acceso al
objeto está restringido sólo a través de una interfaz bien definida.

El diseño de un programa orientado a objetos contiene, al menos, los siguientes pasos:


● Identificar los objetos del sistema.
● Agrupar en clases a todos objetos que tengan características y comportamiento
comunes.
● Identificar los datos y operaciones de cada una de las clases.
● Identificar las relaciones que pueden existir entre las clases.

Un objeto:

Es un elemento individual con su propia identidad; por ejemplo, un libro, un automóvil...


Una clase puede describir las propiedades genéricas de un ejecutivo de una empresa
(nombre, título, salario, cargo...) mientras que un objeto representará a un ejecutivo
específico (Luis Mackoy, director general). En general, una clase define qué datos se
utilizan para representar un objeto y las operaciones que se pueden ejecutar sobre
esos datos.

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.

Los términos objeto e instancia se utilizan frecuentemente como sinónimos (especialmente


en C++). Si una variable de tipo Carro se declara, se crea un objeto Carro (una instancia de
la clase Carro).

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.

Generalización y especialización: Herencia

La generalización es la propiedad que permite compartir información entre dos entidades


evitando la redundancia. En el comportamiento de objetos existen con frecuencia propiedades
que son comunes en diferentes objetos y esta propiedad se denomina generalización.

Por ejemplo, máquinas lavadoras, frigoríficos, hornos de microondas, tostadoras, lavavajillas,


etc., son todos electrodomésticos (aparatos del hogar). En el mundo de la orientación a
objetos, cada uno de estos aparatos es una sub de la clase y a su vez es una de todas las
otras clase Electrodoméstico Electrodoméstico superclase clases (máquinas lavadoras,
frigoríficos, hornos de microondas, tostadoras, lavavajillas).

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.

La herencia proporciona una extensión o ampliación al concepto de reusabilidad. Un


programador puede considerar una clase existente y sin modificarla, añadir competencias y
propiedades adicionales a ella. Esto se consigue derivando una nueva clase de una ya
existente. La nueva clase heredará las características de la clase antigua, pero es libre de
añadir nuevas características propias.

La facilidad de reutilizar o reusar el software existente es uno de los grandes beneficios de la


POO: muchas empresas consiguen con la reutilización de clase en nuevos proyectos la
reducción de los costes de inversión en sus presupuestos de programación.
¿En esencia cuáles son las ventajas de la herencia? Primero, se utiliza para dar
consistencia y reducir código. Las propiedades comunes de varias clases sólo necesitan ser
implementadas una vez y sólo necesitan modificarse una vez si es necesario. La otra ventaja
es que el concepto de abstracción de la funcionalidad común está soportado.

Polimorfismo

Además de las ventajas de consistencia y reducción de código, la herencia aporta


también otra gran ventaja: facilitar el polimorfismo. Polimorfismo es la propiedad de que un
operador o una función actúen de modo diferente en función del objeto sobre el que se
aplican. En la práctica, el polimorfismo significa la capacidad de una operación de ser
interpretada sólo por el propio objeto que lo invoca. Desde un punto de vista práctico
de ejecución del programa, el polimorfismo se realiza en tiempo de ejecución ya que
durante la compilación no se conoce qué tipo de objeto y por consiguiente qué
operación ha sido llamada.
La propiedad de polimorfismo es aquella en que una operación tiene el mismo nombre
en diferentes clases, pero se ejecuta de diferentes formas en cada clase.

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.

También podría gustarte