Está en la página 1de 94

00_IntrodProg.

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

TTULO > Introduccin a la Programacin


AUTOR > Jos Mara Salesan
FORMATO > 13,5 x 19 cm
PGINAS > 96

Copyright GRADI S.A. 2007.


Hecho el depsito que marca la ley. Reservados todos los derechos de autor.
Prohibida la reproduccin total o parcial de esta publicacin por cualquier medio
o procedimiento y con cualquier destino.
Primera impresin realizada en agosto de 2007.
Kollor Press, Capital.
Todas las marcas mencionadas en este libro
son propiedad exclusiva de sus respectivos dueos.

Selesan, Jos Mara


Introduccin a la programacin. - 1a ed. - Banfield Lomas de Zamora : Gradi S.A., 2007.
v. 11, 96 p. ; 19x14 cm. (Pocket users)
ISBN 978-987-1347-45-2
1. Informtica. I. TtuloCDD 005.3

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

conceptos de variable, estructuras de


control, buenas prcticas de codificacin, y ms. Es importante que el lector medite en profundidad cada uno
de estos temas, realice prcticas y consulte ms material para asimilar correctamente cada uno de ellos y establecer una base de conocimiento slida que le permita enfrentar cualquier
tipo de desarrollo.
Luego, el captulo cuatro presenta una
introduccin a la Programacin Orientacin a Objetos (POO). Este paradigma, si bien no es nuevo, presenta un
avance importante en la manera de desarrollar software, y recin en los ltimos aos se lo est considerando como
el paradigma por defecto para todo
nuevo desarrollo. Si bien este captulo
no ahonda en detalles, tiene como objetivo familiarizar al lector con cada
uno de los conceptos clave de la POO.
Finalmente, el captulo cinco introduce algunos de los conceptos del Lenguaje Unificado de Modelado (UML).
UML se basa fuertemente en los conceptos de POO, como clases y herencia, por lo que ser necesario comprender los temas del captulo cuatro para
aprovechar al mximo ste.
3

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

Los lenguajes en la actualidad

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

Hacia la programacin estructurada


Conceptos de programacin
estructurada

22

Arreglos
Matrices
El estilo de programacin

50

Tabulaciones
Comentarios
Conclusiones

54

Captulo 4
PROGRAMACION ORIENTADA
A OBJETOS
Los objetos

Identificadores y palabras clave

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

Elementos del diagrama


de secuencia
Diagramas de casos de uso

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.

ATENCIN AL LECTOR > lectores@redusers.com

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

Muchos autores coinciden en afirmar que la idea de programa como secuencia


de instrucciones se remonta a principios del siglo XIX y no tiene nada que ver con
la computacin. Efectivamente, en 1801 un francs llamado Joseph Marie Jacquard ide un mecanismo de tarjetas perforadas para controlar los dibujos que
formaban los hilos en una mquina para tejer. De esa manera, lograba programar
las puntadas de la mquina para obtener tramas y figuras repetibles.
En 1843, Ada Augusta Lovelace, hija del poeta ingls Lord Byron, plante la idea
de usar tarjetas perforadas para controlar la Mquina Diferencial de Babbage (ver recuadro) y lograr que repita ciertas operaciones. Unos aos ms tarde, su idea fue tomada para desarrollar un sistema de cmputo para la oficina de censos de los Estados Unidos. Las tarjetas estaban diseadas de tal modo que los agujeros representaban la edad, raza, sexo, etctera. Este desarrollo permiti que el tiempo en obtener
los resultados del censo de 1890 fuera de 5 aos menos que el censo anterior.
La idea de lady Ada tuvo tal repercusin que, al da de hoy, se la considera como la primera programadora, y las tarjetas perforadas fueron utilizadas en centros de cmputos hasta no hace mucho tiempo.

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-

cin matemtica, mediante un mtodo llamado de las diferencias. Si bien


por limitaciones propias de la poca
nunca lleg a terminar su construccin, su denominada Mquina diferencial sent las bases de la computacin moderna.
9

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.

Figura 1. La ENIAC fue una de las primeras


computadoras del siglo XX. Su poder de clculo era menor
al de una calculadora de bolsillo actual.

A partir de la ENIAC, las computadoras fueron evolucionando ao tras ao, a un


ritmo cada vez ms vertiginoso hasta llegar a las computadoras que conocemos en
la actualidad. Sin embargo, a pesar de esta evolucin, las computadoras mantienen
dos caractersticas esenciales: estn basadas en el sistema binario y necesitan que se
les provea de una secuencia ordenada de instrucciones para poder funcionar.

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

que su mquina podra resolver cualquier problema representable por un


algoritmo y que, si no era capaz de resolverlo, entonces resultaba, insoluble
en una computadora. Su trabajo se
convirti en el tema central de estudio
de la Teora de la Computacin.

01_IntrodProg.qxd

23/7/07

20:04

Page 11

LOS LENGUAJES DE PROGRAMACIN

LOS LENGUAJES DE PROGRAMACIN


> Ahora que sabemos qu es un programa, podemos decir que la programacin

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.

ARQUITECTURAS CISC Y ARQUITECTURAS RISC


El conjunto de instrucciones que puede entender una computadora depende de su arquitectura (por ejemplo, un procesador Intel tiene un conjunto de instrucciones diferente del
de un procesador Motorola). La cantidad de instrucciones permiten clasi-

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

NIVEL DEL LENGUAJE CARACTERSTICAS


Bajo
Las instrucciones del lenguaje estn muy relacionadas con las instrucciones
de la computadora, por lo tanto, el programador debe tener un buen
conocimiento del funcionamiento del equipo. Al programar directamente
(o casi) con instrucciones de la mquina, se obtienen resultados eficientes
y se puede lograr cualquier cosa que haga la computadora, aunque
con un esfuerzo ms grande que con otros niveles de abstraccin.
Como lenguaje de bajo nivel, podemos mencionar el Assembler.
Medio
Si bien algunos autores ignoran este nivel, existe un grupo de lenguajes
con una abstraccin un poco ms alta que los de bajo nivel,
pero an bastante cercana al hardware. Su sintaxis es ms sencilla
que la de los lenguajes de bajo nivel, pero permiten escribir programas
cercanos al lenguaje de la computadora.
Un ejemplo tpico de lenguaje de nivel medio es el lenguaje C.
Alto
Este lenguaje est formado por palabras comunes en algn idioma
(como por ejemplo el ingls), por lo que resultan fciles de recordar
y de interpretar. Generalmente, son lenguajes ms poderosos en cuanto
a expresividad que los de bajo nivel, pero puede ocurrir tambin
que resulte difcil implementar programas que tengan que hacer un uso
muy especfico del hardware.
Como ejemplo de lenguajes de alto nivel, podemos mencionar a C# o Java.
Tabla 1. Clasificacin de los lenguajes segn su nivel de abstraccin.

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

LOS LENGUAJES DE PROGRAMACIN

estrictos y limitados, ya que es necesario que permitan definir las instrucciones


de una forma entendible y sin ningn tipo de ambigedad.
LOS LENGUAJES EN LA ACTUALIDAD

A lo largo del tiempo, los lenguajes han evolucionado y se adaptaron a las


necesidades y a las posibilidades computacionales de cada momento. Por eso,
actualmente disponemos de una gran cantidad de lenguajes de programacin
entre los cuales elegir a la hora de comenzar un desarrollo o de aprender una
nueva tecnologa.
Para tomar una buena decisin y elegir el lenguaje que ms nos conviene, es
importante conocer sus caractersticas, sus capacidades y debilidades. Adems,
un aspecto fundamental para tener en cuenta es el paradigma o enfoque del lenguaje, es decir, de qu forma hay que pensar y escribir el programa para resolver un problema. Los paradigmas ms conocidos son el imperativo, el declarativo y el orientado a objetos. Mediante el paradigma imperativo, debemos indicar explcitamente los pasos por seguir para resolver el problema, es decir, debemos indicar el cmo. Por otro lado, el paradigma declarativo permite escribir el programa describiendo las caractersticas del problema, es decir, especificando el qu. Por ltimo, el paradigma orientado a objetos permite modelar
y escribir los programas a partir de la abstraccin de los objetos reales que forman parte del dominio del problema. Actualmente, el paradigma declarativo es
usado en el ambiente acadmico y con fines de investigacin, mientras que, en
ambientes productivos y de negocios, se utilizan los lenguajes imperativos y, en
mayor medida, los orientados a objetos.

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

Como los algoritmos no estn relacionados nicamente con la programacin de


computadoras, es necesario contar con mtodos independientes para expresarlos
y, por lo tanto, transmitirlos a otras personas. En la actualidad, existen varias formas de expresar un algoritmo, como ser, el lenguaje natural, el pseudocdigo, los
diagramas de flujo, algunos diagramas del lenguaje de modelado UML (que veremos en el ltimo captulo), etctera.
En el caso del lenguaje natural, el algoritmo es expresado por medio de oraciones en un idioma determinado. A modo de ejemplo, se puede indicar el al-

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-

mas de flujo y programas, de Osvaldo


Cairo (ISBN 9701509404). En el cual,
se proponen distintas tcnicas de anlisis para enfrentar la solucin de un
problema y llevarla a un algoritmo.
15

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

CARACTERSTICAS DE LOS ALGORITMOS


El estadounidense Donald Knuth, autor del libro El arte de programar
computadoras, seal cinco propiedades que deber tener todo algoritmo:
Finito: un algoritmo debe tener un
nmero finito de pasos, tras los cuales debe terminar.
Preciso: cada paso debe estar definido con precisin, rigurosidad y sin
ambigedades.
Entradas: todo algoritmo debe tener
16

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

Esto significa que la entrada al programa consiste de nmeros enteros (A y B)


y, mientras el valor de A sea mayor que cero, se le asigna a A la resta entre A y B,
si A es mayor que B; si no, a B se la asigna la diferencia entre B y A. El resultado es el valor que queda en A luego de las sucesivas restas.
Como puede verse en el ejemplo, se especifican claramente cules son los datos
de entrada y de salida. Adems se utilizan algunos smbolos ya conocidos (como
el signo mayor a) y otros propios del pseudocdigo (como el signo := para representar que el elemento de la izquierda toma como valor el resultado de la operacin de la derecha).
Diagrama de flujo

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.

PARA TENER EN CUENTA


Al hacer un diagrama de flujo, hay que
tener muy presente estos aspectos:
Debe haber un nico punto de inicio
del proceso.

Debe haber siempre un camino para llegar a la solucin.


Debe haber un nico punto de fin
del proceso.
17

01_IntrodProg.qxd

23/7/07

20:04

Page 18

FUNDAMENTOS

Rectngulo: se usa para representar un paso determinado del algoritmo.


Rombo: representa un punto de decisin sobre la base de una condicin. De
un rombo salen siempre dos flechas: una en un sentido, si se cumple la condicin y otra en otro sentido, si la condicin no se cumple.
Para ilustrar el concepto, vamos a especificar el algoritmo de Euclides que usamos anteriormente, mediante un diagrama de flujo.

A>0

No

Devolver A

A>B

A<A-B

No

B<B-A

Figura 2. Diagrama de flujo del algoritmo de Euclides

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.

ATENCIN AL LECTOR > lectores@redusers.com

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

Mientras A > 0 hacer:


Si A > B

Condicional

A: = A - B
Si no
B: = B - A
Imprimir A
Imprimir B

Secuencia

Devolver A

Figura 1. En esta figura, vemos las tres estructuras


de control propuestas por Dijkstra en el algoritmo de Euclides.
21

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

modelo de ejecucin y de administracin de memoria.


Visual Basic .Net es una adaptacin
para .Net del conocido lenguaje Visual Basic (que a su vez es una adaptacin del BASIC original de los aos
60) y como tal conserva muchas de
las caractersticas (y problemas) del
leguaje original. Al igual que C#, VB.Net (como tambin se conoce a Visual Basic .Net) est basado en el paradigma de Orientacin a Objetos que
estudiaremos en el Captulo 4.

02_IntrodProg.qxd

23/7/07

20:05

Page 23

CONCEPTOS DE PROGRAMACIN ESTRUCTURADA

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

En cualquier programa que hagamos, necesitaremos manejar datos: el nombre


del usuario, el saldo de una cuenta corriente, la cantidad de veces que iteramos
sobre una lnea de cdigo. Y es natural que estos datos cambien de valor durante la vida del programa. As, nos encontramos con uno de los conceptos ms bsicos de la programacin, el concepto de variable. Una variable es una referencia a un dato cuyo valor puede cambiar durante la ejecucin de un programa.
Siendo un poco ms formales, podemos decir que una variable es una posicin
en la memoria de la computadora, donde reside un dato significativo para el programa. Para que resulte ms fcil la lectura y la comprensin de los programas, las
variables reciben nombres formados por identificadores vlidos. As, por ejemplo,

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

en el caso de la implementacin del algoritmo de Euclides que hemos estudiado,


usamos dos variables, denominadas A y B. Es una buena prctica de programacin dar nombres significativos a las variables, de manera de hacer evidente la intencin que tenemos al momento de definirla. Si en un programa llamamos a una
variable c, alguien que lea luego el programa (incluso podramos ser nosotros mismos) no podr entender rpidamente cul es el dato que representa; mientras que
si usamos nombreCliente, est claro que, en la ubicacin de memoria referenciada
por la variable, estamos almacenando el nombre de un cliente.

Figura 2. Segn Google Trends, existe una tendencia a usar ms


el lenguaje C# que VB.Net, adems de haber ms noticias en
Internet sobre C# (fuente www.google.com/trends?q=visual+basic%2Cc%23).
TIPOS DE DATOS

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

CONCEPTOS DE PROGRAMACIN ESTRUCTURADA

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-

LOS COMENTARIOS EN C# Y EN VB.NET


Los comentarios son un caso especial de sentencia no ejecutable que
permiten escribir un texto libre con el
objetivo de aumentar la legibilidad del
cdigo. En cada lenguaje, la forma de
escribir comentarios vara, como as
tambin los tipos de comentarios que
se pueden escribir (de una sola lnea
o de muchas lneas).
En C#, los comentarios de una sola
lnea se escriben comenzando con
los caracteres // (por ejemplo: //esto es un comentario), mientras que

los comentarios de muchas lneas


se escriben comenzando con los caracteres /* y finalizando con */. Entre ambos caracteres, puede haber
texto y saltos de lnea.
En VB.Net, los comentarios de una
sola lnea se escriben comenzando
con la comilla simple (), y no existen los comentarios mltiple lnea
(aunque se los puede simular escribiendo lneas consecutivas de comentarios, todas comenzadas con
comilla simple).

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

CONCEPTOS DE PROGRAMACIN ESTRUCTURADA

tradicional (es decir, primero el producto y la divisin, y luego la suma y la


resta). Si al momento de escribir la expresin no tenemos del todo claro cul
es el orden de prioridad de los operadores, podemos utilizar parntesis para alterar o hacer implcito el orden de resolucin.
TIPOS DE OPERADORES

Para no entrar en detalles muy matemticos, podemos identificar tres grandes


tipos de operadores: los lgicos, los aritmticos y los relacionales.
Operadores lgicos

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

Tabla 1. Tabla de verdad de los cuatro operadores lgicos ms comunes.


Operadores aritmticos

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

rador mayor que, notado con el smbolo >. En


general, los operadores relacionales devuelven un
valor de verdad, por lo que son usados en expresiones lgicas (por ejemplo, el valor de verdad de
la expresin 7 > 9 es falso).
Figura 3. George Boole fue el precursor
en el lgebra de Boole, de donde se tom
el concepto de Operador lgico o booleano.
Tipos de operadores

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

tructurado y fuertemente tipado, adems de contar con caractersticas que


hacen posible un buen grado de encapsulamiento. Actualmente, muchas
universidades lo siguen utilizando para introducir los conceptos de programacin estructurada.

02_IntrodProg.qxd

23/7/07

20:05

Page 29

CONCEPTOS DE PROGRAMACIN ESTRUCTURADA

prefijo. Si el operador se coloca entre los operandos, entonces de denomina


infijo (es el tipo ms comn entre los operadores matemticos). Por ejemplo,
el signo de adicin (+) es un operador infijo, ya que se lo escribe entre los operandos (2 + 4). Por ltimo, los operadores sufijos son aquellos que se colocan
detrs de los operandos. Un ejemplo no tan conocido es el operador ++ del
lenguaje C#. Este operador devuelve el valor del operador y luego le suma uno
(podemos escribir por ejemplo: a++).
ESTRUCTURAS DE CONTROL

Normalmente, el flujo de ejecucin de un programa es secuencial, porque se


ejecuta una sentencia tras otra. Las estructuras de control permiten modificar
el flujo secuencial, alterando el orden de las sentencias bajo determinadas circunstancias. En los lenguajes estructurados, existen dos estructuras de control
bsicas: la seleccin y la repeticin o iteracin. Segn el teorema de Dijkstra,
estas dos estructuras, junto con la secuencia, son suficientes para escribir cualquier programa.
La estructura de seleccin

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

En muchos lenguajes, existe otra estructura de seleccin alternativa, denominada


comnmente case o select case, que permite especificar varias alternativas por ca-

CLASIFICACIONES DE LOS TIPOS DE DATOS


Los tipos de datos pueden clasificarse en tres grupos: los ordinales, los
no ordinales y los compuestos. Los tipos de datos ordinales son aquellos
cuyos valores pueden ser ordenados
(se establece una relacin de orden
entre cualquier par de valores), como
por ejemplo, los nmeros enteros o

30

los caracteres de la tabla ASCII. Los


valores de los tipos no ordinales no
pueden ordenarse, como es el caso
de los nmeros decimales de gran
precisin o los punteros a memoria.
Los tipos de datos compuestos incluyen las cadenas de caracteres y las
estructuras de datos.

02_IntrodProg.qxd

23/7/07

20:05

Page 31

CONCEPTOS DE PROGRAMACIN ESTRUCTURADA

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

El funcionamiento de esta estructura es as: se evala la expresin, y su valor se


compara con la lista de constantes C1, C2, etctera. Si el valor de la expresin est comprendido en la lista de constantes, se ejecuta la sentencia correspondiente
(por ejemplo, si el valor de la expresin es C2, se ejecuta la sentencia 2). Si el valor de la expresin no est en la lista de constantes, y hay un sino, se ejecuta la sentencia asociada a ste, caso contrario, la ejecucin contina en la lnea siguiente.
En C#, la estructura de seleccin mltiple cumple la misma funcin, pero se
denomina switch, y su sintaxis es la siguiente:
// C#
switch(variable)
{
case 10:
HacerAlgo();
break;
case 20:
HacerOtraCosa();
break;
default:
HacerAlgoDistinto();
break;
}

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

Las estructuras de repeticin

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

CONCEPTOS DE PROGRAMACIN ESTRUCTURADA

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

el que comienza la iteracin. La segunda, la condicin para finalizar. Y la ltima


especifica la expresin que modifica el valor del contador en cada iteracin. En
este ejemplo, la sentencia HacerAlgo se ejecutar diez veces. El for de C# soporta algunas variantes que lo hacen ms complejo y potente, pero su explicacin excede el alcance de este libro.
En Visual Basic .Net, la estructura for es mucho ms sencilla e intuitiva, pero
tambin menos potente. Adems, se diferencia de la versin en C# en que debe
ser cerrado con la palabra reservada Next (siguiente). Continuando con el ejemplo anterior, en Visual Basic podemos escribir:
VB.Net
For i=1 to 10
HacerAglo()
Next

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.

ATENCIN AL LECTOR > lectores@redusers.com

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

Imprimir la palabra Hola

Subprograma B:
4
36

Imprimir la palabra Mundo

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-

mientos de Nicols Maquiavelo. En su


libro El Prncipe, Maquiavelo habla
sobre generar discordia entre los
pueblos, de manera que se separen y
as poder dominarlos ms fcilmente.
37

03_IntrodProg.qxd

23/7/07

20:41

Page 38

ELEMENTOS DE PROGRAMACIN

que necesitamos manejar no sean los mismos. Es necesario, entonces, poder


pasarle informacin adicional al subprograma. Esto se realiza mediante el uso
de parmetros o argumentos. Un parmetro es una variable que el procedimiento o funcin recibe como dato de entrada y que puede usar para cambiar
su comportamiento sobre la base del valor recibido (usando, por ejemplo, una
sentencia condicional).
Los parmetros del argumento pueden ser de entrada o de salida. Los de entrada son los que el programa o mdulo que llama le pasa al subprograma,
mientras que los parmetros de salida son aquellos que el procedimiento o
funcin utiliza para devolver informacin a quien lo llam. Es importante no
confundir un parmetro de salida con el resultado de una funcin: los parmetros de salida pueden ser usados tanto en procedimientos como en funciones, y se puede utilizar la cantidad que sea necesaria, mientras que el valor de
resultado slo se puede usar en las funciones, y no puede haber ms de uno
por funcin.
Para ilustrar el uso de funciones, retomemos el ejemplo del algoritmo de Euclides y convirtmoslo en una funcin (en pseudocdigo):
Funcion MCM(A,B)
Mientras A > 0 hacer:
Si A > B
A := A B
Si no
B := B A
Devolver A

En este caso, la funcin se llama MCM y posee dos parmetros de entrada, de


tipo numrico, A y B. La funcin MCM consiste de una nica sentencia de repeticin que hace restas sucesivas entre A y B y, finalmente, devuelve el valor
de A como resultado de la funcin.
Para entender el uso de una funcin, vamos a utilizar la funcin MCM del ejemplo anterior dentro de un procedimiento:
38

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

En el ejemplo, se pide al usuario que ingrese un nmero y se lo almacena en la


variable V1. Se hace lo mismo con la variable V2. Luego, a la variable M se le
asigna el resultado de la funcin MCM llamada con los valores V1 y V2 (los parmetros A y B del ejemplo). Por ltimo, se muestra el valor de la variable M.
mbito de variables

El mbito de una variable es el contexto o porcin de programa en el que la


variable est definida, es conocida y accesible para ser usada. Si bien cada lenguaje de programacin tiene sus propias reglas de mbito (es decir, las reglas que definen dnde es accesible una variable definida en algn punto de un programa),
los subprogramas delimitan el mbito de las variables.
Si el mbito de una variable incluye slo un subprograma, entonces se dice que
es una variable local (local al procedimiento o funcin), mientras que si abarca
todos los mdulos, la variable ser global. Una variable local slo existe mientras
se ejecuta el subprograma que la contiene, mientras que una variable global existe durante toda la ejecucin, y su valor puede consultarse o modificarse desde
cualquier punto del programa o subprogramas.
Algunos lenguajes de programacin como Pascal permiten escribir programas
dentro de subprogramas, lo cual agrega niveles extras de visibilidad o mbito
de las variables, ya que una variable local a un procedimiento puede ser acce-

USO DE PARMETROS DE ENTRADA Y DE SALIDA


Si bien un procedimiento puede tener
parmetros de salida, esto suele no
resultar en una buena prctica de programacin. A menos que no podamos
hacer otra cosa, si necesitamos devol-

ver un valor desde un subprograma,


siempre es mejor usar una funcin.
Esto dar un nico punto de salida al
subprograma, mejorando la claridad y
la legibilidad del cdigo.

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()

Al ejecutar el programa, la variable A


tendr el valor 13, como resultado de
la asignacin global que se hace en el
procedimiento C.

Procedimiento (B)
Declarar variable B1

La variable A es global al programa.

B1:=A*2

La variable B1 es local al

Llamar a C()

procedimiento B.

Procedimiento C()

La variable B1 es local al procedimiento

Declarar variable C1

B, pero como el procedimiento C

C1:=B1*3

est dentro de B, la variable B1 se

A:=C1+1

convierte en global para C. La variable

Fin procedimiento C

C1 es local al procedimiento C.

Fin procedimiento B

Figura 1. Algunos lenguajes permiten definir procedimientos


dentro de otros, extendiendo el mbito de las variables locales.

Un punto importante por tener en cuenta es que el mbito de las variables


se ve reducido cuando hay un conflicto de nombres. En los casos en que se
produzca este conflicto, el mbito se resuelve asignando prioridad a la variable que se encuentra definida ms adentro en el anidamiento de programa y
subprogramas. En estos casos, decimos que la variable de ms adentro oculta
a la de ms afuera. Esto significa que, si tenemos una variable visible desde un
procedimiento y dentro de ese procedimiento declaramos una variable con el
40

03_IntrodProg.qxd

23/7/07

20:41

Page 41

MODULARIZACIN

mismo nombre, esta ltima tendr prioridad sobre la global, y al asignarle un


valor, se asignar a la variable local.

Programa principal

Mediante esta llamada se pasa el valor de

Declarar variables A y B

B como parmetro A al procedimiento P1.

A:=2
B:=3
Llamar a P1(B)

El procedimiento P1 tiene un parmetro

Procedimiento P1(A)
Declarar variable B
B:=A*2
Imprimir B

llamado A, que por estar en un nivel de


anidamiento ms interno oculta a la
variable A del programa principal.
La variable B de P1 oculta a la variable B
del programa principal, por lo que el
procedimiento P1 imprimir el valor 6.

Figura 2. En este ejemplo, se puede ver el concepto


de ocultamiento con variables y con parmetros.
Parmetros por valor y por referencia

Existen dos formas de pasar parmetros a un procedimiento o funcin: por valor


o por referencia. Al pasar un parmetro por valor, tal como su nombre lo indica,
lo que le estamos pasando al subprograma es el valor de la variable, es decir, que el
subprograma recibe una copia de la variable original con el valor de ella. Al pasar

CUIDADO CON LAS VARIABLES GLOBALES!


Muchas veces las variables globales son tentadoras, porque evitan la
necesidad de pasar parmetros de
un subprograma a otro para utilizar
el valor de una variable. Sin embargo, en la prctica, el uso indiscrimi-

nado de variables globales no es recomendado porque dificulta el


mantenimiento del programa, dado
que es difcil determinar en qu
momento una variable global recibi algn valor.

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

En el caso de C#, el procedimiento (que en realidad es una funcin) comienza


con el tipo de dato devuelto, void, seguido del nombre del procedimiento con la
lista de parmetros entre parntesis (que en el ejemplo est vaca). La secuencia
de sentencias que compone el procedimiento en C# est delimitado por las lla42

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

LAS DLLS EN WINDOWS


El sistema operativo Windows est
formado por unas cuantas decenas de
DLLs. Un detalle interesante sobre esto es que esas DLLs poseen las funciones y procedimientos que Windows
utiliza para hacer todo lo que hace, y
estn lo suficientemente documenta-

das como para que podamos utilizarlas en nuestros programas cuando


necesitemos hacer algo que el lenguaje no tiene previsto. Este conjunto
de DLLs se denomina API (Application
Programmer Interface o Interfaz para
el programador de aplicaciones).

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.

Figura 3. En .Net podemos crear libreras de clases,


que se comportarn como libreras de enlace dinmico.
44

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.

Luego del arreglo


pueden seguir datos
de cualquier tipo.

Figura 4. Los elementos de un arreglo ocupan posiciones contiguas de memoria.


45

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

(por ejemplo, podemos indicar que


los ndices van del 50 al 100). Otros
lenguajes permiten definir el tamao del arreglo, y el primer elemento
queda fijado por una convencin de
diseo. En .Net, todos los ndices de
arreglos y colecciones comienzan
siempre en cero.

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

Obviamente, los lenguajes de .Net proveen soporte para la creacin y uso de


arreglos. En C#, los arreglos son estticos, mientras que, en Visual Basic .Net,
pueden ser dinmicos. En ambos lenguajes, los arreglos se definen declarando su
tamao y el tipo de los elementos. El primer ndice es siempre el cero.
// C# - Defino un arreglo de 2 enteros
int[] arreglo = new int[2];
arreglo[0] = 1;
arreglo[1] = 20;
VB.Net Defino un arreglo de 2 enteros
Dim arreglo(2) as Integer
Arreglo(0) = 1
Arreglo(1) = 2

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.

ESTRUCTURAS DE DATOS MS COMPLEJAS


Los arreglos y matrices son estructuras de datos bsicas. En muchas ocasiones, necesitamos trabajar con estructuras ms complejas. En .Net, disponemos de tipos de datos para manejar estructuras como listas, pilas o co-

las, entre otras. Una pila es similar a


un arreglo, en donde slo podemos colocar elementos al principio y sacar del
mismo lugar. En una cola, slo podemos ubicar elementos al final y quitar
elementos del comienzo.

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.

Desde el punto de vista de su almacenamiento en memoria, la matriz puede ser


vista como un arreglo de filas, donde cada fila es un arreglo de elementos. Visto
de esta manera, una matriz es, en definitiva, un arreglo de elementos de tipo de
dato arreglo. Es decir, un arreglo bidimensional.
A la hora de recorrer una matriz, se debe prestar atencin a no confundir los ndices de los elementos, teniendo bien presente en qu columna y en qu fila est cada
uno de los que necesitamos acceder. Dada su estructura de dos dimensiones, la forma de recorrer una matriz es mediante dos estructuras repetitivas anidadas, una para recorrer las filas y la otra para recorrer las columnas. Dependiendo del orden en
que se quiera hacer el recorrido, se iterar primero sobre las filas y luego sobre las columnas, o primero sobre las columnas y luego sobre las filas. Para saber si hemos implementado correctamente el recorrido, podemos tomar una matriz de ejemplo y se-

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;

MS ALL DE LAS DOS DIMENSIONES


Como vimos, una matriz es un arreglo de arreglos, lo cual puede verse
como un arreglo de dos dimensiones. Los lenguajes de programacin
permiten definir arreglos con la cantidad de dimensiones que necesitemos. Por ejemplo, si necesitamos

almacenar los registros de lluvia de


cada mes, de los ltimos 20 aos para 10 ciudades distintas, podemos
definir un arreglo de 10x20x12 (10
ciudades por 20 aos por 12 meses
al ao). En este caso, la estructura
se conoce como Cubo.

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

Visual Basic .Net permite cambiar el


tamao de los arreglos. Para ello, provee la palabra clave Redim. Hay que
tener en cuenta, sin embargo, que el
Redim destruye el arreglo original y
crea uno nuevo, con la consiguiente
prdida de los valores que contena.
Para evitarlo, se puede utilizar Redim
Preserve, que luego de crear el arreglo, copia los elementos del viejo.

En pocas en que la memoria de las


computadoras era escasa, muchas
veces cargar todo el programa era
imposible. La solucin consista en
colocar los mdulos en archivos separados llamados overlays. Cuando
se necesitaba ejecutar un mdulo
que estaba en un overlay, se descargaba otro de memoria y se cargaba el
que tena el mdulo necesario.

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.

THE CODE PROJECT


Aqu podremos encontrar cientos
y cientos de ejemplos de cdigo
fuente en .Net, tanto en VB.Net
como en C#. Los ejemplos estn
organizados por categora y por
nivel (desde Principiante hasta
Avanzado). Adems, la mayora
de los ejemplos estn acompaados de un artculo donde se explican sus fundamentos.
51

03_IntrodProg.qxd

23/7/07

20:41

Page 52

ELEMENTOS DE PROGRAMACIN

Figura 6. El uso correcto de comentarios, nombres significativos


e indentacin favorecen la claridad del cdigo.
COMENTARIOS

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

Cuando creamos un procedimiento o una funcin, el objetivo es realizar un


clculo o tarea especfica, por lo que el nombre que le demos al subprograma
52

03_IntrodProg.qxd

23/7/07

20:41

Page 53

EL ESTILO DE PROGRAMACIN

creado debe revelar de la mejor manera posible el objeto de su existencia. A la


hora de darles nombres a los procedimientos y funciones, se aconseja usar palabras completas y frases que indiquen cul es la tarea que el subprograma realiza, evitando las abreviaturas. Tambin es recomendable usar verbos que representen la accin por realizar.
// C# - Forma incorrecta de nombrar subprogramas
void calcRet(string fac)
int MCM(int a, int b)
// C# - Forma correcta de nombrar subprogramas
void CalcularRetenciones(string numeroFactura)
int MaximoComunDivisor(int numeroA, int numeroB)

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-

COMENTARIOS VS NOMBRES CLAROS


En la actualidad, existe una discusin
sobre si se deben usar o no comentarios para explicar qu es lo que hace
un procedimiento o funcin. Algunos
sostienen que resulta necesario colocar un comentario, mientras que otros
insisten en que, si se necesita explicar

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.

ATENCIN AL LECTOR > lectores@redusers.com

04_IntrodProg.qxd

23/7/07

20:47

Page 56

PROGRAMACIN ORIENTADA A OBJETOS

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

ban acostumbrados los programadores del momento. Se hicieron muchos intentos


por crear lenguajes orientados a objetos, pero con algunas caractersticas imperativas
y estructuradas; el nico que sobrevivi fue el lenguaje Java. En la actualidad, los
lenguajes de la plataforma .Net estn diseados de esta manera, es decir, se basan en
la definicin de clases y de objetos, pero conservan caractersticas de la programacin imperativa.

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

PROGRAMACIN ORIENTADA A OBJETOS

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

Como decamos, los objetos poseen atributos y comportamiento. Ya desde el


punto de vista de la programacin, los atributos de los objetos se traducen en
propiedades de las clases que los modelan. El comportamiento en cambio, est
representado por procedimientos y funciones dentro de la clase. En la jerga de la
programacin orientada a objetos, los procedimientos y funciones que creamos
dentro de una clase se denominan mtodos, y representan el conjunto de actividades que un objeto puede realizar, es decir, su comportamiento. Los libros ms
puristas dicen que los objetos se relacionan intercambiando mensajes, por lo que
el comportamiento de un objeto est determinado por los mensajes que puede
enviar y por los que puede aceptar desde otros objetos. Volviendo a la definicin
de mtodo, justamente, podemos decir que los mtodos son los encargados de
interceptar y de enviar mensajes desde y hacia otros objetos y, al mismo tiempo,
alterar el estado actual del objeto.
59

04_IntrodProg.qxd

23/7/07

20:47

Page 60

PROGRAMACIN ORIENTADA A OBJETOS

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-

TOMARLO CON CALMA


Muchas veces, no lograremos identificar con claridad todos los objetos
en una primera lectura. Ser necesario hacer una segunda pasada (incluso ms) sobre el texto del reque60

rimiento para encontrar objetos


ocultos, despejar ambigedades o
eliminar falsos objetos que no son
esenciales para la solucin concreta
del problema.

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

Figura 3. Con las tcnicas de anlisis, identificamos los objetos


del mundo real; luego abstraemos sus propiedades para agruparlos en clases.
PATRONES DE DISEO

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

PROGRAMACIN ORIENTADA A OBJETOS

cdigo, y ayudan a separar los intereses y responsabilidades de cada objeto. Un


ejemplo muy comn de estos escenarios son los requisitos no funcionales.
Para entender un poco mejor este aspecto, retomemos el ejemplo del sistema de
alquiler de autos e imaginemos que se nos exige que el sistema valide la tarjeta de
crdito, pero que adems el cdigo est preparado para adaptar el sistema a nuevos mecanismos de validacin. Una posible solucin es definir una clase llamada
ValidadorTarjetaCredito, con un mtodo que reciba un nmero de tarjeta y un
importe, y valide que se puede cobrar ese importe a esa tarjeta. Luego, utilizando la herencia y el polimorfismo (que veremos luego), se pueden crear nuevas clases que empleen diversos mecanismos de validacin.
A lo largo de los aos, los desarrolladores reconocieron que muchas de las soluciones que encontraban a los problemas no funcionales con orientacin a objetos comenzaban a repetirse o tenan elementos en comn y que, adems, funcionaban (es decir, cumplan su propsito). Actualmente, a estas soluciones probadas a problemas comunes, se las llama patrones. Hay distintas clasificaciones de
patrones segn la familia de problemas que atacan, siendo los ms comunes los
denominados Patrones de diseo.
El principal objetivo de los Patrones de diseo es el de proveer un catlogo
de elementos de diseo que ayuden a los programadores en su tarea diaria,
evitando que tengan que buscar nuevas soluciones cada vez que se enfrentan
con un problema comn. Adems, los Patrones de diseo facilitan la comunicacin entre los programadores, como as tambin la comprensin del cdigo
escrito por otro. Obviamente, los patrones no pretenden eliminar el trabajo
del desarrollador, ya que ste debe ser capaz de identificar las caractersticas de
cada problema y tener un dominio de los principales patrones para asociarlos
con el problema y aplicarlos.

LA BANDA DE LOS CUATRO


El tema de los patrones ha generado
gran cantidad de bibliografa. Quiz el
libro ms popular a la hora de aprender sobre patrones es Design Patterns. Elements of Reusable ObjectOriented Software. Los patrones que
62

en l se presentan, se conocen como


patrones GoF, sigla de Gang of Four
(la Banda de los Cuatro), en alusin a
sus cuatro autores, autoridades absolutas en este mbito (Gamma, Helm,
Jonson y Vlissides).

04_IntrodProg.qxd

23/7/07

20:47

Page 63

RELACIONES ENTRE CLASES

RELACIONES ENTRE CLASES


> En el mundo real, y dentro del contexto de una aplicacin que debemos implementar, los objetos no estn solos. Todo objeto se relaciona en cierta medida
con alguno de los otros objetos (sea de la misma clase o no). En el ejemplo de alquiler de autos que estudiamos anteriormente, los clientes (que son objetos) se
relacionan con los autos (que tambin son objetos) mediante la operacin de alquiler. Del mismo modo, los formularios de alquiler se relacionan con los autos
y con los clientes. Una buena regla adicional para la identificacin de objetos a
partir de un requerimiento es que, si un objeto no se relaciona con ningn otro,
es probable que no sea necesario tenerlo en el sistema o deba ser revisado para ver
si no nos falt considerar algn aspecto del requerimiento.
Un objeto puede relacionarse con otro de distintas maneras, como por ejemplo,
envindose mensajes entre s. Durante el anlisis, una vez que determinamos los objetos y definimos las clases, debemos prestar atencin a las relaciones entre los objetos, ya que debern ser modeladas para que luego se encuentren disponibles en cada instancia. Entre las relaciones ms importantes, podemos mencionar: uso, agregacin y herencia. Veamos las dos primeras ahora y dejemos la herencia para despus, ya que es muy importante y merece un tratamiento aparte.
RELACIN DE USO

En una relacin de uso, un objeto A usa un objeto B, en el sentido de utilizar


algn servicio provisto por B. En cualquier aplicacin, es muy comn encontrar
que un objeto necesita algn servicio de otro, como pedirle que haga una determinada tarea. Si retomamos el ejemplo de la validacin de tarjetas de crdito que

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

plataforma .Net) poseen an muchos conceptos de la programacin


estructurada (como por ejemplo las
estructuras de control) y eso atenta
contra la definicin formal de orientacin a objetos.
63

04_IntrodProg.qxd

23/7/07

20:47

Page 64

PROGRAMACIN ORIENTADA A OBJETOS

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

ses agregadas o compuestas. Por


ejemplo, la clase Carrito puede tener una propiedad que sea la lista
de objetos de la clase Producto que
ella contiene.

04_IntrodProg.qxd

23/7/07

20:47

Page 65

RELACIONES ENTRE CLASES

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.

MTODOS Y PROPIEDADES DE CLASE


Normalmente, los mtodos y propiedades corresponden a cada instancia de una clase (a cada objeto).
Sin embargo, muchas veces hay caractersticas que son comunes a to-

das las instancias. En estos casos,


podemos definir mtodos o propiedades compartidos, que pertenecen
a la clase y se pueden invocar directamente sobre ella.
65

04_IntrodProg.qxd

23/7/07

20:47

Page 66

PROGRAMACIN ORIENTADA A OBJETOS

HERENCIA
> La herencia es un tipo muy importante de relacin entre objetos. En una re-

lacin de herencia, una clase recibe las propiedades y comportamiento de otra


como si fuesen suyas y, al mismo tiempo, puede agregar las propias.
Veamos esto con un ejemplo. Supongamos que estamos desarrollando una aplicacin que necesita hacer clculos de superficie sobre distintas figuras geomtricas, es decir, vamos a tener objetos como Crculo, Cuadrado, Trapecio, etctera.
Dado el requerimiento que tenemos, todos los objetos presentarn un comportamiento en comn: calcular su superficie. Lo que podemos hacer entonces es
definir una clase llamada Figura y establecer una relacin de herencia entre esta
clase y cada una de las figuras particulares. Le asignamos el mtodo de clculo de
superficie a la clase Figura y, mediante la relacin de herencia, las dems clases
tendrn este comportamiento como heredado. Decimos entonces que las clases
Cuadrado, Trapecio, etctera, heredan de la clase Figura.
As como el uso define una relacin usa-a, y la composicin define una relacin
se-compone-de, la herencia se conoce como una relacin es-un. Siguiendo con el
ejemplo de las figuras, decimos que un crculo es una figura, un cuadrado es una
figura, y as con todos. Cuando una clase B hereda de una clase A, se dice que la
clase A es la clase padre o clase base, y la clase B es la clase hija, heredera o derivada. En el ejemplo anterior, entonces, la clase Figura es la clase base, y las dems, sus clases derivadas.
La relacin de herencia no se limita a un solo nivel, es decir, que una clase derivada de otra puede a su vez ser la base de una tercera clase, formando as una estructura jerrquica o de rbol. Adems, en escenarios de mltiples niveles, la relacin de

DISEAR PENSANDO EN OBJETOS


La herencia tiene una gran potencia
para escribir cdigo reutilizable, flexible y mantenible. Por eso, durante
el anlisis del problema y durante el
posterior diseo de las clases, se
debe prestar especial atencin a
66

identificar relaciones de herencia


para aprovechar sus virtudes. Conocer algunos patrones de diseo puede ayudar tambin a identificar relaciones de herencia, aun en clases
no concretas.

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

PROGRAMACIN ORIENTADA A OBJETOS

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.

Figura 7. Una clase puede redefinir un mtodo heredado


para personalizarlo segn su propio comportamiento.
68

04_IntrodProg.qxd

23/7/07

20:47

Page 69

HERENCIA

EXTENDER CLASES

La extensin es un mecanismo para agregar comportamiento y propiedades a


una clase, es decir, a todas las caractersticas que se heredan de la clase padre, se
le agregan otras propias de la clase derivada. Por ejemplo, si tenemos una clase
Persona y de ella derivamos una clase Empleado, podemos aplicar extensin agregando las propiedades Jefe y Sueldo. Si miramos este ejemplo pensando en la relacin es-un, podemos decir que un Empleado es-una persona que adems posee
un sueldo y un jefe, es decir, es una extensin.
La extensin es una de las aplicaciones ms utilizadas y naturales de la herencia, ya que sienta las bases de un buen diseo que derive en cdigo claro, mantenible y robusto.
La extensin se puede combinar con la redefinicin, para reutilizar aun ms el
cdigo heredado. Esto es, podemos redefinir un mtodo de manera tal que se
comporte exactamente igual al mtodo heredado del padre, pero que adems haga algo extra. Volviendo al ejemplo del Botn, imaginemos que queremos hacer
un botn tal que, cuando el cursor del ratn pase por encima, cambie de color.
Deberemos entonces definir una nueva clase, que herede de Button y redefinir el
mtodo OnPaint, pero en vez de escribirlo todo desde cero, llamamos al mtodo
de la clase padre para dibujar el botn, y luego, si el cursor est sobre el rectngulo que comprende el botn, le cambiamos el color.
TIPOS DE HERENCIA

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-

solver casos en que un mtodo o


propiedad existe en ms de una clase base, entonces, cul es el que
recibe la clase derivada? Tanto los
lenguajes de .Net como Java no permiten herencia mltiple.
69

04_IntrodProg.qxd

23/7/07

20:47

Page 70

PROGRAMACIN ORIENTADA A OBJETOS

piedad InstrumentoQueToca y queremos definir una clase EmpleadoDeOrquesta.


Como los empleados de orquestas son msicos (tocan un instrumento) y adems
son empleados (perciben un sueldo), podemos heredar de ambas clases para reutilizar el cdigo de cada una. Este tipo de herencia se denomina Herencia Mltiple.
CLASES ABSTRACTAS

En el ejemplo de las figuras geomtricas que vimos al comienzo, definimos una


clase Figura con un mtodo CalcularSuperficie. Ahora bien, esa clase, es una abstraccin de todas las posibles figuras geomtricas y, por lo tanto, no le podemos
definir el clculo de superficie, ya que depende de cada tipo de figura. Afortunadamente, para resolver cuestiones como sta desde el diseo, tenemos la posibilidad de crear mtodos abstractos: mtodos que estn declarados, pero que no
tienen implementacin. La implementacin de un mtodo abstracto queda relegada a las clases derivadas. Una clase que contiene al menos un mtodo abstracto se denomina abstracta.
INTERFACES

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

CLASE ABSTRACTA O INTERFAZ INSTANCIA


Una decisin que muchas veces tendremos que tomar es si optar por una
clase abstracta o por una interfaz. La
diferencia radica en dos puntos: si
usamos una clase abstracta, tendremos la posibilidad de escribir algo de
cdigo (mtodos no abstractos), para
no tener que escribirlo en cada clase
descendiente. Con las interfaces, tendremos abierta la posibilidad de heredar de otra clase.
70

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.

Figura 8. Las interfaces permiten abstraer comportamientos


y, a la vez, heredar de otra clase, proveyendo un tipo de herencia mltiple.

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

PROGRAMACIN ORIENTADA A OBJETOS

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#).

EARLY BINDING VS LATE BINDING


El trmino Binding hace referencia al
enlace entre el tipo de dato de una variable y el de su valor. Cuando el tipo de
dato que tendr un valor queda establecido en tiempo de codificacin, se
denomina Early Binding, mientras que
cuando el tipo de dato real se conoce
72

recin en tiempo de ejecucin, hablamos de Late Binding (enlace tardo).


Cuando se explota la tcnica de polimorfismo, se usa siempre Late Binding, ya que una variable se declara de
una clase, pero en ejecucin puede ser
de una clase derivada.

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;
}

El problema con esta porcin de cdigo reside en que, cuando agreguemos un


nuevo tipo de figura, tendremos que agregar tambin el caso para hacer el clculo correspondiente.
Si utilizamos objetos, podemos tener una clase abstracta Figura, con un mtodo abstracto CalcularSuperficie() y sendas clases derivadas para modelar los distintos tipos de figuras. Cada clase derivada es responsable de redefinir el mtodo
CalcularSuperficie para adaptarlo a su frmula de clculo. De este modo, nuestro procedimiento para imprimir la superficie se reduce a esto:

LA MAGIA DEL POLIMORFISMO


El polimorfismo abre las puertas a
un nivel ms de abstraccin, en el
que podemos escribir funcionalidad
sin interesar mucho cmo se va a
utilizar luego.
Un ejemplo claro de esto es el manejo de secuencias de bytes en .Net.
El Framework .Net posee una clase
llamada Stream, que representa
una secuencia de bytes.

Luego, hay clases derivadas para


leer y escribir de distintos medios,
como archivos y llamadas http, y
otros. Lo bueno es que muchos mtodos reciben como parmetro un
Stream, pero podemos pasarle lo
que necesitemos.
ste es un claro ejemplo de Polimorfismo, con una aplicacin prctica en el mundo real.
73

04_IntrodProg.qxd

23/7/07

20:47

Page 74

PROGRAMACIN ORIENTADA A OBJETOS

public void Imprimir(Figura f)


{
Console.WriteLine(f.CalcularSuperficie())
}
Cuadrado c;
...
Imprimir( c ); // un cuadrado es una figura

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.

ATENCIN AL LECTOR > lectores@redusers.com

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-

delado. Como su nombre lo indica, UML es un lenguaje. Pero no un lenguaje


de programacin como los que vimos durante todo el libro, sino uno de modelado: su propsito principal consiste en definir modelos. Por modelo, se entiende una representacin simplificada de la realidad. Adems, UML es un lenguaje
visual, es decir, toda su expresividad se basa en grficos.
El lenguaje UML naci en 1995 como resultado del trabajo en conjunto de
Rumbaugh y Booch, dos investigadores en el rea de Metodologa, que comenzaron a trabajar juntos en Racional, una compaa fundada por Booch. Luego se
les sum Jacobson, quien aport ms ideas para desarrollar lo que se convirti en
la primera versin de UML. Hasta entonces, se haban desarrollado unos cuantos mecanismos de modelado de software, pero como ninguno fue formalizado
correctamente ni estandarizado, cada ingeniero de software los aplicaba como saba y como le convena. Esto trajo como consecuencia que los modelos desarrollados fueran incomprendidos por los programadores, perdiendo su efectividad y,
por lo tanto, su utilidad. UML fue aprobado como un estndar, lo que lo convierte en una herramienta fundamental para los analistas, diseadores y arquitectos de software, que necesitan transmitir a los programadores, de forma clara y
precisa, los detalles del software por implementar.
UML consiste en un conjunto de diagramas de distintos tipos. Cada uno est destinado a cubrir alguno de los aspectos del software, y se pretende que con
UML se puedan modelar absolutamente todos los elementos de una aplicacin. Hay diagramas para modelar los objetos, sus interacciones, las interacciones del sistema con el mundo exterior (ya sean usuarios u otros sistemas). El
objetivo principal de UML es el de proveer una herramienta de comunicacin
precisa y sin ambigedades. En la actualidad, existen numerosas herramientas
que no slo ayudan a construir los diagramas en UML, sino que adems permiten validar el modelo construido contra la especificacin del lenguaje e incluso generar cdigo sobre la base del modelo.
A lo largo de este captulo, estudiaremos los principales conceptos de algunos
de los tipos de diagrama ms importantes de UML y veremos cmo se relaciona
con los conceptos de orientacin a objetos que ya hemos aprendido.
76

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

Las clases se representan mediante un rectngulo dividido horizontalmente en


tres partes. En la primera parte, se coloca el nombre de la clase; en la segunda,
las propiedades; y en la tercera, los mtodos. Recordemos que UML es un lenguaje y, por lo tanto, debemos respetar sus nomenclaturas y estndares, o el modelo que definamos no ser un diagrama UML vlido.
Nombre
de la clase

Cliente
Nombre
RealizarPago(cantidad)

}
}

Propiedades
Mtodos

Figura 1. En el diagrama de clases, cada una se representa


mediante un rectngulo con el nombre de la clase en la parte superior.

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

Para darle ms precisin al modelo, se puede especificar el tipo de dato de cada


propiedad, separndolo del nombre de la propiedad con dos puntos (Nombre:
String). Si el tipo de dato de una determinada propiedad es otra clase, estamos
ante un caso de composicin, que tiene una forma especfica en UML (que veremos luego), sin embargo, en casos en que no haya lugar a dudas es posible indicarlo como si fuese un tipo de dato bsico, como muestra la Figura 2.

Cliente
Nombre: String
Contacto: Persona
La seccin de
propiedades y de
mtodos puede
quedar vacia.

Podemos especificar los tipos


de dato de las propiedades.
En algunos casos podemos
usar clases como tipo de dato
de las propiedades.

Figura 2. Si bien es un caso de composicin, a veces,


podemos usar clases como tipo de las propiedades.
Visibilidad

En UML, se puede especificar la visibilidad de cada elemento de una clase


(propiedad o mtodo). Si bien la visibilidad es algo ms relacionado a la implementacin en un lenguaje particular, es importante indicarla en el modelo
de diseo, ya que permite dejar definidas ciertas normas de encapsulamiento
que el analista o el diseador detectan durante las primeras fases del proyecto. Si bien UML prev notaciones para los tipos de alcance bsicos, el lenguaje est abierto y permite utilizar modificadores propios del lenguaje que se utilice luego para la implementacin.

INGENIERA DIRECTA E INVERSA


Cuando se habla de modelos y, sobre todo de UML, es muy comn
mencionar a la Ingeniera Directa y
a la Ingeniera Inversa. Mediante la
ingeniera directa, se puede generar
78

el cdigo fuente que implemente el


modelo, mientras que, a travs de la
ingeniera inversa, se puede obtener
un modelo completo o parcial a partir de cdigo fuente ya escrito.

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

Figura 3. UML permite especificar la relacin de composicin,


indicando adems cuntos elementos de una clase componen a la otra.

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

Figura 4. La relacin de asociacin es similar a la composicin,


pero se utiliza una flecha para indicar el sentido de la relacin.

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

anlisis orientado a objetos, y diseo


orientado a objetos. UML est pensado para la creacin de diagramas
usando este paradigma.

05_IntrodProg.qxd

23/7/07

20:16

Page 81

DIAGRAMA DE CLASES

Herencia

La relacin de herencia tambin tiene su forma particular dentro del lenguaje


UML. La representacin de la herencia consiste en una flecha con la punta sin
rellenar (en blanco). Lo ms comn es colocar las clases derivadas debajo de la
clase base, de manera que la flecha que representa la herencia tenga sentido de
abajo hacia arriba, generando un diagrama tipo rbol. Si la clase base es abstracta, se debe colocar el nombre con letra itlica (por ejemplo, Figura). Aunque parezca una obviedad (dada la definicin de herencia) tengamos en cuenta que, en
el diagrama de las clases derivadas, no es necesario volver a indicar las propiedades y los mtodos heredados.

Escuela
+ Nombre: String

Primaria

Secundaria

Terciaria

Publica

Privada

Figura 5. La herencia se representa mediante flechas sin relleno, apuntando hacia la clase base.

En el caso de las interfaces, UML prev una forma de representarlas, como as


tambin una notacin especial para indicar la implementacin de una interfaz por
parte de una clase. Para indicar que se trata de una interfaz y no de una clase, en el
diagrama de clases se debe colocar el indicador interfaz sobre el nombre, en la pri81

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

Figura 6. Al modelar la implementacin de una interfaz, debemos volver


a indicar todas las propiedades y mtodos en la clase que la implementa.
82

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

mensaje), y el curso consulta con la universidad si se cumplen las condiciones. Si


todo est bien, el curso acepta la inscripcin del alumno.
La Figura 7 representa este escenario mediante un diagrama de secuencia.

unAlumno : Alumno

unCurso: Curso

: Universidad

SolicitarInscripcion(unAlumno)

VerificarCorrelatividades(unAlumno, unCurso)

PuedeCursar

Solicitud aprobada

Figura 7. El diagrama de secuencia muestra la interaccin


entre los objetos en un determinado escenario.

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

DIAGRAMAS DE CASOS DE USO

DIAGRAMAS DE CASOS DE USO


> Un caso de uso es un resumen de un escenario particular, que describe la
forma en que los elementos externos (usuarios u otros sistemas) interactan
con el software que se est modelando. UML permite crear diagramas para
modelar casos de uso, que resultan de gran utilidad para documentar y para
negociar con los usuarios y clientes sobre la funcionalidad que tendr el software una vez implementado.
En los diagramas de caso de uso, intervienen actores y casos de uso. Los actores
son cualquier elemento que puede interactuar con el software (usuarios, organizaciones o sistemas). Los casos de uso son secuencias de acciones que proveen algn tipo de valor para los actores. Los casos de uso se dibujan mediante valos con
su nombre adentro, mientras que los actores se representan mediante hombrecitos. Opcionalmente, puede dibujarse un rectngulo para indicar los lmites del sistema y as dejar bien claro cules son las responsabilidades que se asumirn a la
hora de la implementacin (todo lo que est fuera de los lmites, se asume que no
ser responsabilidad de los desarrolladores).
En la Figura 8, se aprecia cmo el gerente de personal interacta con el sistema de sueldos, tanto renovando contratos de personal como generando liquidaciones de sueldos. Adems del gerente, un sistema que pertenece al estado
interacta con el sistema de sueldos solicitando el clculo de los impuestos para controlar el estado impositivo de los empleados. Observemos tambin que
un caso de uso no es independiente, sino que puede utilizar a otro para cumplir su tarea (representado en la figura como una lnea que une Generar Liquidaciones con Calcular Impuestos).

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.

Otra pgina de gran inters, tambin


en idioma ingls, que se puede visitar
es Agile Modeling (www.agilemodeling.com/artifacts), que cuenta con
una seccin completa dedicada a diagramas y modelos UML.

85

05_IntrodProg.qxd

23/7/07

20:16

Page 86

UML

Sistema de Sueldos

Renovar Contratos

Gerente de Personal

Generar Liquidaciones

Calcular Impuestos

Sistema estatal de Control

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).

ATENCIN AL LECTOR > lectores@redusers.com

06_IntrodProg_ApendA.qxd

23/7/07

20:17

Page 88

EL EXAMEN

ALGORITMOS

Un algoritmo es una secuencia ordenada y sistemtica de pasos que lleva a la


solucin de un problema o a realizar cierto clculo complejo. Recordemos que se
debe tener en cuenta la importancia del orden de las operaciones. Si contamos
con una secuencia de pasos para realizar una tarea, pero en ella no importa el orden en que los llevemos a cabo, porque igual alcanzamos el objetivo, no se trata
de un algoritmo. Todo programador debe tener la habilidad para deducir algoritmos a partir de un problema, ya que esta tarea conforma el primer paso para
la implementacin de cualquier aplicacin de software.
Cuando creamos un algoritmo para un problema determinado, normalmente,
deberemos expresarlo para poder comunicarlo a los dems o para dejar documentada la idea. Existen distintas formas de expresar algoritmos, pero las dos ms comunes y ms usadas son el pseudocdigo y los diagramas de flujo. El pseudocdigo es una forma flexible y abierta de expresar algoritmos, pero sin las ambigedades del lenguaje natural. Resulta parecido a un lenguaje de programacin, pero no existen reglas precisas que deban ser cumplidas al usarlo, con lo cual cada
programador puede escribir pseudocdigo como mejor le resulte. Por otro lado,
los diagramas de flujo son una herramienta visual y ms precisa, ya que cuenta
con reglas que definen exactamente cmo debe expresarse cada tipo de estructura de un algoritmo (como por ejemplo, puntos de decisin).
LENGUAJES DE PROGRAMACIN

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

bre, y se utiliza un identificador para nombrarlas y referenciarlas en el cdigo


fuente. Las variables poseen un alcance o mbito, que determina las porciones de
cdigo desde donde se puede acceder al valor contenido en la variable.
Tipos de datos: definen el rango de valores y las operaciones que se pueden
aplicar sobre una variable. No todos los lenguajes exigen asociar un tipo de dato
a una variable (como por ejemplo Visual Basic). Los lenguajes que obligan a definir las variables con tipo, se denominan comnmente fuertemente tipados. Los
lenguajes de esta clase son ms seguros en cuanto a errores en tiempo de ejecucin, ya que permiten detectar asignaciones incorrectas a las variables durante el
proceso de compilacin del programa.
Sentencias: son acciones que pueden ser ejecutadas como parte del programa.
La principal diferencia entre sentencia e instruccin es que una sentencia puede
traducirse en cero o ms instrucciones. Una sentencia que se traduce en cero instrucciones se denomina no ejecutable. El ejemplo ms conocido de sentencia no
ejecutable son los comentarios utilizados para dejar mensajes en el cdigo fuente, que explican alguna idea o cualquier otro aspecto que el programador considere necesario para aumentar la legibilidad del cdigo. Siempre resulta una buena prctica el uso de comentarios. Las sentencias pueden ser simples o compuestas. Una sentencia simple es una sentencia en s misma, mientras que una sentencia compuesta consiste en dos o ms sentencias simples agrupadas mediante
alguna estructura de control, como puede ser un condicional.
Procedimientos y funciones: una de las tcnicas ms usadas para simplificar la
implementacin de un programa consiste en dividirlo en unidades ms pequeas
llamadas mdulos o subprogramas. Generalmente, los mdulos son implementados como procedimientos o funciones. Los procedimientos son unidades independientes que pueden ser llamadas desde cualquier otra parte del programa y
consisten de una secuencia de instrucciones que se ejecutan y terminan, pero sin
devolver nada a quien lo llam. Las funciones, en cambio, luego de ejecutarse,
devuelven un valor como resultado. Por eso, se utilizan para realizar algn clculo o alguna operacin que requiera devolver un resultado.
PROGRAMACIN ORIENTADA A OBJETOS

La programacin orientada a objetos (POO u OOP, por sus siglas en ingls) es


un paradigma de programacin que propone identificar los objetos propios del
dominio del problema por resolver, y representar sus propiedades y sus interac90

06_IntrodProg_ApendA.qxd

23/7/07

20:17

Page 91

PROGRAMACIN ORIENTADA A OBJETOS

ciones mediante el cdigo del programa. La POO permite lograr programas an


ms fciles de entender que con la programacin estructurada, ya que hay una
correspondencia casi directa entre la realidad y la representacin de esa realidad
mediante un lenguaje de programacin. Adems, utilizada correctamente, la programacin orientada a objetos permite una mayor reutilizacin de cdigo y un
mejor encapsulamiento, lo que facilita el mantenimiento tanto para corregir
errores como para agregar funcionalidades nuevas.
Los conceptos ms importantes que hay que conocer son el de clase y el de objeto. Una clase es una abstraccin de un grupo de objetos que comparten ciertas
caractersticas y comportamiento. Un objeto es un elemento particular de una
determinada clase, y como tal, posee las mismas propiedades y comportamiento
que los dems miembros de la clase, pero posee una identidad nica. Esto significa que cualquier otro objeto ser distinto, por ms que tenga las mismas propiedades. Los objetos se caracterizan por tener un estado, que consiste en el conjunto de valores de sus propiedades en una unidad de tiempo especfica.
Otro concepto importante es el de encapsulamiento. ste consiste en ocultar dentro de una clase la implementacin real de una propiedad o mtodo, de manera que
desde afuera se acceda mediante una interfaz que oculte los detalles internos. Lograr
un buen nivel de encapsulamiento es fundamental para reducir el impacto de los
cambios que harn en un futuro. Los lenguajes de .Net permiten el encapsulamiento mediante el uso de propiedades, que bsicamente son una forma de exponer atributos de la clase, pero ocultando la forma interna en que se almacena ese valor.
Muchas clases poseen las mismas caractersticas que otras, aunque tienen algunas
propias. En situaciones as, podemos hacer uso de la herencia. La herencia es una
tcnica que permite definir una clase como derivada de otra. Al hacerlo, la nueva
clase recibe o hereda todo el comportamiento y las propiedades de su clase padre.
Los programadores y analistas ms experimentados buscan crear jerarquas de herencia, de manera de aprovechar al mximo la reutilizacin de cdigo de las clases
superiores en las clases inferiores. En ocasiones, puede ocurrir que la clase base (la
clase de la que heredan las otras) no represente un conjunto de objetos concretos y
exista slo para contener comportamiento y cdigo comn. Este tipo de clases se
denominan abstractas. Algunos lenguajes permiten que una clase herede de varias,
pero esto muchas veces desemboca en un problema de implementacin. Los lenguajes de la plataforma .Net slo permiten heredar de una nica clase. En .Net (y
en Java tambin), si necesitamos abstraer una cierta funcionalidad comn a va91

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)

Cul es la utilidad de los modificadores de acceso?


A. Permiten definir el nivel de acceso de los miembros de una clase.
B. Permiten definir niveles de autenticacin y autorizacin de los mtodos
de una clase.
C. Permiten relacionar clases entre s.
D. Permiten crear instancias de clases.
La respuesta correcta es la A. Los modificadores de acceso permiten definir
quines pueden acceder a una propiedad o mtodo. Los ms comunes son
public, private y protected.

2)

Las estructuras de control selectivas:


A. Dirigen el flujo de ejecucin segn la evaluacin de expresiones.
B. Permiten ejecutar un conjunto de sentencias repetidamente una cierta
cantidad de veces o hasta que se cumpla una determinada condicin.
C. Todas las opciones son correctas.
D. Ninguna opcin es correcta.
La respuesta correcta es la A. Recordemos que las estructuras de seleccin en
la mayora de los lenguajes son dos: if y select case (o switch en C#).

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)

Un entorno integrado de programacin normalmente contiene:


A. Un editor de cdigo fuente.
B. Un compilador.
C. Un depurador.
D. Todas las opciones son correctas.
sta es bastante sencilla. Los entornos integrados de desarrollo justamente
se llaman se esa manera, porque integran todas las herramientas necesarias
para la escritura, compilacin y depuracin de programas. Por lo tanto, la
respuesta correcta es la D.

5)

Para qu sirve el encapsulamiento?


A. Permite ocultar los mtodos de una clase.
B. Permite ocultar la implementacin de los mtodos de una clase.
C. Permite identificar objetos de forma unvoca.
D. Permite generar relaciones de herencia.
Como vimos en el Captulo 4 y repasamos en este apndice, el principal objetivo del encapsulamiento es el de ocultar la implementacin de los mtodos (y
propiedades) de una clase. La respuesta correcta, entonces, es la B.

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)

A qu se denomina comnmente Cast?


A. A un conjunto de datos que sern convertidos.
B. A la conversin implcita de un objeto/tipo o tipo/objeto.
C. A una forma explicita de convertir tipos de datos entre s.
D. Ninguna opcin es correcta.
La respuesta correcta es la C. El Cast o Typecast es una conversin explcita
entre tipos de datos. Mediante la operacin de cast le estamos diciendo al
compilador que nos hacemos responsables de las consecuencias de la conversin (como prdida de precisin o, incluso, que los tipos sean incompatibles).

94

También podría gustarte