Sie sind auf Seite 1von 16

Tecnologa de la programacin

APUNTES DE CLASE

Marco Antonio Gmez Martn


Jorge Gmez Sanz
Departamento de Ingeniera del Software e Inteligencia Articial
Facultad de Informtica
Universidad Complutense de Madrid
Curso 2013-2014

Documento maquetado con TEXiS v.1.0+.

Este documento est preparado para ser imprimido a doble cara.

Tecnologa de la programacin

Apuntes de clase

Grado en Ingeniera de Computadores


Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Doble grado de Matemticas e Ingeniera Informtica

Departamento de Ingeniera del Software e Inteligencia Articial


Facultad de Informtica
Universidad Complutense de Madrid
Curso 2013-2014

c Marco Antonio Gmez Martn, Jorge Gmez Sanz


Copyright

A todos los que la presente


vieren y entendieren

Resumen

S breve en tus razonamientos, que ninguno hay


gustoso si es largo.

Miguel de Cervantes Saavedra (1547-1616)

Este documento contiene las notas de clase utilizadas para la imparticin de la asignatura de Tecnologa de la Programacin en la Facultad de Informtica de la Universidad
Complutense de Madrid.
Su contenido viene a representar un guin de los conceptos que se explican en clase y
que el profesor utiliza a modo de guin de la misma forma en la que se suelen utilizar las

transparencias. Es por esto que de ninguna manera debe entenderse este documento como
completo en el sentido de contener todo el temario que se imparte en la asignatura.

vii

Captulo 1

Introduccin a la programacin
orientada a objetos

Estas mquinas no tienen sentido comn;


todava no han aprendido a pensar, slo hacen
exactamente lo que se les ordena, ni ms ni
menos.

Donald Knuth

Resumen: Este primer captulo presenta una breve introduccin a lo que es la pro-

gramacin orientada a objetos, y muestra un primer y pequeo ejemplo.

1.

Paradigmas de programacin
Un paradigma de programacin es un estilo de programacin que proporciona y de-

termina la

visin que el programador tiene de la ejecucin del programa. De acuerdo al

paradigma escogido para la resolucin de un problema variar el modelo que seguir el


programador para resolverlo. Durante la evolucin de la tecnologa de los sistemas informticos y los lenguajes de programacin han surgido diversos paradigmas de programacin,
los cuales se pueden clasicar en:
Programacin Imperativa

Programacin Funcional

Programacin Orientada a Objetos (POO)

Programacin Lgica
El importante saber que un paradigma de programacin puede ser usado en diversos
lenguajes de programacin, y que los lenguajes de programacin pueden permitir el uso de
uno o ms paradigmas simultneamente (ver Figura 1).
1

Captulo 1. Introduccin a la programacin orientada a objetos

Lenguaje
Java:

Paradigmas que soporta


Imperativo, orientado a objetos

Python y Ruby:

Imperativo, orientado a objetos y funcional

C++:

Imperativo, orientado a objetos y funcional

C#:
Erlang:

Imperativo, orientado a objetos, funcional


Funcional

Perl:

Imperativo, orientado a objetos y funcional

PHP:

Imperativo, orientado a objetos y funcional

JavaScript:

Imperativo, orientado a objetos y funcional

Figura 1: Paradigmas soportados por algunos lenguajes de programacin

1.1. Programacin imperativa


El paradigma de programacin imperativo es el que hemos utilizado hasta ahora y el
que seguiremos utilizando.
En la familia de los lenguajes imperativos, los algoritmos se escriben indicando paso a
paso las instrucciones que la mquina debe ejecutar para resolver un determinado problema.
De esta forma, los programas imperativos son una secuencia nita de instrucciones, las
cuales se ejecutan una tras otra. Los datos utilizados en estos programas se almacenan en
memoria principal y se accede a ellos utilizando

variables. El estado de un programa viene

dado por el valor que en cada instante tiene el conjunto de variables del programa. As la
ejecucin de las instrucciones van modicando el estado del programa de forma incremental
hasta llegar a su estado nal. Los lenguajes de programacin imperativos permiten al
programador crear condiciones (if), bucles (for,

while), asignar valores a variables, etc.

Este modelo de programacin es una traduccin casi directa de las capacidades

hardware

de las mquinas en el que el contenido de la memoria representa el estado del programa, y


las instrucciones mquina son las operaciones.
Entre los lenguajes que utilizan este tipo de programacin podemos destacar Pascal,

programacin
estructurada, la programacin modular y la programacin orientada a objetos.
Ada, Cobol, C, Modula-2 o Fortran. Dentro de esta categora se engloban la

Cada una de estas extensiones o evoluciones han permitido mejorar el mantenimiento y la


calidad de los programas imperativos.

1.2. Programacin estructurada y programacin modular


La programacin estructurada es una forma de escribir programas de manera clara.
Para ello utiliza nicamente tres estructuras de control que pueden ser combinadas para
producir programas. Estas estructuras son:
Secuencia: consiste en la sucesin de dos o ms operaciones.
Seleccin: es la bifurcacin condicional de una o mas operaciones.
Iteracin: consiste en la repeticin de una operacin mientras se cumple una condicin.
El uso de estas estructuras garantizan que los programas tengan exactamente una entrada
y una salida, y quo no existan bucles innitos ni instrucciones que no se ejecutan. Por
esta razn, este modelo de programacin evita el uso de la instruccin o instrucciones
Tecnologa de la Programacin

1. Paradigmas de programacin

de transferencia incondicional como: GOTO, EXIT FUNCTION, EXIT SUB o mltiples


RETURN.
La programacin modular se presenta como una evolucin de la programacin estructurada para solucionar problemas de programacin ms grandes y complejos. Al aplicar la
programacin modular, un problema complejo debe ser dividido en varios subproblemas
ms simples, y estos a su vez en otros subproblemas ms simples. Esto debe hacerse hasta
obtener subproblemas lo sucientemente simples como para poder ser resueltos fcilmente
con algn lenguaje de programacin.
Un mdulo es cada una de las partes de un programa que resuelve uno de los subproblemas en que se divide el problema complejo original y se suele representar mediante
subprogramas. A estos subprogramas (procedimientos y las funciones) se les suele llamar
mdulos, de ah viene el nombre de programacin modular. Adicionalmente, tambin pueden considerarse mdulos la agrupacin de funciones y procedimientos de funcionalidad
similar. Los datos y los subprogramas se consideran de forma separada de forma que un
subprograma recibe datos y (en el caso de las funciones) devuelve resultados en forma de
datos. Cada uno de estos subprogramas tiene una tarea bien denida y algunos necesitan
de otros para poder operar.
Entre las ventajas de la programacin modular podemos destacar:

Programas ms legibles y manejables


Simplicacin del problema: Divide y vencers
Favorecen la reutilizacin de cdigo
Permiten crear tipos abstractos de datos (TADs).

Los programas desarrollados en C++ en la asignatura de Fundamentos de la Programacin siguen este modelo de programacin. Eso

no

signica que no se pueda hacer

programacin orientada a objetos con C++, sino que tanto la losofa utilizada en esta
asignatura a la hora de escribir programas y las caractersticas del lenguaje utilizadas se
han restringido a este modelo de programacin.

1.3. Programacin orientada a objetos


Como hemos dicho en la Seccin 1.1, la programacin orientada a objetos es una forma
de programacin imperativa puesto que al programar orientando a objetos se describe la
secuencia que debe seguir el programa para resolver un problema dado. La diferencia con
otros modelos de programacin imperativa es que en la orientacin a objetos se hace uso
de dos nuevos conceptos: las

clases y los objetos. En vez de tener por un lado los datos y

por otro los subprogramas, ambos se juntan para dar lugar a clases y objetos.
Un objeto puede verse como una estructura abstracta que describe con la mayor precisin posible un objeto del mundo real y cmo se relaciona con el resto del mundo que lo
rodea. Los objetos son entidades que tienen un determinado estado (sus datos o

mtodos subprogramas que operan sobre ellos).

atributos )

y un comportamiento (

La clase es la entidad a travs de la cual se dene las propiedades y el comportamiento


de un conjunto de objetos.
Los programas orientados a objetos se construyen pues no como un conjunto de subprogramas, sino como un conjunto de objetos que interactan entre ellos transmitindose
rdenes e informacin, lo que se conoce como

envo de mensajes.

Facultad de Informtica - UCM

Captulo 1. Introduccin a la programacin orientada a objetos

La programacin orientada a objetos se basa tambin en conceptos como la abstraccin,


la encapsulacin, la herencia y el polimorsmo.
Abstraccin: Es el proceso que permite seleccionar los aspectos relevantes (para resolver nuestro problema) dentro de un conjunto e identicar comportamientos comunes
de los objetos. La abstraccin es clave en el proceso de diseo orientado a objetos,
ya que mediante ella podemos construir un conjunto de clases que permitan modelar
el problema que se quiere resolver.
Encapsulacin y Ocultacin: Aunque son conceptos diferentes suelen emplearse juntos. El trmino encapsular se reere a la capacidad para mantener cohesionada toda
la informacin del objeto (datos y comportamiento). Es responsable de la ocultacin
de los detalles de implementacin; permite restringir el acceso a los datos y a la implementacin de los mtodos deniendo el conjunto de atributos y mtodos que un
objeto es capaz de proporcionar.
Herencia: Es la propiedad a travs de la cual es posible construir una clase a partir
de otra ya existente.
Polimorsmo: Es la habilidad que presentan distintas clases para responder al mismo
mensaje. Se implementa por medio de la herencia. Hace que distintos objetos puedan
responder al mismo mensaje produciendo un comportamiento distinto.
Actualmente, la mayor parte de los lenguajes de programacin permiten este modelo de
programacin. Algunos de ellos son: C++ , Java, C#, PHP, Python, Ruby, Smaltalk,
Visual Basic, .Net o PowerBuilder.

2.

Evolucin de los enfoques de programacin imperativa


Podemos tambin analizar la evolucin histrica adentrndonos en las caractersticas

tcnicas que tenan los lenguajes. Se puede ver que lenguajes ms evolucionados disponen
de un mayor nivel de abstraccin:
Primero aparece el

lenguaje mquina y posteriormente el lenguaje ensamblador. No

hay prcticamente nada de abstraccin: las instrucciones utilizadas se corresponden


directamente con instrucciones que la mquina es capaz de ejecutar.
Aparecen los primeros

lenguajes de alto nivel, que permiten abstraer instrucciones.

Una sola instruccin puede producir varias lneas de cdigo en lenguaje de mquina.
Por ejemplo, permite utilizar expresiones aritmticas (i

= j + k)

y variables en

vez de zonas de memoria. Aparece tambin la idea de tipo asociado a una variable,
que marca qu instrucciones podrs utilizar con esa variable.
Aparece la programacin procedimental, que permite dividir el cdigo en subprogramas (procedimientos y funciones).
La programacin modular permite agrupar varios procedimientos y funciones en mdulos.
Surge la idea de tipos abstractos de datos (TADs), dando lugar a la programacin
basada en tipos.
Tecnologa de la Programacin

3. Historia de la programacin orientada a objetos

Aparece el concepto de objeto y de clase y con ellos la programacin orientada a


objetos.
En realidad la lista anterior no es excluyente: en los lenguajes ensambladores se pueden
utilizar funciones y procedimientos (programados en ensamblador), o incluso podramos
programar utilizando

las ideas

de la orientacin a objetos (cualquier lenguaje se puede

domesticar). Sin embargo, el lenguaje como tal

no da soporte a esos conceptos, por lo que

es el propio programador el que tiene tambin que lidiar con los detalles de bajo nivel (que
un compilador de un lenguaje orientado a objetos hara por nosotros). Lo mismo ocurre
con lenguajes imperativos no orientados a objetos como C (no C++).
Para evitar caer en la tentacin de que, tras el prrafo anterior, todos los lenguajes
quieran proclamarse ser orientados a objetos, diremos que un lenguaje es orientado a
objetos si incorpora los mecanismos necesarios para implementar en los programas las
tcnicas y mtodos establecidos por la programacin orientada a objetos: encapsulacin,
ocultamiento de informacin, herencia, polimorsmo. Iremos viendo cada uno de estos
conceptos en los captulos siguientes.

3.

Historia de la programacin orientada a objetos


El concepto de objeto aparece a nales de los aos 60 en Noruega con Simula-67. Simula-

67 fue un lenguaje de programacin creado por Ole-Johan Dahl y Kristen Nygaard diseado
para orientarlo especialmente al campo de las simulaciones. Este lenguaje ya incorpora los
conceptos de clase y objeto, as como los de subclase, herencia y polimorsmo.
Tras Simula-67, a principio de los aos setenta, aparece otro lenguaje que inuye notablemente en este paradigma de la orientacin a objetos. Este nuevo lenguaje de programacin fue llamado SmallTalk, y sus orgenes se encuentran en las investigaciones realizadas
por Alan Kay, Dan Ingalls, Ted Kaehler, Adele Goldberg y otros en el Centro de Investigacin de Palo Alto de Xerox (conocido como Xerox PARC). Tenan en marcha el primer
proyecto de computadora personal de uso general para conseguir una mquina pequea,
barata y con buenas prestaciones. La interaccin con el usuario sera sencilla, utilizando un
dispositivo novedoso por aquel entonces: el ratn. Para eso, habra una interfaz grca con
ventanas, mens, botones, etc. La programacin orientada a objetos facilita la programacin de ese interfaz, por lo que desarrollan un nuevo lenguaje de programacin: Smalltalk.
Smalltalk era un lenguaje orientado a objetos

puro (todo lo que se manejan son objetos).

El xito del interfaz de usuario hace que otros comercialicen estas ideas. Es el caso de
Apple en el Apple Macintosh.
En la dcada de los 80 renace el inters por la programacin orientada a objetos.
Aparecen conferencias internacionales dedicadas a la orientacin a objetos y se extienden
las tcnicas de ingeniera del software para hacer uso del paradigma. Aparecen nuevos
lenguajes (como Eiel) y se incorporan caractersticas de orientacin a objetos a lenguajes
ya existentes. C++ fue diseado por Bjarne Stroustrup y su intencin era la de unir las
caractersticas orientada a objeto de Simula-67 con la eciencia de C.
Durante la dcada de 1990 los objetos se hacen omnipresentes. Surgen sistemas operativos orientados a objetos y entornos de desarrollo orientados a objetos con muchas
facilidades para la programacin (incluyendo programacin visual). En esta dcada hace
su aparicin otro lenguaje de programacin orientado a objetos muy popular entre los
desarrolladores, su nombre es Java.
Otros lenguajes que tradicionalmente han sido no orientados a objetos aaden los conceptos de clases y objetos con ms o menos xito, se trata de PHP, LUA, etc.
Facultad de Informtica - UCM

Captulo 1. Introduccin a la programacin orientada a objetos

//

Fichero

Fecha . h

//

Definicin

del

tipo

de

datos

Fecha {
dia;
mes;
anyo;

struct
int
int
int
};
//

Declaracin

//

el

//

Las

//

Construye

tipo

de

funciones

mtodos

relacionados

con

Fecha .

implementaciones

una

apareceran

en

Fecha . cpp

fecha

Fecha construye(int dia, int mes, int anyo);


//

Dada

un

fecha ,

le

suma

el

nmero

de

das

pasado

como

parmetro .

void suma(Fecha &fecha, int numDias);


//

Dadas

dos

fechas ,

devuelve

el

nmero

de

das

que

hay

entre

ellas .

int resta(const Fecha &fecha1, const Fecha &fecha2);


//

Escribe

por

pantalla

la

fecha

void escribe(const TFecha &fecha);

Figura 2: Tipo de dato

Fecha

escrito en C++

En 2002 aparece C#.

4.

Un primer vistazo a la OO
Veamos una primera aproximacin al concepto de objeto que une datos con funciones.

Es una aproximacin muy simple a la OO que deja de lado los conceptos de OO ms


ventajosos.
Como ejemplo, partimos del tipo de datos

Fecha escrito en C++ de la Figura 2. Como

puede observarse no existe una relacin explcita entre las funciones y los datos con los que
se trabaja. Un ejemplo de uso puede ser:

int main() {
Fecha f1, f2;
...
escribe(f1);
escribe(f2);
suma(f1, 3);
std::cout << resta(f1, f2) << std::endl;
return 0;
}
Cuando en vez de programacin imperativa con registros (o

struct), tenemos clases


Fecha se aaden
forma, el tipo Fecha pasa

y objetos, todos los procedimientos y funciones relacionados con el tipo

a los datos de la fecha


a llamarse clase

y pasan a llamarse

Fecha.

mtodos. De esta

En la Figura 3 se dene esta clase en lenguaje C++. En vez

Tecnologa de la Programacin

4. Un primer vistazo a la OO

//

Fichero

Fecha . h

class Fecha {
private:
int dia;
int mes;
int anyo;
public:
//

Las

implementaciones

de

los

mtoos

aparecen

en

Fecha . cpp

Fecha(int dia, int mes, int anyo);


void suma(int numDias);
void escribe() const;
int resta(const Fecha &fecha);
};

Figura 3: Clase
de

struct

Fecha

se pasa a utilizar la palabra reservada

en C++

class;

dentro de ella aparecen tres

atributos y tres mtodos que trabajaban con la fecha. Es importante destacar que el primer
argumento (la fecha con la que operaban) desaparece o lo que es lo mismo, aparece oculto.
Se trata de la variable

this

de la que hablaremos ms adelante.

A continuacin mostramos un ejemplo de uso de la clase

Fecha

denida en la Figura

3:

int main() {
Fecha f1(12, 10, 1492);
Fecha f2(1, 1, 1970);
...
f1.escribe();
f2.escribe();
f1.suma(3);
std::cout << f1.resta(f2) << std::endl;
}
En primer lugar hay que crear objetos de la clase. La ejecucin de los mtodos de la
clase se realiza mediante el envo de mensajes (utilizando el operador punto .), siendo los
receptores de estos mensajes cualquiera de los objetos previamente creados.
La versin en Java de la misma clase aparece en la Figura 4 y como puede observarse, es
muy parecida a la de C++ ya que el estilo sintctico de Java esta tomado principalmente
de C++. En Java la unin en las clases de datos y mtodos se hace an ms evidente
que en C++, pues en Java

no

se distingue entre los cheros de cabecera (.h) y los de

implementacin (.cpp), sino que ambos se combinan en un nico chero

.java.

Aunque

el cdigo anterior no lo muestra, pues, las implementaciones de los mtodos ira en ese
mismo chero. Un ejemplo de uso en Java sera:

public class Ejemplo {


public static void main(String []args) {

Facultad de Informtica - UCM

Captulo 1. Introduccin a la programacin orientada a objetos

Fecha f1 = new Fecha(12, 10, 1492);


Fecha f2 = new Fecha(1, 1, 1970);
//

. . .

f1.escribe();
f2.escribe();
f1.suma(3);
System.out.println(f1.resta(f2));
}
}

//

Fichero

Fecha . j a v a

public class Fecha {


private int dia;
private int mes;
private int anyo;
public Fecha(int dia, int mes, int anyo) {
...
}
public void suma(int numDias) {
...
}
public void escribe() {
...
}
public int resta(Fecha fecha) {
...
}
};
Figura 4: Clase

Tecnologa de la Programacin

Fecha

en Java

Das könnte Ihnen auch gefallen