Documentos de Académico
Documentos de Profesional
Documentos de Cultura
qxd
23/7/07
20:01
Page 1
Introduccin a la
Programacin
Preparado para rendir la estrella
inicial del examen DCE
por Jos
Mara Selesan
00_IntrodProg.qxd
23/7/07
20:01
Page 2
00_IntrodProg.qxd
23/7/07
20:01
Page 3
Introduccin
El objetivo del libro es brindar al lector un panorama general sobre el desarrollo de software para computadoras
y servir como punto de partida, tanto
para rendir el examen cero del programa Desarrollador Cinco Estrellas de
Microsoft, como para adentrarse en esta fascinante profesin. A lo largo de
los cinco captulos que lo integran, nos
introduciremos en algunos de los principales temas que todo programador
debe conocer.
El primer captulo trata sobre los fundamentos del software y los algoritmos.
Si bien pueden parecer un tanto triviales, son de fundamental importancia,
porque un programador debe estar preparado y capacitado para pensar cualquier solucin a un problema en forma
de algoritmo. Estudiaremos, tambin,
distintas maneras de expresar algoritmos, necesarias como herramientas de
comunicacin y documentacin.
En los captulos dos y tres, abordaremos temas relacionados con la programacin estructurada. A lo largo de
ellos, aprenderemos muchos conceptos, la mayora de los cuales se utilizan
a diario, porque forman la base de
cualquier programa. Aprenderemos los
00_IntrodProg.qxd
23/7/07
20:01
Page 4
CONTENIDO
Tipos de datos
Captulo 1
Sentencias
FUNDAMENTOS
Qu es el software?
Un poco de historia
Operadores y expresiones
Tipos de operadores
Estructuras de control
Conclusiones
34
Captulo 3
ELEMENTOS DE PROGRAMACIN
Modularizacin
Los lenguajes de programacin
11
13
Compilacin e interpretacin
14
Algoritmos
15
Expresin de algoritmos
Conclusiones
36
Procedimientos y funciones
Libreras
44
Arreglos y matrices
45
15
18
Captulo 2
PROGRAMACIN ESTRUCTURADA
Mejorar el cdigo
20
22
Arreglos
Matrices
El estilo de programacin
50
Tabulaciones
Comentarios
Conclusiones
54
Captulo 4
PROGRAMACION ORIENTADA
A OBJETOS
Los objetos
Origen
Variables
Ventajas de la POO
56
00_IntrodProg.qxd
23/7/07
Clases y objetos
20:01
Page 5
58
Pensar en objetos
60
Patrones de diseo
Relaciones entre clases
Captulo 5
UML
Propiedades y mtodos
63
Relacin de uso
Qu es UML?
76
Diagrama de clases
77
Clases
Relaciones entre clases
Relacin de agregacin
Diagrama de secuencia
83
85
Conclusiones
86
Apndice
Herencia
66
Redefinir comportamiento
Extender clases
Tipos de herencia
Clases abstractas
EL EXAMEN
Algoritmos
88
Lenguajes de programacin
88
Programacin estructurada
89
Programacin orientada
Interfaces
Polimorfismo
72
Conclusiones
74
a objetos
91
Desarrollador 5 Estrellas
92
00_IntrodProg.qxd
23/7/07
20:01
Page 6
Prlogo
Cuando un msico escucha una meloda que acaba de componer o cuando un escultor retoca el ltimo detalle
de su obra maestra, est ante un logro
personal, pero que fue hecho pensando en los dems. Est ante el fruto de
su trabajo, que tuvo que realizar para
pasar de una idea o modelo que estaba
slo en su imaginacin, a algo perceptible por los otros. Y ese logro causa
una gran satisfaccin.
El desarrollo de software al igual
que la msica, la escultura o la pintura es una actividad creativa y, hasta si
se quiere, artstica. Es una actividad en
la que una persona (el programador)
debe plasmar una idea en un programa
que alguien usar luego. Y es muy probable que esa idea sea algo totalmente
novedoso, algo que nadie antes ha visto. Y ver esa idea traducida en software produce una sensacin que slo un
programador puede entender.
Ser programador no es fcil, pero es
divertido. Desarrollar software es, definitivamente, una tarea compleja. Deberemos ser capaces de interpretar al
usuario, de entender qu es lo que necesita (aunque muchas veces l mismo
no sabe qu es lo que necesita). Pasaremos largas horas pensando un algoritmo que resuelva el problema de nues6
tro cliente de la mejor manera. Muchas veces nos iremos a casa y seguiremos pensando en ese dichoso algoritmo. Nos iremos a dormir (probablemente tarde, porque habremos dedicado parte de nuestro tiempo libre a
aprender nuevas tecnologas) y despertaremos pensando en el algoritmo o,
incluso, con la solucin en mente. Pero cuando escribamos la ltima lnea
del cdigo que implementa ese algoritmo y lo veamos funcionando, obtendremos una gran satisfaccin. Una satisfaccin que slo puede entender
otro programador.
Cuando escrib mi primera lnea de
cdigo, debo haber tenido unos 11
aos. Ese da, al ver que una secuencia
de caracteres casi ilegible dibujaba un
crculo en la pantalla del televisor (la
poca de las PCs recin comenzaba),
me di cuenta de que eso era lo que quera hacer el resto de mi vida. Creo que
cada persona que quiere dedicarse al
desarrollo de software, antes de nada,
debe experimentar qu sensacin le
produce ver su programa en ejecucin.
Aquel que no sienta nada jams podr
ser un programador, porque la mayor
recompensa es, justamente, esa sensacin, aunque sean las 4 de la madrugada y llevemos 20 horas codificando.
01_IntrodProg.qxd
23/7/07
20:04
Page 7
CAPTULO 1
Fundamentos
En este primer captulo, veremos los fundamentos
bsicos del software, su funcionamiento, su uso
y su creacin. A su vez introduciremos los principales
conceptos sobre la programacin moderna.
01_IntrodProg.qxd
23/7/07
20:04
Page 8
FUNDAMENTOS
QU ES EL SOFTWARE?
> Desde siempre, las computadoras han sido mquinas con la nica capacidad
de llevar a cabo instrucciones, como imprimir un texto en un dispositivo de salida o sumar dos nmeros. Un programa es un conjunto de instrucciones y datos que juntos y, de manera sistemtica, permiten resolver problemas. Podemos
entonces definir el software como el conjunto de programas que funcionan en
una computadora y que permiten realizar una o varias tareas especficas.
Es importante resaltar que, al hablar de computadoras, no nos referimos slo a
las personales (PC), sino a cualquier dispositivo capaz de leer instrucciones de
una memoria, y ejecutarlas. Por lo tanto, podemos encontrar software en un lavarropas, en un respirador artificial y hasta en automviles modernos.
Segn su uso, el software se puede clasificar en dos grandes grupos: el software
de sistema y el software de aplicacin. El software de sistema es el conjunto de
programas bsicos para el funcionamiento de la computadora, como por ejemplo el sistema operativo (Windows o Linux), los drivers, etctera., mientras que
el software de aplicacin son los programas para realizar tareas especficas, como un procesador de texto, un juego o un compilador.
Los trminos software y sistema se utilizan para referirse a lo mismo. Sin embargo, la palabra sistema por s sola no tiene nada que ver con el software. Un sistema es un conjunto de elementos que interactan de alguna manera, como puede ser el sistema digestivo o el sistema solar. Otro ejemplo de sistema, son los sistemas de informacin, sin que esto tampoco implique un software. Por ejemplo,
un sistema contable es un conjunto de mtodos y de herramientas que permiten
mantener la informacin sobre los movimientos econmicos y los bienes de una
empresa, pero se pueden utilizar libros en papel para alcanzar el objetivo. Finalmente, un sistema de informacin basado en computadora es la implementacin
EL HARDWARE
El otro componente importante de una
computadora es el hardware, que incluye
todos los elementos fsicos o materiales
que la conforman. La diferencia entre el
8
hardware y el software es que este ltimo es intangible (lo vemos, pero no podemos tocarlo), mientras que el hardware es totalmente palpable.
01_IntrodProg.qxd
23/7/07
20:04
Page 9
QU ES EL SOFTWARE?
con herramientas computacionales (programas y datos) de un sistema de informacin. Por lo tanto, como sinnimo de software podemos utilizar sistema de
informacin basado en computadora. Por otro lado, los trminos programa y
sistema suelen utilizarse indistintamente, pero no est bien. Generalmente, podemos decir que un sistema es un grupo de programas que interactan para realizar ciertas tareas. Un programa es una unidad mucho ms pequea, independiente y sencilla que un sistema.
UN POCO DE HISTORIA
LA MQUINA DIFERENCIAL
En el ao 1812, Charles Babbage,
preocupado por los errores de clculo en las tablas matemticas, pens
que sera til poder calcularlos de
forma automtica. Ide, entonces,
una mquina capaz de obtener aproximaciones al resultado de una fun-
01_IntrodProg.qxd
23/7/07
20:04
Page 10
FUNDAMENTOS
Ya en el siglo XX, el fsico estadounidense John Atanasoff, conocedor de las teoras de Babbage y consternado por la cantidad de clculos que deba realizar, pens en construir una mquina de clculo que, a diferencia de las mecnicas, sera
digital, y su funcionamiento se basara en el sistema binario. Su aparato fue conocido como ABC Atanasoff-Berry-Computer, y por eso es considerado el iniciador de la computacin digital.
Luego, durante la Segunda Guerra Mundial, se construy y comenz a funcionar en instalaciones militares de los Estados Unidos una mquina llamada
ENIAC (Electronic Numeric integrator and Computer). Su funcionamiento se basaba en tubos de vaco, interruptores y rels para hacer operaciones matemticas
utilizando el sistema binario. Por su tamao, ocupaba una habitacin entera.
LA MQUINA DE TURING
Creada por Alan Turing, consista en
una cinta y un cabezal que poda leer y
escribir caracteres en dicha cinta, como tambin moverse hacia la izquierda
y hacia la derecha. La cinta podra verse como el conjunto de entradas y salidas de un programa. Turing demostr
10
01_IntrodProg.qxd
23/7/07
20:04
Page 11
es el proceso de construir programas. Para escribir programas, necesitamos conocer la lista de las posibles instrucciones que debemos proporcionar a la computadora, y cmo combinarlas para lograr los resultados deseados.
De acuerdo con el primer prrafo, para confeccionar programas, debemos escribir una secuencia de instrucciones que puedan ser entendidas por la computadora, pero como vimos anteriormente, hasta las computadoras ms modernas trabajan con el sistema binario, por lo que, para programarlas, deberamos
proporcionarles secuencias de unos y ceros formando las instrucciones de
nuestro programa. Si bien el sistema binario es muy simple, para un ser humano, resultara imposible recordar las combinaciones de unos y de ceros que
forman cada una de las instrucciones. Para solucionar este problema, existen
los lenguajes de programacin, una forma ms sencilla y legible de representar las instrucciones.
Sin entrar en detalles formales, podemos decir que un lenguaje de programacin es un conjunto de reglas que determinan, de forma clara, precisa y sin ambigedades, la forma en que se le imparten las instrucciones a una computadora
para construir un programa. Estas reglas se dividen en reglas sintcticas y reglas
semnticas. Las reglas sintcticas especifican cules son los caracteres vlidos del
lenguaje y cmo se pueden agrupar en palabras tambin vlidas. Las reglas semnticas determinan cul es el significado de las palabras, es decir, qu se espera que la computadora haga cuando recibe una palabra o una instruccin.
ficar a los procesadores en dos grandes grupos: CISC (Complex Instruction Set Computer, computadora con
conjunto de instrucciones complejo) y
RISC (Reduced Instruction Set Computer, computadora con conjunto de
instrucciones reducido).
11
01_IntrodProg.qxd
23/7/07
20:04
Page 12
FUNDAMENTOS
Los lenguajes de programacin fueron creados para facilitar la escritura de programas, proveyendo una abstraccin de las instrucciones reales de la computadora (formadas por unos y ceros) y reemplazndolas por palabras que fueran ms fciles de recordar por las personas. Segn el nivel de abstraccin que proveen, los
lenguajes de programacin se clasifican en tres niveles (Tabla 1). Cuanto ms alto
sea el nivel, ms cercanas al lenguaje humano sern sus instrucciones y, generalmente, ms poderosas, ya que cada instruccin del lenguaje puede representar
operaciones complejas formadas por muchas instrucciones de la mquina.
TIPOS DE LENGUAJES
Es muy importante tener en cuenta que, aunque los lenguajes de ms alto nivel puedan parecerse al lenguaje natural de los seres humanos, debern ser ms
12
01_IntrodProg.qxd
23/7/07
20:04
Page 13
QU ES EL ANLISIS LXICO?
La compilacin de un programa es
una tarea bastante compleja, que involucra una serie de pasos conducentes a la generacin del cdigo de mquina. El primer paso se denomina
anlisis lxico. Consiste en leer el
texto del programa (normalmente almacenado en uno o en varios archi-
vos) y aplicar ciertas reglas para identificar las palabras clave y las expresiones vlidas del lenguaje de programacin. Durante el anlisis lxico, ya
pueden identificarse algunos errores
bsicos, frecuentes en la mayora de
los programas, como por ejemplo, los
identificadores mal formados.
13
01_IntrodProg.qxd
23/7/07
20:04
Page 14
FUNDAMENTOS
COMPILACIN E INTERPRETACIN
> Cuando escribimos un programa en algn lenguaje, nuestro propsito final siem-
pre ser ejecutarlo en una computadora para realizar una tarea especfica. Ahora
bien, al utilizar un lenguaje de programacin estamos escribiendo instrucciones que
no son exactamente las que la computadora entiende. Para que nuestro programa
pueda ser ejecutado, ser necesario traducir las instrucciones que hemos escrito en
forma ms sencilla para que la computadora pueda entenderlas. Esta traduccin resulta siempre necesaria para poder ejecutar un programa escrito en cualquier lenguaje. El tipo de traduccin que se haga, permitir clasificar los lenguajes en lenguajes
compilados y lenguajes interpretados.
En los lenguajes compilados, la traduccin se realiza por nica vez, almacenando
las instrucciones ya traducidas a lenguaje mquina en un archivo. De este modo, al
momento de ejecutar el programa, la computadora lee una a una las instrucciones
del archivo generado durante el proceso de compilacin, y las ejecuta. Para realizar
la traduccin o compilacin, se utiliza un programa llamado compilador, que se
encarga de tomar cada una de las instrucciones escritas en un lenguaje de programacin y traducirlas a una o ms instrucciones del lenguaje de la mquina. Durante la compilacin, el compilador adems valida que las instrucciones que hemos escrito sean correctas y que se respeten todas las reglas del lenguaje.
Por otro lado, con los lenguajes interpretados, no existe un paso previo de compilacin, sino que la traduccin se realiza mientras se ejecuta el programa. Para ello,
se utiliza un software denominado intrprete, que a medida que el programa se ejecuta, lee cada una de las instrucciones y las traduce a instrucciones de la mquina,
para que sean ejecutadas. Al igual que los compiladores, los intrpretes deben validar que las instrucciones estn bien escritas para poder traducirlas sin problemas.
Generalmente, usando lenguajes compilados, se logra mayor rendimiento, ya que
el proceso de validacin y de traduccin se realiza una sola vez (al momento de la
compilacin). Luego, una vez que el programa est compilado, cada ejecucin se hace sobre una secuencia de instrucciones de la computadora. Al usar lenguajes interpretados, la validacin y traduccin se realiza cada vez que se ejecuta el programa.
Es ms, si una misma instruccin se repite varias veces, el intrprete la validar y traducir cada vez. Sin embargo, los lenguajes interpretados proveen cierto grado de
flexibilidad a la hora de realizar cambios en nuestro programa ya que, modificando
cualquier instruccin, estar lista para que el intrprete la tome y la traduzca.
14
01_IntrodProg.qxd
23/7/07
20:04
Page 15
ALGORITMOS
ALGORITMOS
> Segn el diccionario, un algoritmo es un conjunto ordenado de operaciones
sistemticas que permite hacer un clculo y hallar la solucin de un tipo de problemas. Por ejemplo, cualquiera de los mtodos que aprendimos en la escuela para multiplicar dos nmeros reales es un algoritmo. El mtodo o la receta para preparar una comida no es un algoritmo, ya que el orden de algunos pasos, muchas
veces, no importa o ni siquiera est claramente especificado (por ejemplo, podemos batir las claras a nieve antes o despus de mezclar la harina con l azcar, y
an as vamos a poder hacer una torta).
Ahora que conocemos los algoritmos, podemos redefinir el trmino programa como implementacin de un algoritmo determinado en un lenguaje de programacin. El conocimiento del concepto de algoritmo es fundamental para todo programador ya que, en la tarea diaria de escribir programas para resolver problemas,
antes debemos descubrir y entender cul es el algoritmo que los resuelve. Muchas
veces, como programadores, nos encontraremos siguiendo los pasos de un algoritmo con lpiz y papel para entender su funcionamiento o probar su eficacia.
EXPRESIN DE ALGORITMOS
LIBROS TILES
Hay una gran cantidad de libros para
introducirse en el mundo de la programacin de software y de los algoritmos. Recomendamos, Metodologa de
la Programacin. Algoritmos, diagra-
01_IntrodProg.qxd
23/7/07
20:04
Page 16
FUNDAMENTOS
goritmo, en lenguje natural, para ver una pelcula en DVD de la siguiente manera: presione la tecla Open/Close para abrir la bandeja del reproductor; luego,
inserte el disco y presione la tecla nuevamente. En su televisor, seleccione la opcin
DVD y por ltimo presione la tecla Play.
Pseudocdigo
Uno de los problemas del lenguaje natural es que suele resultar excesivamente
verborrgico, ya que debe respetar en cierta medida las reglas gramaticales del
lenguaje. Para evitar este problema, se puede utilizar un pseudocdigo, que consiste en una serie de normas sintcticas y gramaticales, parecidas a las de un lenguaje de programacin, pero sin tanta rigidez, y con cierta libertad en el uso y en
la combinacin de las palabras.
Por ejemplo, supongamos que debemos escribir el algoritmo de Euclides para
encontrar el mximo comn divisor entre dos nmeros enteros. Usando pseudocdigo, podemos consignar:
Entrada: A, B enteros
Salida: el mximo divisor comn entre A y B
Mientras A > 0 hacer:
Si A > B
cero o ms entradas, que son los datos que se le proporcionan como informacin variable y especfica de la
instancia del problema que resuelve.
Salida: un algoritmo tiene una o ms
salidas, que son el resultado del problema que intenta resolver, y que dependen de las entradas provistas.
Eficacia: los pasos deben ser suficientes
para lograr el cometido del algoritmo, es
decir, el algoritmo debe ser eficaz.
01_IntrodProg.qxd
23/7/07
20:04
Page 17
ALGORITMOS
A := A B
Si no
B := B A
El Mximo Comn Divisor es el contenido de A
Los diagramas de flujo son una representacin grfica de los pasos de un algoritmo. En un diagrama de flujo, cada tipo de figura tiene su significado. Su nombre se debe a que las figuras se conectan con flechas que indican la secuencia o
flujo de operacin.
Si bien muchas personas utilizan sus propios smbolos y figuras al momento de
crear sus diagramas de flujo, actualmente est definido de manera clara y estndar cules son las figuras vlidas y cul es su significado, de manera que cualquiera que las conozca pueda interpretar el diagrama.
Los smbolos ms utilizados son:
Flecha: indica el sentido del proceso, es decir, hacia dnde hay que dirigirse para encontrar el siguiente paso.
01_IntrodProg.qxd
23/7/07
20:04
Page 18
FUNDAMENTOS
A>0
No
Devolver A
A>B
A<A-B
No
B<B-A
CONCLUSIONES
Para introducirse en el mundo de la programacin y el desarrollo de aplicaciones de software, es muy importante comenzar con una buena base de conocimiento de algoritmos y tcnicas de resolucin de problemas de distinto
tipo, sin usar un lenguaje especfico (podemos usar pseudocdigo). Una vez
que dominemos ciertas tcnicas de resolucin de problemas y podamos expresar las soluciones como algoritmos, estaremos preparados para aprender lenguajes de programacin que nos permitan llevar esos algoritmos a
una computadora que los ejecute por nosotros.
18
02_IntrodProg.qxd
23/7/07
20:05
Page 19
CAPTULO 2
Programacin
estructurada
En este captulo, nos adentraremos en los principios
fundamentales de la programacin y, al mismo
tiempo, iremos aprendiendo sintaxis de los
dos principales lenguajes de la plataforma .Net.
02_IntrodProg.qxd
23/7/07
20:05
Page 20
PROGRAMACION ESTRUCTURADA
MEJORAR EL CDIGO
> En el Captulo 1, vimos que un programa es la implementacin de un algoritmo
determinado, es decir, una secuencia de pasos o instrucciones, mediante un lenguaje de programacin. Cuando escribimos un programa, es normal que necesitemos
alterar la secuencia de instrucciones siguiendo determinadas pautas. Si recordamos
el algoritmo que analizamos en el captulo anterior, podemos ver que en cada vuelta,
la instruccin por ejecutar depende de si A es mayor que B, o B es mayor que A.
En los primeros lenguajes de programacin (como el BASIC original), la nica forma que exista de variar las instrucciones por ejecutar segn una condicin
era mediante un salto a otra parte del programa (generalmente, a otra posicin
de memoria u otro nmero de lnea). Es decir, debamos evaluar la condicin y,
dependiendo de si sta era verdadera o falsa podamos seguir en la lnea de abajo o hacer que la prxima instruccin por ejecutar fuera diferente, ubicada en
otra parte del programa.
Por ejemplo, para resolver el algoritmo de Euclides usando saltos, deberamos
escribir algo as (con pseudocdigo):
1: Si A <= 0 Ir a lnea 7
2: Si A > 0 Ir a lnea 5
3: B := B A
4: Ir a lnea 1
5: A := A B
6: Ir a lnea 1
7: Devolver A
Esta implementacin tiene dos grandes problemas. El primero es que su escritura se vuelve un poco dificultosa, porque hay que conocer los nmeros de
lnea. Por ejemplo, al escribir la lnea 1, ya hay que saber que vamos a saltar a
la lnea 7. Si bien esto podra solucionarse usando nmeros de lnea que vayan, por ejemplo, de 10 en 10 y hacer los saltos a nmeros ms bien lejanos,
a medida que necesitemos modificar el algoritmo y escribir ms lneas de cdigo (incluso entre dos lneas ya existentes), los nmeros disponibles se iran
acercando ms y ms, y podra llegar el momento en que necesitramos renu20
02_IntrodProg.qxd
23/7/07
20:05
Page 21
MEJORAR EL CDIGO
merar las lneas para tener ms espacio. El segundo problema reside en la poca claridad del cdigo. Para alguien que lo lee por primera vez, puede resultar
extremadamente difcil entender.
Dados los constantes saltos hacia atrs y hacia adelante a travs de las instrucciones del programa, este tipo de cdigo inevitablemente enredado se conoce como
cdigo spaghetti, y la instruccin ms famosa para hacer saltos de lnea es GOTO
(del ingls go to, ir a).
HACIA LA PROGRAMACIN ESTRUCTURADA
Con el paso del tiempo, los programadores vieron que el cdigo spaghetti resultaba muy difcil de mantener, ya sea para agregar una nueva caracterstica al programa
o para corregir un error. As, en la dcada del 60, un cientfico de los Pases Bajos,
Edsger Dijkstra, formul un teorema en el que demostr que cualquier programa
informtico puede escribirse usando slo tres tipos de instrucciones bsicas: la secuencia, la evaluacin de condiciones y la repeticin o bucle de instrucciones, y
sin utilizar instrucciones GOTO. Este teorema, conocido como el Teorema de
Dijkstra, sent las bases de lo que hoy conocemos como programacin estructurada y de una gran familia de lenguajes de programacin basados en este concepto.
Al escribir un programa utilizando las tres estructuras propuestas por Dijkstra,
se obtienen programas mucho ms claros, fciles de entender y de mantener ya
que, en todo momento, la lgica est a la vista, y resulta fcil encontrar cul es la
siguiente instruccin por ejecutar.
Iteracin
Condicional
A: = A - B
Si no
B: = B - A
Imprimir A
Imprimir B
Secuencia
Devolver A
02_IntrodProg.qxd
23/7/07
20:05
Page 22
PROGRAMACION ESTRUCTURADA
CONCEPTOS DE PROGRAMACIN
ESTRUCTURADA
> En las siguientes secciones, veremos los conceptos bsicos de la programacin estructurada, junto con su implementacin utilizando lenguajes de la plataforma .Net.
IDENTIFICADORES Y PALABRAS CLAVE
Como vimos antes, un programa est formado por instrucciones. En los lenguajes de programacin, sobre todo en los de nivel medio y alto, las instrucciones estn formadas por palabras que pueden pertenecer o no a algn idioma humano. Como tambin vimos, los lenguajes de programacin son ms estrictos
que los lenguajes naturales y no se permite el uso de cualquier palabra ni tampoco cualquier combinacin de ellas. Toda palabra que se pueda usar en un programa, ya sea parte del lenguaje de programacin o definida por nosotros, recibe el
nombre de identificador. En todos los lenguajes de programacin, los identificadores deben respetar ciertas reglas para que sea ms sencillo el trabajo del compilador o del intrprete. La forma ms comn de representar un identificador es
por una secuencia de uno o ms caracteres consecutivos (no se permiten los es-
C# Y VB.NET
Los dos lenguajes ms importantes
en .Net (y los nicos provistos por Microsoft desde la discontinuidad de J#)
son C# y Visual Basic .Net.
C# es un lenguaje orientado a objetos, que fue diseado especialmente para la plataforma .Net (incluso
gran parte de las clases del framework estn escritas en C#). Como
su nombre lo indica, C# est basado
en el leguaje C, del que se han eliminado algunos componentes para
hacerlo ms seguro en cuanto al
22
02_IntrodProg.qxd
23/7/07
20:05
Page 23
pacios ni los saltos de lnea) seguidos de caracteres o de nmeros. Generalmente, no se permite que los identificadores comiencen con nmeros.
Hay una familia de identificadores que forman parte del lenguaje de programacin y que slo pueden usarse con los fines para los que fueron diseados. Estos
identificadores reciben el nombre de palabra clave. Por ejemplo, el lenguaje C#
tiene la palabra clave using, con una semntica determinada, y al ser palabra clave, no podremos usarla en otro contexto.
VARIABLES
LA PLATAFORMA .NET
Microsoft .Net es una plataforma para
desarrollo y ejecucin de software preparada para enfrentar los nuevos desafos en el mundo de la programacin
de aplicaciones. Esta plataforma consiste de una familia de lenguajes de
programacin, una librera de clases
comn a todos los lenguajes de la plataforma y un entorno de ejecucin controlado. Una de las caractersticas ms
importantes de .Net es que el cdigo
no se traduce directamente a instrucciones mquina, sino a un lenguaje in-
termedio que luego, durante le ejecucin del programa, es traducido a cdigo mquina. Esto brinda la posibilidad
de escribir programas independientes
de la plataforma de hardware y del sistema operativo. Adems, la biblioteca
de clases comunes, junto con una especificacin comn a todos los lenguajes (conocida como CLS o Common Laguage Specification, Especificacin de
Lenguaje Comn), permite una perfecta y fcil interaccin entre diferentes
lenguajes de la plataforma.
23
02_IntrodProg.qxd
23/7/07
20:05
Page 24
PROGRAMACION ESTRUCTURADA
Un tipo de dato es el conjunto de valores que toma una variable, junto con las
operaciones que pueden realizarse sobre esos valores. En muchos lenguajes, es necesario asociar una variable con un tipo de dato, de manera que el compilador o
intrprete pueda validar que las operaciones que hemos escrito realmente corresponden al tipo de dato que manejamos. Un ejemplo de tipo de datos es el nmero entero. El conjunto de valores que puede tomar es el de los nmeros enteros (0, 1, 2, -1, etctera), y las operaciones que podemos realizar sobre ellos son
la suma, la resta, la multiplicacin y la divisin de enteros.
24
02_IntrodProg.qxd
23/7/07
20:05
Page 25
Los lenguajes que exigen que definamos el tipo de dato de las variables antes de
usarlas se denominan fuertemente tipados. Desde el punto de vista de la deteccin
de errores, estos lenguajes presentan una gran ventaja frente a los no tipados ya que
permiten detectar, durante la compilacin (en el caso de lenguajes compilados), algunos errores muy habituales, como intentar asignar a una variable un dato que no
le corresponde. Por ejemplo, si definimos la variable numerador como de tipo entero, pero ms adelante le asignamos el texto Hola Mundo, el compilador de un lenguaje fuertemente tipado detectar el problema y nos lo informar antes de
compilar. Si el lenguaje no es fuertemente tipado, esto no se detectar y podra ocurrir que, luego, cuando queramos hacer una multiplicacin entre la variable numerador y el valor 5, la operacin resulte en un error. Al no ser detectado por el compilador, este error surgir durante la ejecucin del programa.
En la plataforma .Net, C# es un lenguaje fuertemente tipado, mientras que en
VB.Net existe la posibilidad de indicarle al compilador que exija o no la declaracin de los tipos de datos de las variables.
SENTENCIAS
Las sentencias describen acciones que sern ejecutadas por la computadora como parte del funcionamiento del programa. stas se diferencian de las instruc-
25
02_IntrodProg.qxd
23/7/07
20:05
Page 26
PROGRAMACION ESTRUCTURADA
ciones en que una sentencia puede ser traducida por el compilador o por el intrprete en cero o ms instrucciones de mquina. Es decir, una sentencia posee
mayor abstraccin y expresividad que una instruccin.
Las sentencias pueden clasificarse en ejecutables y no ejecutables. Las ejecutables son las que se traducen en instrucciones de la mquina y se utilizan para realizar acciones concretas (como sumar dos nmeros o imprimir un texto en la
pantalla del monitor). Por el contrario, las sentencias no ejecutables no se traducen a instrucciones, y su nica funcionalidad reside en aumentar la legibilidad
del cdigo fuente, ya que se pueden usar como comentarios para explicar detalles de la implementacin.
Al mismo tiempo, las sentencias pueden ser clasificadas en simples y compuestas. Una sentencia simple es una sentencia en s misma y no contiene a ninguna
otra. Por ejemplo, la sentencia de asignacin utilizada para asignar un valor a una
variable es una sentencia simple, ya que comprende nicamente la accin de asignar el valor a la variable. Por otro lado, las sentencias compuestas estn formadas
por dos o ms sentencias que se ejecutan de acuerdo con alguna estructura de
control, tal como veremos ms adelante.
OPERADORES Y EXPRESIONES
Anteriormente, vimos que un tipo de datos define los posibles valores que puede tomar una variable con el conjunto de operaciones o de acciones que se realizan sobre esos valores. Podemos definir un operador como el smbolo utilizado
para indicar una operacin sobre elementos llamados operandos. Por ejemplo,
para el tipo de dato nmero entero, est definida la operacin de suma, que puede representarse mediante el signo +. As, si escribimos 2 + 3, indicamos que queremos aplicar la operacin de suma a los valores (operandos) 2 y 3. Del mismo
modo, si escribimos saldo + 100, mostramos que queremos sumar 100 al valor
almacenado en la variable identificada como saldo. Cuando unimos dos o ms
constantes o variables mediante un operador, definimos una expresin.
Las expresiones pueden ser simples o compuestas. Una expresin simple es
aqulla slo formada por un operador con los operandos necesarios. Una expresin compuesta est formada por dos o ms operaciones simples. En el caso de las expresiones compuestas, es necesario especificar con exactitud el orden en que se resuelven las expresiones simples que las componen. En el caso
de operadores matemticos, generalmente, el orden en que se resuelven es el
26
02_IntrodProg.qxd
23/7/07
20:05
Page 27
Los operadores lgicos relacionan uno o ms valores de verdad (es decir, valores
que pueden ser verdadero o falso), y el resultado es otro valor de verdad en funcin
de los operandos. Dentro de los lenguajes de programacin, los operadores lgicos
se utilizan para evaluar condiciones y modificar as el flujo de control de un programa. Los operadores lgicos ms conocidos son no (NOT), o (OR), y (AND).
En la Tabla 1, pueden apreciarse los valores devueltos por los operadores lgicos ms
conocidos (usamos los nombres en ingls para ir familiarizndonos con los lenguajes de programacin). En la jerga de la programacin llamamos operadores booleanos a los operadores lgicos, por su relacin con el lgebra de Boole.
OPERADORES BOOLEANOS
A
F
F
V
V
B
F
V
F
V
NOT A
V
V
F
F
A AND B
F
F
F
V
A OR B
F
V
V
V
A XOR B
F
V
V
F
Como hemos visto, los operadores aritmticos se corresponden con las operaciones matemticas tradicionales: la adicin, la sustraccin, la potenciacin.
Operadores relacionales
Los operadores relacionales, tal como su nombre lo indica, establecen una relacin entre sus operandos. Un ejemplo clsico de operador relacional es el ope27
02_IntrodProg.qxd
23/7/07
20:05
Page 28
PROGRAMACION ESTRUCTURADA
Segn la cantidad de operadores con los que trabaja un operador puede clasificarse en unario o binario. Un operador unario se aplica slo a un operador. El ejemplo ms comn es el signo -, utilizado para indicar nmeros negativos (por ejemplo, -15). Los operadores binarios poseen dos operandos, como por ejemplo, el signo +. El caso de los operadores binarios puede extenderse y generalizarse para una cantidad cualquiera de operadores, en cuyo caso se denominan operador n-arios, donde n es la cantidad de operandos. Como ejemplo, podemos imaginar un operador 4-ario llamado M que devuelve
el mximo entre cuatro nmeros. Una operacin con este operador podra escribirse como M 7 2 0 9.
Segn el lugar donde estn los operadores con respecto a los operandos en
una operacin, un operador puede clasificarse en infijo, prefijo o sufijo. Un
operador prefijo se coloca delante de los operadores. El ejemplo que veamos
antes para el signo -, usado como operador unario, es un caso de operador
EL LENGUAJE PASCAL
El lenguaje Pascal fue creado por Niklaus Wirth con el objetivo de lograr
un lenguaje fcil de aprender, para
usar en sus clases de programacin,
y lo bautiz en honor a Blaise Pascal,
inventor de la primera calculadora
mecnica. Pascal es un lenguaje es-
28
02_IntrodProg.qxd
23/7/07
20:05
Page 29
La estructura de seleccin permite determinar si una sentencia (simple o compuesta) ser ejecutada o no a partir de la evaluacin de una determinada condicin o expresin booleana. En la mayora de los lenguajes actuales, la seleccin
se realiza mediante el uso de la estructura if (si). La forma ms bsica de esta estructura es la siguiente (en pseudocdigo):
Si (expresin booleana)
Entonces ejecutar sentencia A
Si no ejecutar sentencia B
La segunda parte (la del si no) es optativa y permite ejecutar una accin alternativa para cuando el resultado de la expresin lgica es falso.
En C#, la estructura de seleccin se escribe mediante la palabra if seguida de
la expresin entre parntesis y debajo la sentencia por ejecutar en caso de que la
expresin sea verdadera. En forma opcional, puede haber un else (si no) para especificar una accin en caso de que la expresin lgica sea falsa.
29
02_IntrodProg.qxd
23/7/07
20:05
Page 30
PROGRAMACION ESTRUCTURADA
// C#
if( saldo > montoExtraccion )
RealizarExtraccion(montoExtraccion);
else
MostrarMensaje(No tiene suficiente saldo);
En Visual Basic .Net, la estructura de seleccin es muy similar, aunque con algunas diferencias: la expresin no necesita ir entre parntesis y debe ser seguida
por la palabra reservada THEN (entonces). Adems, VB.Net provee la posibilidad
de escribir la accin en la misma lnea del if o en la lnea siguiente. En caso que
se escriba debajo, la estructura debe ser cerrada usando end if.
VB.Net
If saldo > montoExtraccion Then
RealizarExtraccion(montoExtraccion)
Else
MostrarMensaje(No tiene suficiente saldo)
End If
Tambien podemos hacer esto:
If b > 0 Then c = a / b else c = 0
30
02_IntrodProg.qxd
23/7/07
20:05
Page 31
sos, segn el valor de una variable o de una expresin. Si bien el select case puede
escribirse perfectamente como una secuencia de estructuras if, en pseudocdigo,
podemos escribir la seleccin mltiple de esta manera:
SegunEsElValorDe expresin hacer:
C1: sentencia 1
C2: sentencia 2
Sino: sentencia n
En Visual Basic .Net, la misma estructura selectiva mltiple se denomina Select Case y se escribe as:
31
02_IntrodProg.qxd
23/7/07
20:05
Page 32
PROGRAMACION ESTRUCTURADA
VB.Net
SELECT CASE variable
CASE 10: HacerAlgo()
CASE 20: HacerOtraCosa()
CASE ELSE: HacerAlgoDistinto();
END SELECT
Muy a menudo, necesitamos repetir una sentencia ms de una vez para completar
el objetivo del algoritmo. Las estructuras de repeticin de los lenguajes estructurados permiten ejecutar una sentencia una cierta cantidad de veces o mientras se cumpla una determinada condicin. Por ejemplo, si volvemos a mirar el algoritmo del
Captulo 1, podremos notar que repetimos las sentencias que hacen las restas entre las
dos variables mientras que el valor de la variable A sea mayor que cero.
Como decamos en el prrafo anterior, la mayora de los lenguajes estructurados
proveen dos tipos de estructuras de repeticin: una para repetir una sentencia mientras se cumpla una condicin (es decir, mientras el resultado de evaluar una expresin lgica sea verdadero), y otra para repetir una sentencia una cantidad determinada de veces. La sentencia que se ejecuta repetidas veces se denomina bucle.
La estructura de repeticin condicional se denomina comnmente while
(mientras). En el lenguaje C#, simplemente se la escribe seguida de la expresin
lgica entre parntesis y debajo la sentencia a ejecutar:
// C#
While( a > 0 )
a = a - b;
En Visual Basic .Net, es muy similar, con la diferencia que se debe marcar el final de la estructura con las palabras clave End While, y no es necesario escribir
la expresin booleana entre parntesis:
VB.Net
While a > 0
a = a - b
End While
32
02_IntrodProg.qxd
23/7/07
20:05
Page 33
En algunos lenguajes, existe una variante de esta estructura de repeticin, consistente en evaluar la expresin lgica al final. La diferencia radica en que, al evaluar la condicin al final, la sentencia por repetir se ejecutar por lo menos una vez, mientras
que, si la evaluacin se hace al comienzo, la sentencia podra no ejecutarse nunca.
Al momento de usar una estructura while, se debe prestar especial atencin a la
expresin lgica que determina el fin del bucle (tambin conocida como condicin de corte), ya que escribirla mal, podra hacer que el bucle nunca finalizara
(bucle infinito). Por ejemplo, si la condicin de corte es que el valor de una variable llegue a cero, pero olvidamos modificarlo dentro del bucle, el valor permanecer constante, y el ciclo nunca finalizar.
La otra estructura de control repetitiva con la que disponemos en la mayora de
los lenguajes estructurados es la que se conoce como For. Esta estructura permite especificar que se quiere repetir la sentencia una cantidad finita de veces, usando una variable como contador. A cada iteracin, la variable contador se incrementa automticamente (es decir, no necesitamos preocuparnos por actualizarla
como sucede con while). En algunos lenguajes, como Pascal, no se permite modificar la variable contadora dentro del bucle para facilitar la traduccin y validacin del cdigo durante la fase de compilacin.
En C#, la estructura for es un poco difcil de comprender al comienzo, pero
una vez que nos familiarizamos con ella, vemos que tiene una gran capacidad de
expresividad y de flexibilidad para escribir repeticiones complejas. Al escribir un
for en C#, debemos especificar el valor con el que comienza la variable contadora, la condicin que determina que el contador ha llegado al valor final y la
expresin que incrementa el contador. Esto ltimo parece contradecir lo que
mencionbamos antes acerca de que no es necesario preocuparnos por modificar el contador. Y es cierto. En ese aspecto, la estructura for de C# es parecida
a la estructura while. Vemosla en un ejemplo:
// C#
for(i=0;i<10;i++)
HacerAglo();
Como se puede ver en el ejemplo, la estructura consta de tres partes fundamentales separadas por punto y coma. La primera especifica el valor del contador con
33
02_IntrodProg.qxd
23/7/07
20:05
Page 34
PROGRAMACION ESTRUCTURADA
En este ejemplo, la sentencia HacerAlgo se repetir diez veces, y, en cada iteracin, el valor de la variable i se incrementar automticamente en 1.
CONCLUSIONES
En el momento de su aparicin, la programacin estructurada signific un importante avance en las formas de construir software, sobre todo por el impacto que caus en los costos de mantenimiento. La facilidad de mantenimiento
se debe a que, con la programacin estructurada, conseguimos programas
ms fciles de entender y de depurar (por la ausencia de instrucciones GOTO),
adems, los bloques de cdigo son ms claros.
34
03_IntrodProg.qxd
23/7/07
20:41
Page 35
CAPTULO 3
Elementos de
programacin
En el captulo anterior, hemos introducido los conceptos
fundamentales de la programacin estructurada,
tal como fue planteada por Dijkstra en su famoso
teorema. Ahora veremos algunos conceptos interesantes
que, si bien se encuentran en la mayora de los
lenguajes estructurados de la actualidad, son un poco
ms generales y pueden aplicarse, prcticamente,
en cualquier paradigma de programacin.
03_IntrodProg.qxd
23/7/07
20:41
Page 36
ELEMENTOS DE PROGRAMACIN
MODULARIZACIN
> En nuestro trabajo como programadores, nos encontramos a diario con la
obligacin de resolver problemas. A medida que la tecnologa avanza y las necesidades de los usuarios son ms exigentes, los problemas que debemos resolver se tornan ms complejos. Esto hace que la escritura de los programas sea
bastante difcil, y que su complejidad los vuelva inaccesibles. Tarde o temprano, la cantidad de variables y elementos que debemos manejar superar los lmites normales de la mente humana.
Una tcnica muy comn para facilitar la escritura de programas de gran tamao o que necesiten resolver problemas muy complejos consiste en dividir el problema en problemas ms pequeos. De esta manera, cada dificultad ser ms fcil de entender y, por lo tanto, resultar ms sencillo encontrar un algoritmo que
lo resuelva. As, la construccin del programa se reduce a la construccin de pequeas unidades o subprogramas que se conectan de alguna manera para resolver juntas el problema original. Esta tcnica se conoce como Modularizacin, y
a cada subprograma se lo denomina mdulo.
Un programa escrito usando la tcnica de modularizacin se resume en un
conjunto de subprogramas que se llaman unos a otros. Cada programa incluye
una lista de sentencias (de cualquiera de los tres tipos que estudiamos en el captulo anterior) y, eventualmente, llamadas a otros subprogramas. Cuando hablamos de llamar o invocar a un subprograma, lo que queremos decir es que,
desde un subprograma (o incluso desde el programa principal), se deriva la ejecucin al subprograma llamado. Por ejemplo, en el siguiente pseudocdigo:
Programa Principal:
1
A()
B()
Fin.
Subprograma A:
3
Subprograma B:
4
36
03_IntrodProg.qxd
23/7/07
20:41
Page 37
MODULARIZACIN
El programa principal llama o invoca al subprograma A y luego al subprograma B. Y aqu surge uno de los primeros conceptos clave de la modularizacin: un subprograma o mdulo debe ser un algoritmo en s mismo (de acuerdo con la definicin que vimos en el Captulo 1), es decir, que debe consistir de
una secuencia finita de pasos tras la cual finaliza. Entonces, cuando se hace una
llamada a un subprograma, ste se ejecuta (o sea, se ejecutan sus sentencias) y,
al terminar, el control vuelve al punto desde donde se hizo la invocacin. Retornando sobre el ejemplo anterior, concluimos que la secuencia de ejecucin
ser: comienza el programa, se deriva la ejecucin al subprograma A, se imprime la palabra Hola, el control vuelve a la lnea 2, se deriva el control al subprograma B, se imprime la palabra Mundo, el control vuelve a la lnea 3, y el
programa termina.
PROCEDIMIENTOS Y FUNCIONES
Los mdulos se pueden clasificar en procedimientos y en funciones. Las funciones devuelven un nico valor al programa o subprograma que hizo la llamada. Los procedimientos, generalmente, no devuelven ningn valor, aunque podran hacerlo. Las funciones se usan para resolver algn clculo y devolver el resultado, mientras que los procedimientos se utilizan para realizar una tarea concreta, pero que no involucre devolver nada al programa o subprograma que lo llam. En la mayora de los lenguajes de programacin, los procedimientos y funciones deben recibir un nombre consistente en un identificador vlido segn las
reglas lxicas del lenguaje.
Otra de las ventajas de la divisin en subprogramas reside en que nos permite usar el mismo grupo de sentencias varias veces en el mismo programa sin necesidad de volver a escribirlas. Sin embargo, lo ms probable es que en los distintos lugares donde podamos llamar a un procedimiento o funcin, los datos
DIVIDE Y VENCERS
La tcnica de dividir un problema en
problemas ms pequeos que sean
ms fciles de resolver se conoce habitualmente como la tcnica de Dividir y vencer, en referencia a pensa-
03_IntrodProg.qxd
23/7/07
20:41
Page 38
ELEMENTOS DE PROGRAMACIN
03_IntrodProg.qxd
23/7/07
20:41
Page 39
MODULARIZACIN
Procedimiento MostrarMCM()
Pedir un numero y guardarlo en V1
Pedir un numero y guardarlo en V2
M := MCM(V1, V2)
Mostrar valor de M
39
03_IntrodProg.qxd
23/7/07
20:41
Page 40
ELEMENTOS DE PROGRAMACIN
dida desde un procedimiento interno (Figura 1). En C# y Visual Basic .Net, las
reglas de mbito determinan que las variables pueden ser globales dentro de
una clase (ya veremos qu es una clase en el siguiente captulo), o locales a un
procedimiento o funcin.
Programa principal
Declarar variable A
A:=2
Llamar a B()
Procedimiento (B)
Declarar variable B1
B1:=A*2
La variable B1 es local al
Llamar a C()
procedimiento B.
Procedimiento C()
Declarar variable C1
C1:=B1*3
A:=C1+1
Fin procedimiento C
C1 es local al procedimiento C.
Fin procedimiento B
03_IntrodProg.qxd
23/7/07
20:41
Page 41
MODULARIZACIN
Programa principal
Declarar variables A y B
A:=2
B:=3
Llamar a P1(B)
Procedimiento P1(A)
Declarar variable B
B:=A*2
Imprimir B
41
03_IntrodProg.qxd
23/7/07
20:41
Page 42
ELEMENTOS DE PROGRAMACIN
un parmetro por referencia, lo que se le pasa al subprograma es la direccin de memoria donde se encuentra el valor de la variable. Es decir, se le pasa una referencia
al valor. Dado que se pasa la direccin de memoria donde se encuentra el valor,
cualquier asignacin que se le haga al parmetro se efectuar en realidad sobre la
variable original, ya que se escribe en la misma direccin de memoria.
Muchos lenguajes de programacin (entre ellos Visual Basic .Net) no tienen el
concepto de parmetro de salida como parte del lenguaje, por lo que es necesario utilizar parmetros por referencia para devolver un valor al programa o subprograma que hizo la llamada.
Procedimientos y funciones en C# y Visual Basic .Net
Obviamente, los dos lenguajes de .Net provistos por Microsoft proveen mecanismos para definir subprogramas.
En C#, el concepto de procedimiento no existe como tal, sino que todo son
funciones. Sin embargo, es posible definir procedimientos como funciones que
no devuelven un resultado, utilizando el tipo de dato void (que es un tipo de datos nulo). En Visual Basic .Net, los procedimientos se definen mediante la palabra clave Sub. Vemoslo con ejemplos.
// C#
void HolaMundo()
{
Console.WriteLine(Hola Mundo);
}
VB.Net
Sub HolaMundo()
Console.WriteLine(Hola Mundo)
End Sub
03_IntrodProg.qxd
23/7/07
20:41
Page 43
MODULARIZACIN
ves de apertura y cierre (los caracteres { y }). Por otro lado, en VB.Net, la definicin del procedimiento comienza con la palabra clave Sub, seguida del nombre
del procedimiento y la lista de parmetros. A diferencia de C#, en Visual Basic
.Net no se utilizan caracteres para marcar el comienzo de las sentencias del procedimiento, pero s se utiliza End Sub para marcar el fin.
La forma de definir una funcin en C# es igual que en el ejemplo anterior,
reemplazando la palabra void por el tipo de dato que se necesite devolver (por
ejemplo, int para enteros). En VB.Net, la definicin de una funcin es sustancialmente diferente, ya que debe utilizarse la palabra reservada Function en lugar de Sub, y se le agrega al final el tipo de dato de salida. Adems, como con los
procedimientos, en VB.Net hay que marcar el fin de la funcin con End Function. Como requisito extra, en ambos lenguajes es obligatorio colocar la palabra
return para devolver el resultado de la funcin.
// C#
int Sumar(int a, int b)
{
return a + b;
}
VB.Net
Function Sumar(a, b as Integer) As Integer
Return a + b
End Function
43
03_IntrodProg.qxd
23/7/07
20:41
Page 44
ELEMENTOS DE PROGRAMACIN
LIBRERAS
> Una de las grandes ventajas de la modularizacin reside en que los mdulos
pueden utilizarse en distintos lugares. Para ello, resulta muy comn organizarlos
en libreras. Una librera o biblioteca es un conjunto de subprogramas compilados en un nico archivo.
En algunos lenguajes (sobre todo los ms viejos), al compilar un programa se genera un archivo denominado programa objeto, que es el cdigo mquina generado a partir del cdigo fuente del programa, pero sin incluir el cdigo de las libreras utilizadas. Luego, en un segundo paso denominado enlace (linking) se combina el programa objeto con las libreras para producir un nico archivo ejecutable.
En los lenguajes de programacin que permiten compilar cdigo para ejecutar
en el sistema operativo Windows, es muy comn el uso de libreras de enlace dinmico (los conocidos archivos DLL, acrnimo de dynamic link library). El
enlace dinmico consiste en saltear el paso de enlace durante la compilacin para hacerlo durante la ejecucin de un programa. As, mientras un programa se
ejecuta, si necesita cdigo que se encuentra en una librera, se coloca sta en memoria, y se transfiere el control al subprograma necesario dentro de la librera.
03_IntrodProg.qxd
23/7/07
20:41
Page 45
ARREGLOS Y MATRICES
ARREGLOS Y MATRICES
> Las estructuras de datos son conjuntos de datos relacionados y organizados de
alguna manera (la forma de organizarlos depende justamente de la estructura usada). Desde un punto de vista ms formal, las estructuras de datos son tipos de datos (complejos), ya que determinan los valores que pueden contener y las operaciones que se les pueden aplicar. De acuerdo a cmo se administra la memoria para
almacenar la informacin, las estructuras de datos se pueden clasificar en estticas
y dinmicas. Las estructuras estticas ocupan una cantidad fija de memoria durante toda su vida. El tamao queda establecido al momento de definir la estructura,
es decir, cuando definimos una variable del tipo de la estructura de datos. Las estructuras dinmicas tienen un tamao inicial, pero pueden crecer durante la ejecucin, a medida que se incrementa la cantidad de datos que almacenan.
ARREGLOS
Los arreglos o vectores (Arrays) son estructuras de datos que permiten almacenar
una coleccin de datos del mismo tipo, de manera que pueden ser accedidos en forma directa. Dicho de otra manera, los arreglos son una sucesin contigua de n datos (donde n es el tamao del arreglo), cada uno con un ndice determinado por la
posicin. As, es posible acceder a un elemento del arreglo mediante su ndice. Un
arreglo tiene un nico nombre, y ste abarca a todos los elementos que contiene.
50
A[0] A[1]
80
30
55
27
10
Prez
tue
A[6]
El arreglo es una
secuencia de datos contiguos
en memoria.
03_IntrodProg.qxd
23/7/07
20:41
Page 46
ELEMENTOS DE PROGRAMACIN
Normalmente, los arreglos son estructuras estticas de datos, pero algunos lenguajes de programacin permiten cambiarles el tamao mientras se ejecutan.
Para entender la utilidad de los arreglos, pensemos que necesitamos almacenar el
registro de lluvias de cada mes para una ciudad. Sin usar arreglos, deberamos tener
doce variables para contener el registro pluvial de los doce meses del ao. Esta alternativa presenta algunas desventajas: es tediosa para programar, ya que hay que declarar cada una de las variables con un nombre diferente. Adems, se hace imposible recorrerlas mediante una estructura de repeticin. Por ltimo, si queremos hacer
que el usuario ingrese el nmero de mes y mostrar las lluvias de ese mes, deberamos
hacer un select case para mostrar la variable correspondiente al mes ingresado.
Si en cambio utilizamos un arreglo, tendremos los doce valores bajo un mismo nombre de variable y podremos acceder al registro pluvial del n-simo mes
directamente leyendo el elemento del arreglo ubicado en la posicin n. Supongamos que la variable se denomina lluvias; entonces, podemos escribir un algoritmo como el que sigue para mostrar el registro de lluvias de un mes seleccionado por el usuario:
// Pseudocdigo:
Procedimiento MostrarRegistroPluvial
Leer un entero y guardarlo en la variable mes
Mostrar el valor de lluvias[mes]
Aqu vemos una notacin sintctica que hasta ahora no habamos visto: lluvias[mes]. Esta expresin significa: el dato que se encuentra en la posicin mes
EL PRIMER ELEMENTO
Cada lenguaje de programacin tiene diferentes posturas a la hora de
definir las dimensiones de un arreglo, como as tambin de definir
cul es el ndice del primer elemento. Lenguajes como Delphi permiten
definir los ndices de un arreglo comenzando con cualquier nmero
46
03_IntrodProg.qxd
23/7/07
20:41
Page 47
ARREGLOS Y MATRICES
dentro del arreglo (el valor que est dentro de los corchetes representa el ndice
al que se quiere acceder). En el ejemplo, hemos usado una variable como ndice del arreglo, pero se puede usar tambin un valor constante, por ejemplo lluvias[2] para acceder a las lluvias de febrero.
Arreglos en .Net
MATRICES
Si bien las matrices tienen un origen en la matemtica, en el contexto de la programacin son estructuras de datos que permiten organizar la informacin en filas y columnas. Cada elemento de una matriz puede ser accedido por un par de
ndices (la fila y la columna). Al igual que en los arreglos, los elementos de una
matriz deben ser todos del mismo tipo de datos.
47
03_IntrodProg.qxd
23/7/07
20:41
Page 48
ELEMENTOS DE PROGRAMACIN
49
18
99
14
17
Fila
Elemento (3,4)
Columna
Figura 5. Una matriz est organizada en filas y columnas. Cada elemento se accede
mediante un ndice compuesto por el nmero de fila y por el nmero de columna.
FXCOP
Luego del surgimiento de .Net, Microsoft public documentos con estndares de codificacin y buenas prcticas
de programacin, con el objetivo de
que todos los programadores escribieran cdigo de la misma manera. Existe un programa llamado FxCop, dispo-
48
nible en www.gotdotnet.com/Team/
FxCop/. Este programa analiza ensamblados ya compilados de .Net y genera una lista con las violaciones a los
estndares definidos por Microsoft.
Actualmente, FxCop fue incorporado
en algunas ediciones de Visual Studio.
03_IntrodProg.qxd
23/7/07
20:41
Page 49
ARREGLOS Y MATRICES
guir con lpiz y papel cada uno de los pasos del algoritmo, verificando el resultado
obtenido (esto se conoce como Prueba de Escritorio).
Matrices en .Net
La definicin de matrices en los lenguajes de .Net que estamos estudiando resulta muy similar a la definicin de arreglos, con el agregado de la segunda dimensin.
// C# - Defino una matriz de 2 filas y 3 columnas
int[,] matriz = new int[2,3];
matriz [0,1] = 1;
matriz [0,2] = 20;
VB.Net Defino una matriz de 2 filas y 3 columnas
Dim matriz (2,3) as Integer
matriz (0,1) = 1
matriz (0,2) = 2
En C#, existe una forma alternativa de definir las matrices, basada en la idea de
una matriz como un arreglo de arreglos:
// C# - Defino una matriz de 2 filas y 3 columnas
int[][] mat = new int[2][]{new int[3],new int[3]};
mat [0][1] = 1;
mat [0][2] = 20;
49
03_IntrodProg.qxd
23/7/07
20:41
Page 50
ELEMENTOS DE PROGRAMACIN
EL ESTILO DE PROGRAMACIN
> Una de las premisas fundamentales de la programacin consiste en saber que
los programas no se escriben una vez y quedan as para siempre. Cuando se escribe un programa, es normal tener que volver sobre sus instrucciones para hacer una
modificacin o corregir un error. Y es comn que la persona que deba modificar
el programa no sea la misma que lo escribi. Sin embargo, dada la complejidad
inherente a todo programa, leer el cdigo fuente ya escrito y tratar de entenderlo
para hacer la modificacin que necesitamos, puede ser toda una odisea.
Para que la tarea de mantenimiento del software sea un poco ms sencilla, es
necesario que, como programadores, tengamos el hbito de escribir el cdigo de
la manera ms prolija posible y que logremos un estilo estndar. Para lograr un
buen estilo de programacin, debemos tener en cuenta algunos consejos.
TABULACIONES
Las sentencias compuestas pueden estar formadas a su vez por otras sentencias compuestas, as se obtienen anidamientos en el cdigo del programa. Para
poder identificar dnde comienza y dnde termina cada nivel de anidamiento,
es muy til tabular hacia la derecha cada sentencia que est dentro de otra (es
decir, cada nuevo nivel de anidamiento). Veamos la diferencia entre tabular y
no tabular con un ejemplo:
ARREGLOS
MODULARIZACIN Y OVERLAYS
50
03_IntrodProg.qxd
23/7/07
20:41
Page 51
EL ESTILO DE PROGRAMACIN
// C# - Forma incorrecta de anidar sentencias
if(a>0) {
for(int i=1;i<a;i++) {
if(i<3)
b=a*i;
else
b=a*(i+3);
}}
// C# - Forma correcta de anidar sentencias
if(a>0) {
for(int i=1;i<a;i++)
{
if(i<3)
b=a*i;
else
b=a*(i+3);
}
}
En el primer ejemplo, resulta difcil determinar dnde comienza cada nivel de anidamiento, mientras que, en el segundo, queda perfectamente claro a primera vista.
03_IntrodProg.qxd
23/7/07
20:41
Page 52
ELEMENTOS DE PROGRAMACIN
Muchas veces, nos encontramos con que hemos escrito una expresin muy
compleja. Al momento de escribirla, tenemos bien claro qu es lo que hace, porque acabamos de idearla, pero luego de un tiempo, cuando volvemos a leerla
puede que no entendamos muy bien qu es lo que quisimos hacer. Para solucionar casos de este tipo, es aconsejable el uso de comentarios y dejar una explicacin del razonamiento que hicimos para obtener ese cdigo, o cualquier otro
mensaje que resulte til para quien lo lea.
Nombres significativos
03_IntrodProg.qxd
23/7/07
20:41
Page 53
EL ESTILO DE PROGRAMACIN
Consistencia de formato
Quiz lo ms importante a la hora de escribir cdigo fcil de mantener sea lograr un estilo consistente y estandarizado, y mantener ese estilo en todo el programa. Esto significa que, si escribimos los nombres de variables locales con minsculas, las constantes con mayscula y los nombres de los procedimientos
usando mayscula para la primera letra de cada palabra, debemos repetir esa convencin siempre. As, si somos consistentes, alguien que est familiarizado con la
nomenclatura, al leer un identificador, podr saber fcilmente si se trata de una
variable, una constante, o un procedimiento.
Del mismo modo que es bueno adoptar convenciones de nomenclatura, resulta importante la consistencia en el uso de lneas en blanco, de espacios en-
una porcin de cdigo, es porque resulta muy compleja, y aconsejan reescribirla para que sea ms sencilla, separndola en otros procedimientos o
funciones si fuera necesario. La segunda postura lleva a un cdigo mucho
ms claro y mantenible.
53
03_IntrodProg.qxd
23/7/07
20:41
Page 54
ELEMENTOS DE PROGRAMACIN
tre los operandos y los operadores en las expresiones, y en la cantidad de espacios usados para las tabulaciones.
Figura 7. Los entornos de programacin modernos permiten definir reglas de codificacin y luego
modifican el cdigo automticamente a medida que escribimos, de manera que se cumplan las reglas.
CONCLUSIONES
En este captulo, hemos aprendido uno de los conceptos fundamentales de la
programacin: la modularizacin. Como programadores, debemos tener
siempre presentes estos conceptos y usarlos al mximo posible. Es preferible
tener muchas funciones y procedimientos a tener grandes bloques de cdigo
de cientos de lneas. Muchos programadores (entre los que me incluyo) tienen
esta regla de oro: si un procedimiento o funcin no cabe en una pgina del editor que estamos usando, entonces ser necesario dividirlo en procedimientos
y funciones ms pequeos, porque se est volviendo demasiado largo y, por lo
tanto, demasiado complejo.
54
04_IntrodProg.qxd
23/7/07
20:47
Page 55
CAPTULO 4
Programacin
orientada a objetos
La orientacin a objetos es una de las tcnicas
ms utilizadas en la actualidad en el mundo
del desarrollo: en el mbito acadmico, como
herramienta de aprendizaje y, en lo profesional,
para solucionar toda clase de problemas.
04_IntrodProg.qxd
23/7/07
20:47
Page 56
LOS OBJETOS
> Si miramos a nuestro alrededor, vemos que estamos rodeados de objetos. Y
cuando debemos desarrollar un nuevo software para resolver un problema, verificamos que los elementos que componen el problema son objetos. Pensemos en
un sistema de gestin de negocios. Al analizar las caractersticas del problema,
nos encontramos con que tenemos objetos como productos, facturas, remitos,
depsitos, clientes, etctera. Y no slo objetos concretos, sino tambin abstractos, como ser vencimientos o impuestos.
La programacin orientada a objetos es un paradigma basado en la identificacin de los objetos inherentes al problema y en la escritura de cdigo que modele esos objetos, sus propiedades, sus comportamientos y la forma en la que se
relacionan para resolver el problema. Visto de esta manera, la programacin
orientada a objetos resulta opuesta a la programacin imperativa clsica, donde
los programas son secuencias de instrucciones.
ORIGEN
Segn algunos autores, el primer lenguaje en usar objetos fue Simula 67, creado en la dcada del 60 para hacer simulaciones. Cuenta la historia que en el Centro de Cmputo Noruego, en Oslo, trabajaban en simulaciones de barcos, y la
cantidad de combinaciones de cualidades entre los diferentes barcos, y cmo
unas afectaban a otras, produjo gran confusin en los cientficos que estaban escribiendo los programas. Entonces, se les ocurri organizar los diversos tipos de
barcos en clases de objetos; cada clase sera responsable de definir y de administrar sus propios datos y su comportamiento.
Ms tarde, el lenguaje Smalltalk fue el primero en introducir el trmino orientacin a objetos para referirse al uso de objetos y de mensajes entre ellos como base
del diseo y la programacin de aplicaciones. Sin embargo, el auge de este paradigma comenz en la dcada del 80, con el lenguaje C++. La tecnologa de objetos fue
agregada a muchos lenguajes ya existentes, pero este agregado artificial condujo a
problemas de diseo y de compatibilidad que no hicieron ms que ensuciar los lenguajes existentes. Por otro lado, los lenguajes orientados a objetos puros (como
Smalltalk) no eran muy aceptados, porque carecan de caractersticas a las que esta56
04_IntrodProg.qxd
23/7/07
20:47
Page 57
LOS OBJETOS
Figura 1. Smalltalk fue uno de los primeros lenguajes completamente orientados a objetos.
VENTAJAS DE LA POO
La programacin orientada a objetos (POO) posee algunas ventajas frente a la programacin estructurada clsica. La POO consiste en una evolucin de la programacin estructurada y cuenta con la experiencia adquirida a lo largo de aos de desarrollo de software, lo que constituye su principal ventaja. Adems, conduce a un modelo mental del problema mucho ms cercano a la realidad, lo que favorece el anlisis, la implementacin y el posterior mantenimiento del software. Otra ventaja es
que la POO permite lograr un mayor grado de encapsulado, ya que el comportamiento y los datos propios de cada clase quedan contenidos en la definicin de ella.
Por ltimo, mediante tcnicas que estudiaremos luego, la POO permite reutilizar
mucho cdigo, favoreciendo la escritura de nuevos programas.
57
04_IntrodProg.qxd
23/7/07
20:47
Page 58
CLASES Y OBJETOS
> Cuando se analiza un problema para resolverlo mediante las tcnicas de programacin estructurada, nos enfocamos en identificar los datos que debemos manipular y las transformaciones que sufren como parte de la solucin. Con el paradigma
de orientacin a objetos, la tarea de anlisis se centrar en la identificacin de objetos, de sus caractersticas y de cmo se relacionan entre s para resolver el problema.
Ya dentro del contexto formal de la teora de Orientacin a Objetos, podemos
definir un objeto (parafraseando la definicin de James Rumbaugh) como un
concepto, abstraccin o elemento con significado claro dentro del problema en
cuestin (por ejemplo, un empleado). Como tal, un objeto se caracteriza por tener un estado, que es el conjunto de valores de sus propiedades en un momento
del tiempo (por ejemplo, el nombre de un empleado, o el monto del sueldo que
percibe). Adems, todo objeto tiene un comportamiento, es decir, las acciones
que puede realizar y que modificaran su estado (por ejemplo, un empleado puede ascender o completar tareas). Por ltimo, un objeto se caracteriza por tener
identidad propia, esto es, por ms que dos objetos tengan el mismo comportamiento y el mismo estado, resultan totalmente diferentes e identificables.
Segn el diccionario, una clase es un grupo de elementos de un conjunto que tienen caractersticas comunes. Las tcnicas de orientacin a objetos se centran en la
identificacin de esos elementos comunes entre los objetos para poder agruparlos en
clases y, as, manipularlos fcilmente. Podemos decir que una clase es una abstraccin de un grupo de objetos, porque no existe por s sola.
Por ejemplo, pensemos en una mesa. Hay mesas rectangulares, mesas redondas, de
madera, de metal, incluso de diferentes colores. Todas son mesas distintas e identificables, es decir: objetos. Sin embargo, podemos verificar que todas tienen los mis-
CLASES E INSTANCIAS
En el mundo de la orientacin a objetos, hay dos trminos muy usados:
clases e instancias. Como vimos, una
clase es una abstraccin de un objeto
de la realidad. La clase es un modelo
58
esttico, por lo tanto, para poder interactuar con otros elementos, debemos crear instancias que representen
a cada uno de los objetos particulares
que, agrupados, forman la clase.
04_IntrodProg.qxd
23/7/07
20:47
Page 59
CLASES Y OBJETOS
mos atributos, aunque con distintos valores. Todas tienen un color, un material, una
forma; por lo tanto podemos agruparlas bajo un mismo concepto: la mesa. Desde
el punto de vista de la orientacin a objetos, podemos decir que mesa es una clase.
Clase
Mesa
Color
Material
Cantidad de patas
Objeto 1
Objeto 2
Figura 2. Una clase es una abstraccin de las principales propiedades de los objetos reales.
PROPIEDADES Y MTODOS
04_IntrodProg.qxd
23/7/07
20:47
Page 60
PENSAR EN OBJETOS
> La forma de solucionar problemas utilizando tcnicas de Orientacin a Objetos es muy distinta de la forma tradicional o estructurada.
Cuando nos presentan un requerimiento de una nueva aplicacin y queremos
emplear los conceptos de la Programacin Orientada a Objetos, como primer
paso nos concentraremos en identificar los objetos que intervienen en el problema. Deberemos, entonces, analizar cuidadosamente el requerimiento, hablar con los usuarios y prestar especial atencin a los elementos que mencionan. Una tcnica muy usada consiste en leer el requerimiento escrito (que deber ser lo ms claro y completo posible) y subrayar todos los sustantivos, tanto concretos como abstractos. Luego, de entre todos los sustantivos subrayados, descartamos aquellos que no son propios del problema por resolver. Una
vez realizada esta primera actividad, habremos identificado una buena parte de
los objetos del dominio de la aplicacin.
Por ejemplo, imaginemos que necesitamos implementar una aplicacin de alquiler de autos, y nos presentan el siguiente requerimiento (resumido): La empresa dispone de autos para alquilar a sus clientes. Cuando se alquila un auto, el cliente firma
una pliza de seguro. En un formulario de alquiler, se registra la fecha, el nombre del
cliente, el nmero de su registro de conductor y el nmero de tarjeta de crdito.
Si aplicamos la tcnica de los sustantivos, podremos identificar rpidamente
tres objetos fundamentales para la aplicacin: auto, cliente y formulario de alquiler. Dependiendo del tipo de anlisis y diseo que queramos hacer, podramos
considerar como objetos la tarjeta de crdito e, incluso, el alquiler.
Como decamos al principio, los objetos poseen propiedades y comportamiento.
Para identificar las propiedades aplicamos una tcnica similar a la de los sustanti-
04_IntrodProg.qxd
23/7/07
20:47
Page 61
PENSAR EN OBJETOS
vos, pero buscando cualidades o adjetivos de los objetos que ya hemos identificado. Siguiendo con el ejemplo del alquiler de autos, podemos ver que el formulario
de alquiler tiene propiedades como la fecha, el nombre del cliente, etctera.
Una vez que hemos identificado los objetos y sus propiedades, estamos en condiciones de definir clases para agruparlos y abstraer todas las posibles instancias
de ellos. Hemos alcanzado as el fin de la primera etapa en el proceso de solucin
de problemas mediante tcnicas de orientacin a objetos.
Autos
Auto
Color
Marca
Ao
Clientes
Cliente
Nombre
Nmero de
Registro
Formularios
Formulario
Fecha
Cliente
N de pliza
Si bien el proceso de anlisis y diseo orientado a objetos se centra en la identificacin de los objetos propios del dominio del problema, a menudo es necesario crear objetos ficticios. stos colaboran con los objetos reales en la solucin del
problema o en proveer mecanismos de flexibilidad, extensibilidad o claridad del
61
04_IntrodProg.qxd
23/7/07
20:47
Page 62
04_IntrodProg.qxd
23/7/07
20:47
Page 63
POO PURA
Muchos puristas de la orientacin a
objetos sostienen que Smalltalk y
Eiffel son de los pocos lenguajes
realmente orientados a objetos. El
argumento se basa en que otros lenguajes (como los presentes en la
04_IntrodProg.qxd
23/7/07
20:47
Page 64
vimos cuando tratamos el tema de los patrones, podemos observar que el objeto
ValidadorTarjetaCredito brinda un servicio que alguien ms, por ejemplo un objeto RegistradorDeAlquiler puede usar para completar su funcin. En la bibliografa de POO, se suele llamar relacin Usa-A a la relacin de uso
Hacer Tarea
Objeto B
Objeto A
Tarea lista
Figura 4. Cuando un objeto A solicita una tarea a un objeto B, se dice que el objeto A usa el objeto B.
RELACIN DE AGREGACIN
Muchas veces, un objeto se compone de otros. Este tipo de relacin se denomina agregacin. En una relacin de agregacin entonces, un grupo de objetos (de
la misma clase o de clases distintas) se agrupan para formar un objeto ms complejo. Por ejemplo, un carrito de compras se compone de uno o ms productos
que el cliente ha comprado. Si bien los objetos producto son independientes, el
objeto carrito necesita de ellos para existir. La relacin de agregacin puede ser
RELACIONES
Desde el punto de vista de la implementacin, tanto las relaciones de
agregacin como las de composicin suelen representarse como
propiedades o atributos de las cla64
04_IntrodProg.qxd
23/7/07
20:47
Page 65
recursiva, es decir, un objeto que est compuesto por otros, a su vez, puede ser
parte de un objeto ms grande, definiendo as una estructura jerrquica. Por
ejemplo, una universidad puede estar compuesta de facultades, cada facultad se
compone de departamentos, y cada departamento, de profesores y de alumnos.
Composicin
La composicin es un caso especial de agregacin en el que los objetos agregados a otro, slo pertenecen a l. Por ejemplo, un automvil est compuesto de un
motor, un chasis, una carrocera y otros elementos, pero cada uno de ellos slo
puede pertenecer a ese auto. Un motor que est en un auto no puede estar en otro.
La distincin entre agregacin y composicin depende directamente del problema
por resolver y, en un buen modelo de objetos, debera reflejar exactamente la realidad.
Objeto a
Objeto b1
Objeto c1
Objeto c2
Objeto b2
Objeto c3
Figura 5. En una relacin de agregacin, los objetos se agrupan para formar un objeto ms complejo.
04_IntrodProg.qxd
23/7/07
20:47
Page 66
HERENCIA
> La herencia es un tipo muy importante de relacin entre objetos. En una re-
04_IntrodProg.qxd
23/7/07
20:47
Page 67
HERENCIA
herencia es transitiva, esto es, si una clase C hereda de B, que a su vez hereda de A,
todo el comportamiento y las propiedades de A pertenecen tambin a C.
A partir del ejemplo anterior, podemos apreciar que la relacin de herencia provee un mecanismo para lograr uno de los objetivos ms importantes de la programacin orientada a objetos, la reutilizacin de cdigo. Cmo se entiende esto? Supongamos que de la clase Figura hereda una clase Cuadriltero, que tiene
propiedades para representar la longitud de cada uno de los lados. Si de la clase
Cuadriltero derivan Rombo, Trapecio y Rectngulo, en estas nuevas clases ya no
tendremos que escribir el cdigo de la propiedad, es decir, hemos reutilizado cdigo que ya estaba escrito.
Clase Figura
CalcularSuperficie()
Clase Cuadrilatero
Clase Circulo
LongitudLadoA
LongitudLadoB
LongitudLadoC
LongitudLadoD
Radio
Clase Cuadrado
Clase Rombo
Figura 6. Mediante la herencia, podemos definir una jerarqua de clases, donde cada
clase derivada hereda el comportamiento y las propiedades de su clase base.
Adems de la reutilizacin de cdigo, la herencia provee otras aplicaciones tiles, como son la extensin y la redefinicin de clases. Veamos de qu se trata.
67
04_IntrodProg.qxd
23/7/07
20:47
Page 68
REDEFINIR COMPORTAMIENTO
Es muy comn que una clase que hereda de otra no se comporte exactamente
igual, aun para el comportamiento heredado. Veamos un ejemplo real: entre las
herramientas que provee el Framework .Net para crear aplicaciones basadas en
ventanas, tenemos clases para crear componentes visuales, como botones y listas.
Supongamos que debemos crear botones, pero que sean redondos, y no rectangulares como los botones normales. Si no tuviramos la herencia, deberamos crear
una clase BotonRedondo y escribir absolutamente todo el cdigo. Sin embargo,
podemos hacer que nuestra clase herede de la clase Button de .Net y redefina un
mtodo llamado OnPaint (que es el encargado de dibujar el botn en la pantalla)
para dibujarlo como necesitamos. Tendremos as un nuevo tipo de botn que se
dibuja como queremos, pero que posee todo el comportamiento y las propiedades de cualquier otro botn (por ejemplo, reacciona ante un clic con el ratn).
Clase Boton
Dibujar:
Dibuja un rectngulo y
coloca el texto del botn
AtenderClick()
Clase BotonRedondo
Dibujar:
Dibuja un circulo y
coloca el texto del botn
La Clase
BotonRedondo
funciona exactamente
igual que la clase
Boton pero se dibuja
distinto.
04_IntrodProg.qxd
23/7/07
20:47
Page 69
HERENCIA
EXTENDER CLASES
Hasta hora vimos ejemplos de herencia donde una clase derivada hereda slo de
una clase base. Sin embargo, en la prctica pueden presentarse casos en que una
clase herede de ms de una clase padre. Por ejemplo, imaginemos que tenemos
una clase Empleado, con una propiedad Sueldo, y una clase Msico con una pro-
HERENCIA MLTIPLE
La mayora de los lenguajes actuales no soportan herencia mltiple,
ya que en general este tipo de herencia presenta ms problemas que
soluciones. Uno de los problemas
de la herencia mltiple es cmo re-
04_IntrodProg.qxd
23/7/07
20:47
Page 70
Las interfaces son un derivado de las clases abstractas. En particular, una interfaz es esencialmente igual a una clase con todos sus mtodos abstractos. Una
clase que herede de una interfaz (en realidad para hablar correctamente debemos decir que la clase implementa una interfaz) est obligada a implementar
En .Net, cuando definimos una variable que es una instancia de una clase, en realidad, lo que estamos guardando en la variable no es el objeto
completo sino la direccin de memoria (en el HEAP) donde se encuentra
el objeto. Cuando pasamos un parmetro por valor, lo hacemos por referencia, y cualquier modificacin
del parmetro, la haremos sobre el
objeto original.
04_IntrodProg.qxd
23/7/07
20:47
Page 71
HERENCIA
todos sus mtodos y propiedades. Las interfaces se utilizan para proveer una
abstraccin de algn comportamiento. Adems, los lenguajes modernos como
Java y los lenguajes de .Net permiten que una clase implemente varias interfaces, proveyendo as una especie de herencia mltiple.
Clase Figura
Interfaz IDibujable
CalcularSuperficie()
Dibujar()
Clase FiguraDibujable
Dibujar()
La Clase
FiguraDibujable es
una figura, pero
tambin tiene la
capacidad de dibujarse
al implementar la
interfaz IDibujable.
PROGRAMADOR .NET
Un completsimo portal con informacin para programadores. Actualmente, hay ms de 3500 recursos entre artculos y ejemplos
de cdigo. Los artculos y ejemplos cubren la mayora de los temas y de los lenguajes actuales
que todo programador debe conocer. Est organizado en categoras, por lo que resulta sencillo
encontrar lo que buscamos.
71
04_IntrodProg.qxd
23/7/07
20:47
Page 72
POLIMORFISMO
> El polimorfismo es una tcnica que permite tratar a un objeto de una clase
derivada como si fuese de la clase padre. Polimorfismo significa muchas formas, y
justamente se usa este trmino, porque permite que una variable tenga mltiples
formas. La definicin misma de la relacin de herencia brinda la posibilidad de
contar con el polimorfismo, esto es, como una clase derivada es-una clase base,
siempre que necesitemos una clase base podremos usar una clase derivada. Por
ejemplo, si tenemos un mtodo que recibe un objeto de clase Figura, podremos
pasarle un objeto de clase Rectngulo o de clase Crculo, ya que tanto el rectngulo como el crculo son figuras. Los lenguajes actuales permiten polimorfismo
tanto por herencia como por implementacin de interfaces.
La mayor utilidad del polimorfismo radica en que permite programar en un nivel de abstraccin superior, ya que podemos especificar los contratos (es decir,
qu esperamos en un mtodo o propiedad) utilizando clases abstractas, interfaces o clases base de una gran jerarqua de herencia. Adems, como veremos a continuacin, mediante el polimorfismo, se logra el mximo nivel de extensibilidad
del cdigo, ya que permite encapsular las responsabilidades de los objetos dentro
de los objetos mismos y desde afuera trabajar con su abstraccin o clase base.
Para ilustrar la utilidad del polimorfismo, supongamos que tenemos que escribir un procedimiento que imprima la superficie de una figura, pero sin trabajar
con orientacin a objetos. Para hacerlo, necesitaremos conocer el tipo de figura
y escribir una sentencia de tipo select case para calcular la superficie segn el tipo de figura. Veamos algo de cdigo (en C#).
04_IntrodProg.qxd
23/7/07
20:47
Page 73
POLIMORFISMO
switch(tipoFigura)
{
case Cuadrado:
Console.WriteLine(base*altura);
break;
case Triangulo:
Console.WriteLine((base*altura)/2);
break;
case Circulo:
Console.WriteLine(3.14*radio*radio);
break;
}
04_IntrodProg.qxd
23/7/07
20:47
Page 74
Con esto, cuando necesitemos agregar un nuevo tipo de figura, bastar con escribir la clase correspondiente (heredando de Figura) e implementar el mtodo
CalcularSuperficie como corresponda, y no deberemos modificar el procedimiento de impresin.
La tcnica de polimorfismo es un poco difcil de entender al comienzo, pero
una vez asimilada se convierte en el arma ms poderosa de la orientacin a objetos. El secreto est en entender que, cuando codificamos la llamada a un mtodo de una clase base, debemos tener presente que en ejecucin se llamar al mtodo correspondiente de una clase derivada.
CONCLUSIONES
La programacin orientada a objetos, bien usada, puede ayudarnos a construir software con las caractersticas ms deseables por todo programador:
facilidad de escritura, facilidad de mantenimiento, extensibilidad y reutilizacin de cdigo. La extensibilidad es la clave para escribir aplicaciones altamente flexibles, ya que permite agregar o modificar comportamiento con muy
poco esfuerzo. Es muy importante aprender algunos patrones de diseo e incorporar correctamente los conceptos de abstraccin, encapsulamiento y polimorfismo, para no caer en el error de utilizar un lenguaje orientado a objetos para escribir cdigo estructurado.
74
05_IntrodProg.qxd
23/7/07
20:16
Page 75
CAPTULO 5
UML
Hemos visto distintas formas de expresar algoritmos,
como el pseudocdigo y los diagramas de flujo.
Estas herramientas resultan muy tiles, pero fueron
pensadas para expresar procedimientos y, por lo tanto,
tienen su aplicacin ms popular en la programacin
estructurada. Con la llegada de las tcnicas de POO,
se buscaron nuevas formas de expresar detalles
del problema por resolver ya que, en la programacin
orientada a objetos, slo nos concentramos en los
objetos del dominio y en los mensajes entre ellos.
05_IntrodProg.qxd
23/7/07
20:16
Page 76
UML
QU ES UML?
> UML es la sigla de Unified Modeling Language, o Lenguaje Unificado de Mo-
05_IntrodProg.qxd
23/7/07
20:16
Page 77
DIAGRAMA DE CLASES
DIAGRAMA DE CLASES
> El diagrama de clases se utiliza para modelar las clases que intervienen en la
solucin, con sus propiedades, sus mtodos y las relaciones entre ellas. Es un diagrama de tipo esttico, en el sentido que modela entidades que se mantienen
constantes durante la ejecucin. Recordemos que las clases son fijas, y lo que vara son las instancias, o sea, los objetos.
El diagrama de clases resulta muy til tanto para especificar los requerimientos
como para documentar los detalles del diseo. Adems, mediante tcnicas de ingeniera directa, permite generar el cdigo de las clases, no slo la definicin, sino tambin las propiedades y el esqueleto de los mtodos. Veremos a continuacin las principales caractersticas del diagrama de clases, para empezar, cmo y
cundo utilizarlo.
CLASES
Cliente
Nombre
RealizarPago(cantidad)
}
}
Propiedades
Mtodos
De las tres partes, slo es obligatorio el nombre de la clase en la primera; las otra
dos pueden quedar vacas. Adems, no es necesario especificar todas las propiedades y operaciones de la clase, slo las que resultan tiles para el modelo.
77
05_IntrodProg.qxd
23/7/07
20:16
Page 78
UML
Cliente
Nombre: String
Contacto: Persona
La seccin de
propiedades y de
mtodos puede
quedar vacia.
05_IntrodProg.qxd
23/7/07
20:16
Page 79
DIAGRAMA DE CLASES
La visibilidad se expresa mediante un signo a la izquierda del nombre de la propiedad o del mtodo, y los utilizados son el signo ms (+) para los elementos pblicos, el signo menos (-) para los privados y el numeral (#) para los protegidos.
Recordemos que los elementos protegidos slo son visibles por la clase y por sus
descendientes, mientras que los privados slo son visibles dentro de la clase.
RELACIONES ENTRE CLASES
Las relaciones entre clases tambin estn contempladas en UML, dado que, durante el diseo, es muy til especificar claramente cualquier relacin, que deber ser traducida luego al cdigo.
Composicin
En UML, la composicin se representa mediante una lnea que une las dos clases, pero colocando un pequeo rombo del lado de la clase que se compone a
partir de la otra. Opcionalmente, se puede indicar el nombre de la propiedad que
representa la composicin, pero no es muy habitual hacerlo, sobre todo en las
etapas iniciales del anlisis.
En la Figura 3, vemos que una Escuela se compone de Aulas. Observemos los pequeos nmeros debajo de la lnea. Estos nmeros indican la multiplicidad, es decir, cuntos elementos pueden existir de cada lado. El asterisco (*) indica muchos,
sin especificar cuntos. Segn esto, el diagrama de la Figura 3 deja bien claro que
una escuela se compone de muchas aulas. Del mismo modo, si leemos la multiplicidad en sentido inverso, podemos entender que un aula est slo en una escuela.
Escuela
+ Nombre: String
Aula
Posee
1
1..*
+ Capacidad: int
Adems, sobre la lnea que indica la relacin, se puede colocar un texto aclaratorio sobre el tipo de composicin. En el ejemplo de la Figura 3, hemos especificado Posee como nombre de la relacin. Si bien es opcional, el nombre de
79
05_IntrodProg.qxd
23/7/07
20:16
Page 80
UML
la relacin ayuda mucho a la claridad del diagrama y a su posterior implementacin en un lenguaje de programacin.
Asociacin simple
Anteriormente vimos que, si el tipo de dato de una propiedad es una clase, podemos escribirlo directamente o bien utilizar una relacin de asociacin. Hay una
tercera opcin que es usar ambos al mismo tiempo, pero no la veremos ahora.
La relacin de asociacin se representa de manera similar a la composicin, pero
sin utilizar el rombo; simplemente se coloca una lnea entre las dos clases asociadas
y una flecha que indica el sentido de la asociacin. Al igual que en la composicin,
puede agregarse el nombre de la relacin para aumentar la riqueza del modelo.
Escuela
+ Nombre: String
Ubicada
en
Direccin
+ Calle: String
+ Numero: int
PROGRAMACION Y DISEO
Los conceptos introducidos por la POO
como forma de trabajo, no slo se aplican a la programacin propiamente dicha, sino que tambin se puede hacer
80
05_IntrodProg.qxd
23/7/07
20:16
Page 81
DIAGRAMA DE CLASES
Herencia
Escuela
+ Nombre: String
Primaria
Secundaria
Terciaria
Publica
Privada
Figura 5. La herencia se representa mediante flechas sin relleno, apuntando hacia la clase base.
05_IntrodProg.qxd
23/7/07
20:16
Page 82
UML
mera divisin del rectngulo que representa en este caso la interfaz. Adems, si bien
desde el punto de vista del polimorfismo la implementacin de interfaces resulta
similar a la herencia, no es lo mismo, por lo que UML hace la distincin correspondiente. Para especificar que una clase implementa una interfaz, se debe colocar
una flecha de punta hueca apuntando hacia la interfaz, pero con lnea punteada.
En la Figura 6 se aprecia una interfaz (IComunicador) y una clase, la que implementa (ComunicadorPorModem). Notemos que, a diferencia del diagrama de herencia,
aqu s debemos especificar en la clase todos los mtodos y propiedades de la interfaz, ya que al aceptar el contrato que la interfaz nos impone, debemos implementarlo completamente (caso contrario ni el modelo ni el cdigo sern vlidos).
<<interface>>
<<interface>>
IComunicador
IComunidor
+ Inicializar():
Inicializar() :void
void
+ Finalizar():
Finalizar() :void
void
+ <<property>> DispositivoListo():
DispositivoListo() :bool
bool
+ CadenaRecibida(string):
CadenaRecibida(string) :void
void
+ EscribirCadena(string):
EscribirCadena(string) :void
void
+ AsignarReceptorDeDatos(RecepcinDeDatos):
AsignarReceptorDeDatos(RecepcionDeDatos) :void
void
IDisponible
ComunicadorPorModem
puerto: SerialPort
+ Inicializar(): void
+ Finalizar(): void
+ <<property>> DispositivoListo(): void
+ CadenaRecibida(string): void
+ EscribirCadena(string): void
05_IntrodProg.qxd
23/7/07
20:16
Page 83
DIAGRAMA DE SECUENCIA
DIAGRAMA DE SECUENCIA
> Varias veces dijimos que la programacin orientada a objetos se basa en la representacin en software de los objetos que intervienen en el dominio de la aplicacin junto con las relaciones e interacciones entre ellos. Mediante el diagrama
de clases, UML permite especificar de manera esttica las clases del modelo y sus
relaciones. Para expresar la forma en que los objetos (no las clases) interactan
para llevar a cabo su objetivo dentro de la aplicacin y solucionar un problema,
UML provee el diagrama de secuencia, que permite especificar los mensajes que
intercambian los objetos, el orden en que lo hacen y cmo reacciona cada objeto ante la llegada de un mensaje proveniente de otro.
ELEMENTOS DEL DIAGRAMA DE SECUENCIA
A diferencia del diagrama de clases, en el diagrama de secuencia intervienen instancias, es decir, objetos concretos que pertenecen a una determinada clase. Los objetos se representan simplemente como rectngulos con su nombre y la clase a la
que pertenecen dentro de l, separadas por dos puntos (:). En caso en que no interese la identidad de una instancia en particular, se puede omitir el nombre, colocando slo el nombre de la clase a la que pertenece, precedida por los dos puntos.
Otro elemento de este diagrama son los mensajes. Desde el punto de vista de la
implementacin, podemos considerar los mensajes como invocacin a mtodos:
cuando un objeto A enva un mensaje B a un objeto C, podemos traducir como
que el objeto A invoca el mtodo B del objeto C. Los mensajes se representan mediante flechas simples, con el nombre del mensaje escrito sobre ellas.
Por ltimo, dado que para representar una secuencia debemos especificar el orden en que los mensajes son enviados, UML permite indicar una lnea de tiempo, que se coloca en el diagrama de manera vertical, y que consiste en una lnea
punteada por cada una de las instancias que intervienen en el diagrama.
Para entender cmo funciona el diagrama de secuencia, imaginemos que tenemos que representar un escenario de matriculacin de un alumno en un curso.
Tenemos una clase Alumno, una clase Curso y una clase Facultad. La clase Facultad tiene la capacidad de determinar si un alumno puede inscribirse en un curso
(porque conoce las correlatividades y las asignaturas aprobadas por el alumno).
Cuando un alumno quiere inscribirse, hace la solicitud al curso (mediante un
83
05_IntrodProg.qxd
23/7/07
20:16
Page 84
UML
unAlumno : Alumno
unCurso: Curso
: Universidad
SolicitarInscripcion(unAlumno)
VerificarCorrelatividades(unAlumno, unCurso)
PuedeCursar
Solicitud aprobada
Como observamos en el diagrama, el objeto Alumno enva un mensaje SolicitarInscripcion al objeto Curso. Luego, ste enva un mensaje VerificarCorrelatividades al objeto de clase Universidad, quien contesta afirmativamente. Ante la llegada de la respuesta de la universidad, el objeto Curso le confirma la inscripcin
al objeto Alumno. Observemos que el tiempo corre hacia abajo, por lo que el orden en que aparece cada mensaje en el diagrama es cronolgico.
En la Figura 7, hay algunos detalles que an no mencionamos. Los mensajes de
lnea punteada corresponden a las respuestas de un objeto a un mensaje determinado. Los rectngulos delgados sobre las lneas de tiempo corresponden a instancias particulares, esto es, cada rectngulo en la lnea de tiempo de un objeto corresponde a una instancia particular.
84
05_IntrodProg.qxd
23/7/07
20:16
Page 85
RECURSOS EN LA WEB
En Internet hay una gran cantidad de
informacin sobre UML, desde detalles bsicos hasta ejemplos completos y de gran complejidad. Sin duda, el
sitio de cabecera es el oficial de UML
(en ingls): www.uml.org.
85
05_IntrodProg.qxd
23/7/07
20:16
Page 86
UML
Sistema de Sueldos
Renovar Contratos
Gerente de Personal
Generar Liquidaciones
Calcular Impuestos
Figura 8. El diagrama de casos de uso especifica cmo se relaciona el sistema con el mundo exterior.
CONCLUSIONES
A lo largo del captulo, vimos algunos de los diagramas que permite crear UML y
su aplicacin en el ciclo de vida del desarrollo de software, sobre todo para documentar las primeras etapas (anlisis y diseo). Si bien, al ser visual, UML resulta bastante fcil de aprender, es recomendable familiarizarse primero con las
tcnicas y conceptos generales de la orientacin a objetos y luego dedicarse a
aprender UML, de manera de poder sacarle el mayor provecho posible a este poderoso lenguaje de modelado. Tambin ser imprescindible la lectura del libro
UML Distilled, de Martin Fowler (traducido al espaol como UML gota a gota).
86
06_IntrodProg_ApendA.qxd
23/7/07
20:17
Page 87
APNDICE
El examen
En este apndice, haremos un repaso general
de los principales conceptos aprendidos y veremos
algunas preguntas del ejemplo del examen
correspondiente a la estrella cero del programa
Desarrollador Cinco Estrellas 2005
(http://www.dce2005.com).
06_IntrodProg_ApendA.qxd
23/7/07
20:17
Page 88
EL EXAMEN
ALGORITMOS
Los lenguajes de programacin permiten escribir instrucciones para una computadora utilizando palabras y smbolos pertenecientes a algn idioma humano.
El principal objetivo de los lenguajes de programacin es proveer una herramienta que resulte ms sencilla que ingresar las secuencias de nmeros que es capaz
de interpretar una computadora como instrucciones.
Segn el grado de abstraccin o de lo mucho que se aleje un lenguaje del cdigo nativo de la mquina, se puede clasificar en lenguaje de bajo nivel (como Assembler), lenguaje de nivel intermedio (como C) o lenguaje de alto nivel (como
por ejemplo los lenguajes de .Net). En general, los lenguajes de bajo nivel son
ms difciles de utilizar, pero permiten escribir programas ms eficientes, mientras que los de alto nivel poseen mayor expresividad, ya que con una instruccin
del lenguaje es posible darle varias instrucciones a la mquina, incluso con un esfuerzo mental menor por parte del programador.
88
06_IntrodProg_ApendA.qxd
23/7/07
20:17
Page 89
PROGRAMACIN ESTRUCTURADA
Como la computadora slo puede interpretar instrucciones expresadas como secuencias de nmeros binarios (unos y ceros), es necesario traducir los programas
escritos en algn lenguaje, a instrucciones que la mquina pueda entender. Para
ello, podemos utilizar un intrprete o un compilador. Los compiladores toman el
texto del programa (el cdigo fuente) y generan un archivo con instrucciones ejecutables por la computadora. El proceso de compilacin se realiza una sola vez:
cuando el programa est terminado y antes de poder correrlo en la computadora.
Los intrpretes, en cambio, toman cada una de las instrucciones del programa, las
convierten a cdigo de mquina y las ejecutan. A diferencia de la compilacin, el
proceso de interpretacin se lleva a cabo cada vez que el programa se ejecuta; por
esto, generalmente, los programas compilados funcionan un poco ms rpido que
los programas interpretados. En .Net, al momento de compilar, no se genera cdigo de mquina, sino que se produce cdigo en un lenguaje intermedio que luego,
durante la primera ejecucin, es traducido a lenguaje de mquina.
En algunos lenguajes, el compilador no genera el cdigo definitivo, sino que genera un archivo llamado cdigo objeto, que luego debe ser enlazado con las libreras utilizadas para generar un nico archivo ejecutable. El encargado de realizar esto es un programa llamado linker (enlazador).
PROGRAMACIN ESTRUCTURADA
La programacin estructurada es un paradigma que propone construir programas utilizando slo tres tipos de construcciones: la secuencia de instrucciones,
la ejecucin condicional y la repeticin. Frente a la programacin lineal que utiliza las instrucciones de salto (GOTO) para modificar el curso de ejecucin, la
programacin estructurada representa una importante mejora en las formas de
construir software, ya que permite obtener cdigo mucho mejor escrito, ms claro, ms legible, fcil de mantener y de modificar. Repasemos algunos de los principales conceptos de la programacin estructurada:
Identificadores: un identificador es una palabra que se utiliza para darle nombre a algn componente del programa, ya sea una instruccin, un subprograma
o una variable. La mayora de los lenguajes de programacin poseen reglas estrictas para la escritura de nuevos identificadores, como por ejemplo, que deban comenzar necesariamente con una letra del alfabeto o con un guin bajo.
Variables: es una posicin de memoria donde se encuentra un dato que debemos manejar dentro del programa. Casi siempre, las variables poseen un nom89
06_IntrodProg_ApendA.qxd
23/7/07
20:17
Page 90
EL EXAMEN
06_IntrodProg_ApendA.qxd
23/7/07
20:17
Page 91
06_IntrodProg_ApendA.qxd
23/7/07
20:17
Page 92
EL EXAMEN
rias clases no relacionadas entre s, podemos hacer uso de las interfaces, parecidas a las clases abstractas con la diferencia que no tienen ningn mtodo implementado y que una clase puede implementar ms de una interfaz, adems de heredar de una clase. Una de las capacidades ms interesantes brindadas por la programacin orientada a objetos es el polimorfismo ste consiste en conocer la clase real de un objeto recin durante la ejecucin del programa. El polimorfismo
se basa en la herencia y es la clave para lograr cdigo extensible y flexible, atributos muy deseados en todo programa.
DESARROLLADOR 5 ESTRELLAS
Veamos algunas de las preguntas del examen cero del DCE 2005. Los exmenes de Desarrollador 5 Estrellas incluyen 20 preguntas de tipo multiple choice,
donde debemos elegir entre 4 posibles respuestas. Para aprobar, es necesario responder bien al menos el 70% de las preguntas.
1)
2)
92
06_IntrodProg_ApendA.qxd
23/7/07
20:17
Page 93
DESARROLLADOR 5 ESTRELLAS
3)
Qu es un algoritmo?
A. Un software de aplicacin.
B. Cualquier cdigo escrito en un lenguaje de programacin.
C. Un mtodo para resolver un problema mediante una serie de pasos precisos, definidos y finitos.
D. Las opciones B y C son correctas.
Esta pregunta es un poco tramposa. La respuesta correcta es la C. La respuesta D no puede ser correcta porque la opcin B afirma que un algoritmo es cdigo escrito en un lenguaje de programacin, y aprendimos que si
est escrito en un lenguaje de programacin ya se trata de un programa
(que, generalmente, es la implementacin de un algoritmo).
4)
5)
93
06_IntrodProg_ApendA.qxd
23/7/07
20:17
Page 94
EL EXAMEN
6)
Cul es el bloque que utiliza .NET para proveer administracin estructurada de excepciones?
A. OnError/Goto
B. If/Else
C. Throw
D. Try/Catch/Finally
La respuesta correcta es la D. En Visual Basic 6, se utilizaba el OnError/Goto para manejar los errores; pero desde la primera versin de, .Net se utiliz el Try/Match/Finally, y se denomina estructurada por no utilizar GoTo.
7)
Si se desea definir un comportamiento para un conjunto de clases no necesariamente relacionadas entre s, la mejor opcin es:
A. Definir una jerarqua de herencia entre las clases.
B. Encapsular el comportamiento en una clase agregada.
C. Definir una interfaz.
D. Relacionar las clases mediante una asociacin bidireccional.
Como hemos visto, la herencia no es una relacin slo sintctica, sino ms
bien semntica. Entre la clase base y la derivada, se define una relacin es-un.
Si las clases no estn relacionadas, entonces, no es natural usar herencia, y podemos hacer uso de las interfaces para definir el comportamiento comn. Por
lo tanto, la respuesta correcta es la C.
8)
94