Sie sind auf Seite 1von 8

Programación III

Capitulo I – Introducción a la programación orientada a objetos

Capítulo 1: Introducción a la Programación


Orientada a Objetos
Introducción
En este capítulo se comenzará examinando un poco de la historia del proceso de programación y
su evolución con el objetivo de deducir qué es y porqué es importante estudiar este nuevo enfoque
de la programación, conocida como programación orientada a objetos.

Un software de calidad es aquel que cumple con determinados factores de calidad, siendo los más
destacables:

• Mantenibilidad :
Es la facilidad con la cual un producto de software puede ser adaptado a cambios.

• Extensibilidad :
Es la facilidad con la cual a un producto de software se le pueden incorporar
extensiones a efectos de contemplar nuevos requerimientos.

• Reusabilidad :
Es la capacidad de un producto de software de ser reusado, total o parcialmente,
en una nueva aplicación.

• Compatibilidad :
Es la facilidad con la cual un producto de software puede ser combinado con otros.

Con el paso del tiempo, los distintos lenguajes de programación han ido evolucionando, con el
objetivo de proveer herramientas que permitan a los desarrolladores más facilidades para contribuir
al cumplimiento de estos factores de calidad a la hora de construir piezas de software.

Veremos a continuación un repaso (simplificado) de la evolución en la historia de la programación.

Programación Lineal
Los primeros lenguajes de programación se diseñaron para desarrollar programas que realizaban
tareas relativamente simples. La mayoría de estos programas eran cortos, menos de 100 líneas de
código fuente. En este sentido, hablamos de programas lineales o lenguajes de programación
lineal.

A medida que aumentaba la potencia de las computadoras, se requerían programas cada vez más
complejos y los lenguajes de programación eran inadecuados para esas tareas de programación.
Las primeras versiones de BASIC, COBOL, FORTRAN, no tenían facilidades para reutilizar el
código de programas existentes, cada vez más se duplicaban segmentos de código en los
programas. Los programas se ejecutaban en secuencias lógicas y el control del programa se hacía
difícil. Como consecuencia, la lógica de los programas resultaba muy difícil de comprender. De a
poco fue surgiendo entonces la necesidad de particionar estos programas en bloques de código
más pequeños y reutilizables.

Además los lenguajes lineales no tenían capacidad de controlar el alcance de los datos, todos los

1
Material de uso exclusivo para el curso de Programación III dictado por INET
Programación III
Capitulo I – Introducción a la programación orientada a objetos

datos eran globales y podían ser modificados por cualquier parte del programa. En consecuencia
cualquier modificación en el código podía afectar a todo el programa.

Programación Estructurada
La solución a los problemas planteados en la programación lineal parecía ser evidentemente dividir
los programas grandes y complejos en componentes más pequeños (módulos). Estos podían ser
construidos independientemente, para luego combinarlos en un sistema completo.

Esta técnica general llamada modularización es el concepto que más ha influido en la


construcción de programas durante muchos años.

El soporte más elemental para la programación modular es el subprograma. Un subprograma es


una secuencia de instrucciones que realiza una tarea determinada y al que se le da un nombre
independiente. Una vez definido se puede ejecutar simplemente invocándolo en el programa cada
vez que se necesite y pasándole los parámetros que sean necesarios. Tradicionalmente, los
subprogramas toman la forma de procedimientos o funciones.

Aunque los subprogramas proporcionan el mecanismo básico de la programación modular, se


necesitan ciertos principios para crear software bien estructurado.

Los programas estructurados se organizan de acuerdo a las operaciones que ellos ejecutan. El
programa se descompone en funciones y procedimientos, la comunicación entre los diferentes
subprogramas que forman un sistema se realiza mediante parámetros y cada subprograma puede
tener datos locales a los que no se puede acceder desde fuera del ámbito del mismo.

Aislando los procesos dentro de subprogramas, un programa estructurado minimiza el riesgo de


que un subprograma afecte a otro. También se facilita la detección de errores, y hace más claro el
programa. Se logran dos objetivos: mejorar la fiabilidad y el mantenimiento de los sistemas.

La programación estructurada introduce un concepto muy importante: la abstracción.

La abstracción se puede definir como la capacidad de examinar algo sin preocuparse de los
detalles internos. En un programa estructurado, es suficiente conocer que un subprograma dado
realiza una tarea específica, el cómo se realiza la tarea no es importante, mientras el proceso sea
fiable, no es necesario conocer cómo funciona su interior. Esto se conoce como abstracción
funcional o procedimental y es el núcleo de la programación estructurada.

Existe también un nivel de abstracción para los datos. La abstracción de datos se puede definir
como la extracción de las propiedades esenciales de un concepto. Con esta abstracción, pueden
modelarse problemas y definir a gran escala los principales componentes de su solución sin
necesidad de conocer detalles concretos de su implementación. Tales detalles, así como las
estructuras de datos utilizadas para su resolución pueden dejarse para una etapa posterior.

Los Tipos Abstractos de Datos (T.A.D) constituyen un claro ejemplo de abstracción, tanto
funcional y procedimental, como a nivel de datos.

La abstracción y la modularización son dos conceptos que van de la mano. Si bien no existe una
definición precisa de lo que significa modularizar, podríamos tomar como definición el acto de
construir programas mediante la unión de pequeños componentes de código. En realidad lo que
interesa es tener una metodología de construcción de software modular más que obtener una
definición. Es importante que los módulos se definan y construyan siguiendo criterios de buena y
correcta modularización.

2
Material de uso exclusivo para el curso de Programación III dictado por INET
Programación III
Capitulo I – Introducción a la programación orientada a objetos

A la hora de modularizar, existen diversas categorías de módulos posibles que se pueden


construir, entre las que se destacan las siguientes:

1. Bibliotecas:

Son módulos que contienen un conjunto de operaciones de propósito general aplicables a


múltiples aplicaciones. Ejemplos típicos se esta categoría de módulos son las bibliotecas de
operaciones matemáticas, gráficas, de manejo de E/S, etc. Típicamente los módulos
pertenecientes a esta categoría suelen venir predefinidos con los lenguajes de programación.

2. Pools de datos:

A veces es necesario que muchos módulos compartan datos, por lo tanto estos datos se
pueden agrupar en un solo módulo que será usado por los módulos que los necesiten. Un
ejemplo típico es el de un módulo en el cual se mantienen todas las constantes simbólicas de
un sistema.

3. Tipos abstractos de datos:

Un módulo tipo abstracto de datos es un módulo que exporta un tipo de datos junto con las
operaciones necesarias para acceder y manipular objetos del tipo, ocultando la estructura de
datos usada para la representación del tipo y los algoritmos usados para implementar las
operaciones.

El hecho de exportar el tipo, permite declarar variables del tipo, además ocultar la
representación del tipo, implica que las variables de ese tipo pueden ser manipuladas
únicamente mediante las operaciones exportadas por el módulo, dado que estas son las únicas
que conocen la representación del tipo.

Programación Orientada a Objetos


La Programación Orientada a Objetos no es en realidad un concepto nuevo, sino que ha sido el
reflejo de la evolución en el desarrollo de técnicas de programación desde principios de la década
de los setenta. En cierto sentido, constituye el siguiente nivel de evolución con respecto a la
Programación Estructurada.

Formalmente, se define como una técnica o estilo de programación que utiliza objetos como bloque
esencial de construcción de software. Los lenguajes de programación Orientados a Objetos
pretenden construir programas basándose en los objetos presentes en la realidad correspondiente
al programa que se desea construir. Por esa razón es que permiten crear en la computadora
representaciones de esos objetos de la realidad.

Objetos
Un Objeto es una "cosa", real o imaginaria, física o intangible, viva o inerte que existe enmarcado
en alguna realidad. Estamos rodeados por objetos, las personas que nos rodean son objetos, los
muebles de nuestra casa son objetos e incluso en alguna realidad emocional podemos decir que
cosas como los pensamientos o los sentimientos son objetos. Un objeto puede, por tanto, ser algo
conceptual o algo físico. La idea fundamental es que un objeto es una entidad (o noción) única. Cada
objeto es una individualidad, que puede estar relacionado o constituido por otros objetos.

3
Material de uso exclusivo para el curso de Programación III dictado por INET
Programación III
Capitulo I – Introducción a la programación orientada a objetos

Dentro del paradigma de la Orientación a Objetos, se entiende que, desde un punto de vista
conceptual, los objetos se componen de dos elementos denominados atributos y métodos. Los
primeros son aquellos datos del objeto con los cuales interese trabajar dentro de una determinada
realidad, mientras que los segundos son las acciones u operaciones que trabajan sobre el objeto.

Por ejemplo, si consideramos a una cuenta bancaria como un objeto, sus atributos de interés
podrían ser su número, la cédula de su dueño y el monto de dinero que almacena, mientras que
sus métodos podrían ser las operaciones de depósito, retiro y consulta.

Desde un punto de vista más formal, un objeto es en realidad un elemento perteneciente a un


determinado Tipo Abstracto de Datos. Al igual que en la Programación Estructurada, se trata de
una entidad que se puede representar mediante una estructura de datos oculta, y sobre la cual
interesa realizar diferentes operaciones.
Para el ejemplo de la cuenta bancaria, su representación interna puede quedar oculta en la medida
que se interaccione con ella únicamente a través de sus operaciones (depositar, retirar o
consultar). Surge entonces una analogía entre las nociones de objeto y de elemento perteneciente
a un T.A.D. Los atributos del objeto juegan el rol de la representación privada del T.A.D, mientras
que los métodos juegan el rol de las operaciones (procedimientos y funciones) aplicables sobre el
objeto.

A diferencia de la Programación Estructurada, los objetos en la Programación Orientada a Objetos


combinan en una sola entidad datos (atributos) y comportamiento (métodos), mientras que en los
T.A.D los datos se tratan separadamente de las operaciones que se realizan sobre ellos. A medida
que el curso avance se irán viendo mecanismos por los cuales los lenguajes Orientados a Objetos
logran realizar esta combinación de ambos aspectos en una sola entidad.

Clases de Objetos
Al igual que el concepto de Objeto, el concepto de Clase de Objetos es igualmente distintivo de
este paradigma de programación, y ambos representan los dos conceptos fundamentales de esta
nueva forma de programación.

Desde un punto de vista conceptual, diremos que una Clase es una plantilla o molde imaginario
que sirve para definir objetos. Decimos que los objetos de una clase son instancias de la misma.
Podemos hacer la siguiente analogía: La clase es como el plano de un edificio, mientras que los
objetos son todos los edificios concretos que yo puedo construir con ese plano.

Por ejemplo, Juan Pérez y Ana González son objetos que tienen en común el hecho de que son
personas. AX-147 y BZ-233 son objetos que tienen en común el hecho de que son cuentas
bancarias. Tomando en cuenta lo anterior, podemos decir que los objetos se agrupan lógicamente
en clases. Una clase es algo así como la idea que yo tengo en mi mente de cómo son las
características de esos objetos que se agrupan lógicamente.

Por otra parte, no podemos dejar de mencionar una característica muy importante de los objetos:
poseen identidad. Es decir, si bien los objetos de una clase tienen todos las mismas
características, cada uno de ellos es una entidad única y diferenciable de los demás. Por ejemplo,
los datos que me puede interesar considerar en una determinada realidad para los objetos de la
clase persona son su cédula, nombre y domicilio. Todos los objetos de la clase tendrán una cédula,
un nombre y un domicilio. No obstante, cada objeto de la clase persona será único, porque los
valores que tomen esos datos para cada objeto en concreto nunca serán todos los mismos.

4
Material de uso exclusivo para el curso de Programación III dictado por INET
Programación III
Capitulo I – Introducción a la programación orientada a objetos

La existencia de clases de objetos es una característica sumamente útil y necesaria a la hora de


escribir programas Orientados a Objetos, ya que nos permite manipular con facilidad grandes
grupos de Objetos. Sería muy difícil tener que programar cada Objeto por separado.

Desde un punto de vista más formal, una clase es en realidad un Tipo Abstracto de Datos. Los
objetos pertenecientes a la clase serán luego instancias de la misma, elementos pertenecientes al
T.A.D. La representación interna del Tipo Abstracto se corresponde con los atributos de la clase
mientras que las operaciones del Tipo Abstracto se corresponde con los métodos de la clase.

Una clase es pues, un tipo de datos definido por el programador, que determina las estructuras de
datos y las operaciones asociadas con ese tipo. Cada clase es un modelo que describe un infinito
conjunto de objetos del mismo tipo. Cada vez que se construye un objeto de una clase, se crea una
instancia de esa clase. Cada instancia u objeto de una clase tiene su propio valor para cada uno
de sus atributos pero comparte los mismos métodos que todos los otros objetos de la misma clase.

Conceptos distintivos de la Programación Orientada a Objetos


Además de los conceptos de Objeto y Clase, que definen a este nuevo paradigma de
programación, los siguientes conceptos son particularmente distintivos del mismo. Algunos de ellos
son heredados de la Programación Estructurada, mientras que otros de ellos constituyen
elementos de evolución de este nuevo paradigma con respecto al de la Programación
Estructurada.

1. Abstracción:

Abtraerse significa concentrarse en las características esenciales ignorando detalles específicos


de las mismas y dejando de lado otras características que no interesen. Si no aplicamos este
concepto a la hora de encarar un desarrollo Orientado a Objetos, difícilmente podamos extraer
lo relevante de la realidad y descartar lo demás, ya que estaremos constantemente
preocupados por abarcar todo y considerando hasta el más mínimo detalle.

Por ejemplo, supongamos una realidad referente a un hipódromo y las carreras de caballos que
se corren en él. La primera aplicación que le vamos a dar al concepto de abstracción es
concentrarnos únicamente en los caballos y en las carreras. Dejaremos de lado todos los
demás elementos que existen en el hipódromo. La segunda aplicación del concepto de
abstracción es concentrarnos sólo en los datos que nos interese representar de los caballos: el
nombre, la raza y la velocidad, dejando aparte a todos los demás. La tercera aplicación del
concepto será tratar de entender cuáles son los comportamientos relevantes de los caballos, sin
preocuparnos por cómo se producen internamente. Es decir, nos concentraremos en su
capacidad de correr. En este punto no nos preocuparemos por cómo es que el caballo puede
correr ni en los elementos físicos que permiten que el caballo pueda sincronizar sus piernas y
galopar, simplemente nos interesará el hecho de que puede correr.

2. Encapsulamiento:

Este concepto establece que debemos pensar los datos del objeto como si estuvieran
encapsulados (escondidos) dentro del mismo. Esto nos permite establecer dos visiones para el
objeto: Interna y Externa. La visión interna se concentra en los atributos del objeto y la externa
en sus métodos. La idea es pensar que los atributos están protegidos dentro del objeto y
queremos evitar que cualquiera pueda venir y modificarlos. El acceso a esos datos podrá ser
realizado únicamente a través de los métodos definidos para el objeto.

5
Material de uso exclusivo para el curso de Programación III dictado por INET
Programación III
Capitulo I – Introducción a la programación orientada a objetos

Retomemos el ejemplo de la cuenta bancaria. Sus atributos son su número de cuenta, la cédula
del dueño y el monto que tiene almacenado. Si estos datos estuvieran "a la vista" de todo el
mundo, cualquier persona malintencionada podría modificar monto o cambiar la cédula del
dueño. Por ello, el concepto de encapsulamiento nos dice que debemos proteger a los datos.

Serán los diferentes métodos de la cuenta los que hagan interactuar los atributos con el mundo
exterior en forma controlada. El método de autentificación de la cuenta le va a permitir sólo al
dueño accederla, el método de retiro va a controlar que no se pueda retirar más dinero del que
existe, mientras que el método de depósito va a controlar que no se pueda depositar un monto
menor que cero.

Veremos que los lenguajes orientados a objetos poseen un mecanismo para garantizar el
encapsulamiento. Consiste en etiquetar los atributos (datos) como privados y etiquetar los
métodos (comportamiento) como públicos. Desde fuera del objeto, sólo se podrá acceder a los
métodos y serán estos los encargados de manipular los valores de los atributos, haciendo todos
los chequeos necesarios para preservar la integridad de los mismos.

3. Herencia:

El concepto de Herencia es tal vez de los más distintivos de la Programación Orientada a


Objetos, puesto que no está implementado en ningún otro paradigma de programación.

La Herencia es un mecanismo que permite crear una nueva clase de objetos a partir de otra
clase ya existente. La clase original suele denominarse clase base o superclase, mientras que
la nueva clase suele denominarse clase derivada o subclase. La clase derivada hereda todos
los atributos y métodos que posea su clase base correspondiente y además incorpora otros
nuevos, propios de la clase derivada. Por esta razón es que se dice que la herencia es una
forma de reutilización de código. En la clase derivada no tenemos que programar nuevamente
atributos y métodos heredados, porque la clase los posee automáticamente gracias a la
herencia. Obsérvese que con la herencia reducimos la cantidad de atributos y métodos a definir
para las clases y evitamos repetir atributos y métodos iguales en clases distintas.

Veremos a la hora de implementar que la herencia es también una forma de extensibilidad del
Software, porque para crear clases derivadas de clases ya existentes no hay que modificar en
absoluto la clase base ni compilarla nuevamente. Esto permite ir agregando fácilmente nuevas
clases a nuestro Sistema conforme pasa el tiempo.

La herencia define una relación "ser" entre clases de objetos. Esto significa que todos los
objetos de la clase derivada son también objetos de la clase base. Sin embargo, no
necesariamente todos los objetos de la clase base son también objetos de la clase derivada.
Por ejemplo, tenemos una clase llamada Vehículo con los siguientes atributos: marca, modelo y
matrícula. La clase llamada Automóvil es derivada de Vehículo. La clase tiene como atributos
propios la cantidad de puertas y su kilometraje. O sea que, en total, la clase Automóvil tiene
cinco atributos: los tres que heredó de Vehículo y los dos que son propios de ella. La clase
llamada Camioneta también es derivada de Vehículo. La clase tiene como atributo propio su
capacidad de carga. O sea que, en total, la clase Camioneta tiene cuatro atributos: los tres que
heredó de Vehículo y el que es propio de ella. Nótese que todo Automóvil es un Vehículo, pero
no todo Vehículo es un Automóvil. Por ejemplo, hay Vehículos que son Camionetas.

4. Polimorfismo:

Este concepto es, al igual que el de Herencia, de los más distintivos de la Programación
Orientada a Objetos.

6
Material de uso exclusivo para el curso de Programación III dictado por INET
Programación III
Capitulo I – Introducción a la programación orientada a objetos

La palabra Polimorfismo significa "muchas formas". Desde un punto de vista literal, esta palabra
se refiere a la capacidad de que una misma cosa pueda adoptar diferentes formas. Por ejemplo,
una pelota de plasticina es polimórfica, porque puede adoptar tantas formas como queramos. El
significado dentro de la Orientación a Objetos es bastante parecido al significado literal.

Desde el punto de vista de la Orientación a Objetos, Polimorfismo significa que un mismo


método se puede definir en varias clases pero comportarse de diferente forma dependiendo de
la clase en la cual esté. Dichas clases deben estar relacionadas entre sí mediante herencia. Es
decir, algunas clases deben ser derivadas de otras o bien ser todas derivadas de otra en
común. El concepto de polimorfismo existe solamente vinculado a la herencia. No existe
polimorfismo cuando las clases no están relacionadas mediante herencia.

El concepto de polimorfismo (al igual que el de herencia) fue creado con el fin de reducir la
cantidad de código a programar y la complejidad del mismo. Cuando vamos a invocar a un
método polimórfico no necesitamos preguntar previamente a qué clase pertenece el método.

Esta propiedad llamada polimorfismo determina automáticamente cuál de todas las versiones
del método debe ejecutarse. Esto reduce bastante la complejidad del código y lo hace más claro
y simple. Vamos a clarificar estas nociones con el siguiente ejemplo.

Supongamos que tenemos una clase llamada Figura. Dicha clase posee como clases derivadas
a las clases Triángulo, Círculo y Cuadrado. Un método (comportamiento) que interesa para
todas las figuras es la operación que calcula su área.

Sabemos que las tres clases mencionadas poseen una operación que calcula su área, pero la
forma en la cual se comporta dicha operación varía de una clase a otra. En la clase Triángulo es
(Base * Altura) / 2, en la clase Círculo es ( pi * radio)2 y en la clase Cuadrado es (lado * lado).

El método que calcula el área es pues, un método polimórfico. Está en todas las clases cuyos
objetos son figuras, pero se comporta de forma diferente en cada una de ellas.

Imaginemos que nos dan un objeto de la clase Figura pero no nos dicen si se trata de un
triángulo, un círculo o un cuadrado y nos piden calcular su área. En un lenguaje que no fuera
Orientado a Objetos, tendríamos que preguntar nosotros de qué tipo de figura se trata antes de
saber cómo calcularla.

En los lenguajes Orientados a Objetos no tenemos que preguntar nada. Simplemente vamos a
invocar al método que calcula el área del objeto que nos dieron. El polimorfismo se encargará
de determinar automáticamente qué tipo de objeto es (triángulo, círculo o cuadrado) y por lo
tanto cuál de las tres versiones del método que calcula el área debe utilizar.

Metodología Orientada a Objetos


A la hora de modelar sistemas utilizando Programación Orientada a Objetos, seguiremos una
metodología para resolver problemas similar a la metodología orientada a Tipos Abstractos de
Datos. La misma se divide en las siguientes tres etapas.

1. Análisis del sistema.


2. Diseño del sistema.
3. Implementación del sistema en un lenguaje Orientado a Objetos.

1. Análisis del Sistema

7
Material de uso exclusivo para el curso de Programación III dictado por INET
Programación III
Capitulo I – Introducción a la programación orientada a objetos

Esta etapa consiste en determinar cuál es el propósito general del Sistema, qué aspectos abarcará
y que aspectos no abarcará una vez implementado. Partiendo de los requerimientos del sistema
(tareas concretas que se espera que el mismo resuelva), debemos estudiar aquellos aspectos de la
realidad correspondiente que sean relevantes para la resolución de los requerimientos y construir
un Modelo de Análisis que los represente. Esto se hace con el fin de contextualizar hasta dónde
debe abarcar el Sistema y qué cosas no interesan y deben quedar afuera del mismo.

Recordemos que estamos hablando de construir Sistemas Orientados a Objetos. Por lo tanto, la
construcción del modelo de análisis se hace identificando los Objetos presentes en la realidad que
son relevantes y cómo se relacionan entre sí, dejando afuera a todos aquellos que no son de
importancia. En este curso utilizaremos una notación llamada UML para el modelo de análisis.

2. Diseño del Sistema

Esta etapa consiste en traducir el modelo generado durante el análisis en un conjunto de clases y
métodos que permitan implementar el Sistema de forma tal que resuelva los requerimientos que
fueron definidos para el mismo.
Esto significa generar una documentación lo más clara posible de las clases que hay que
programar y de los métodos que hay que implementar en ellas. Para generar dicha documentación,
se usará la notación UML, al igual que en la etapa de análisis.

3. Implementación del Sistema

Esta etapa consiste en partir de la documentación generada en la etapa del diseño e implementar
en un lenguaje de Programación Orientado a Objetos cada una de las Clases especificadas
durante el diseño, definiendo estructuras de datos apropiadas para cada una de ellas, así como los
métodos de cada clase, también especificados durante el diseño.

Existen diversos lenguajes de programación Orientados a Objetos, entre los que se destacan C++
(que será el que utilizaremos en el curso), Java, Delphi, C# o Visual Basic .NET, entre otros. Todos
estos lenguajes proveen mecanismos para implementar Clases y Objetos, además de garantizar el
cumplimiento de los cuatro conceptos fundamentales estudiados (abstracción, encapsulamiento,
herencia y polimorfismo), así como de los cuatro factores de calidad vistos al inicio del capítulo
(mantenibilidad, extensibilidad, reusabilidad, compatibilidad).

8
Material de uso exclusivo para el curso de Programación III dictado por INET

Das könnte Ihnen auch gefallen