Paradigma de Programacion Con Orientacion A Objetos
Paradigma de Programacion Con Orientacion A Objetos
Paradigma de Programacion Con Orientacion A Objetos
UNIDAD N 4
PARADIGMA DE PROGRAMACIN
CON ORIENTACIN A OBJETOS
AGOSTO 2 0 1 6
Universidad Tecnolgica Nacional
Facultad Regional Crdoba
Dpto de Ingeniera en Sistemas de Informacin
Ctedra de Paradigmas de Programacin
NDICE
Objetivos de la Unidad ....6
Contenidos Abordados.. 6
1. Historia ......................................................................................................................................................... 6
2. PARADIGMA ORIENTADO A OBJETOS .......................................................................................................... 8
2.1 Conceptos Introductorios................................................................................................................... 8
2.2 Caractersticas de la POO ................................................................................................................... 9
2.3 Objeto ............................................................................................................................................... 12
2.4 Los Objetos en el Paradigma Orientado a Objetos .......................................................................... 14
2.4.1 Abstraccin .................................................................................................................................. 14
2.4.2 Identidad ...................................................................................................................................... 14
2.4.3 Comportamiento.......................................................................................................................... 14
2.4.4 Capacidad de Inspeccin.............................................................................................................. 15
2.5 Colaboraciones: Mensaje y mtodo................................................................................................. 16
2.6 Colaboradores Internos / Estado interno ........................................................................................ 20
2.7 Encapsulamiento .............................................................................................................................. 20
2.8 Interpretacin de las colaboraciones: Colaboradores externos ...................................................... 21
2.9 Polimorfismo .................................................................................................................................... 22
2.10 Mensajes a m mismo self ............................................................................................................. 23
2.11 Destruccin, Creacin y Representacin del conocimiento ............................................................ 24
2.12 Clases ................................................................................................................................................ 27
2.12.1 Definicin de comportamiento comn ................................................................................... 27
2.12.2 Cmo se crean objetos ............................................................................................................ 27
2.12.3 Clases e instancias ................................................................................................................... 28
2.12.4 Forma del cdigo Smalltalk ..................................................................................................... 28
2.13 Relaciones entre clases .................................................................................................................... 29
2.13.1 Asociacin ................................................................................................................................ 29
2.13.2 Agregacin / Composicin....................................................................................................... 30
2.13.3 Generalizacin / Especializacin ............................................................................................. 31
2.14 Reutilizacin ..................................................................................................................................... 32
O BJETIVOS DE LA U NIDAD
Que el alumno comprenda acabadamente los mecanismos fundamentales que dan origen a este
paradigma.
Que el alumno utilice para la resolucin de problemas un lenguaje con OO puro en su concepcin y
representacin.
C ONTENIDOS A BORDADOS
Lenguaje asociado: Smalltalk. Pharo 3.0. Imagen, ambiente de objetos, definicin y uso de clases y
objetos.
1. HISTORIA
Simula 67 (1967): Precursor de la tecnologa de objetos, tal cual se la conoce actualmente. Fue el
primero de los lenguajes orientado a objetos. Varios aos despus de su desarrollo, casi todos los lenguajes
modernos comenzaron a utilizar sus principios de orientacin a objetos. As fue como se popularizaron
trminos como clases, objetos, instancias, herencia, polimorfismo, etc.
Ao 1969: Alan Kay (personaje fundamental de la informtica) Matemtico, Psiclogo, Computlogo y
Msico Estudi como mejorar el proceso cognitivo utilizando herramientas informticas. Estudi dentro del
MIT como los nios llegaban a conceptualizaciones y abstracciones complejas a travs de juegos con LOGO.
En la dcada del 60 estaban en auge los Mainframes; Alan Kay propuso que computadora se necesitara
para favorecer el proceso cognitivo. Defini conceptualmente a DYNABOOX (Computadora personal tipo
agenda, que tuviera todo lo necesario para comunicarse con otras personas) Esta deba contener todo lo
necesario, sino que siempre disponible, lo que constituyo las bases de los ordenadores porttiles y tablet PC
actuales, considerado por algunos como el arquitecto de los sistemas modernos de ventanas GUI (Interfaz
Grfica de usuario).
Ao 1970: Xerox funda el Centro de Investigacin de Palo Alto (PARC - Palo Alto Research Center). Alan
Kay fue uno de los miembros principales del centro, desarrollando prototipos de estaciones de trabajo en
red, usando el lenguaje de programacin SMALLTALK. Estas invenciones fueron posteriormente
comercializadas por APPLE en el APPLE MACINTOSH.
Alan Kay se dedica a construir su DINABOOK (Hw y Sw). Hardware, pequeo, autnomo, con
almacenamiento y capacidad grfica + mouse, diseando entonces el concepto de interfaz grfica tal cual lo
conocemos en la actualidad. En forma conjunta hubo que generar un proyecto de Software que deba ser
intuitivo, fcil de usar y de entender. Este proceso fue liderado por Adele Goldberg, tomando como idea a
las propuestas de Simula y surge SMALLTAK (1972).
Ao 1976: Se entrega la 1er versin a Empresas, Universidades y Laboratorios. Lo importante es que el
mismo responde e implementa las ideas de Alan Kay. Smalltalk es el nico ambiente de objetos puro que ha
tenido difusin comercial
Ao 1980: Xerox PARC da por finalizado el proyecto. En este punto comienza a haber distintas
corrientes e implementaciones del POO. Adele Goldberg funda una empresa que comercializa a SMALLTALK
como entorno de desarrollo para grandes empresas.
Ao 1984: aparece SMALLTALK-V que fue pensado para utilizarse en una arquitectura de PC-IBM bsica.
Ao 1986 - 1990: Aparece C++ es un diseado a por Bjarne Stroustrup. La intencin de su creacin fue el
extender al exitoso Lenguaje de programacin C, con mecanismos que permitan la manipulacin de
Objetos. En ese sentido, desde el punto de vista de los Lenguajes orientados a Objetos, el C++ es un lenguaje
hbrido. Esta idea no fue considerada como muy brillante, pero este nuevo lenguaje tuvo un xito rotundo.
James Rumbaugh, propone la metodologa OMT (Object Modeling Technique) que es una de las
metodologas de anlisis y diseo orientadas a objetos, ms maduras y eficientes que existen en la
actualidad. La gran virtud que aporta esta metodologa es su carcter de abierta (no propietaria), que le
permite ser de dominio pblico.
Bertrand Meyer: Hace un enfoque diferente de la Orientacin a Objetos el que se soporta desde la
Teora de la Computacin, desarrollando EIFFEL. El cul es ms OO que C++ pero mucho menos que
SMALLTALK, el cul es admitido en sus principios constitutivos pero que aporta e incorpora mocho de
Ingeniera de Software, permitiendo construir software de alta calidad y seguro. No tiene gran aceptacin en
software comercial.
Brad Cox desarrolla Objective-C ( Mas cerca de Samalltalk que C). Es un lenguaje de programacin
orientado a objetos creado como un superconjunto de C para que implementase un modelo de objetos
parecido al de Smalltalk. Originalmente fue creado por Brad Cox y la corporacin StepStone en 1980. En
1988 fue adoptado como lenguaje de programacin de NEXTSTEP
Luego aparecen los metodlogos (Jacobson, Booch, Cood, Jourdon, Palmer, Rebeca Wirsf-Brook) y ms
tarde UML (Jacobson, Rumbaugh, Booch)
Ao 1997: Alan Kay ya en Disney colabor en la creacin del proyecto SQUEAK, el entorno OO, basado
en SMALLTALK para la creacin y experimentacin multimedia. Trabaja en forma conjunta con Ian Ingalls
(Arquitecto de la Mquina virtual SMALLTALK). SQUEAK es una mquina virtual SMALLTALK construida en
SMALLTALK. Como aspecto sobresaliente es que: Es un proyecto abierto y corre en todas las plataformas de
Hardware existente.
En marzo de 2008 comenz el proyecto Pharo, como una bifurcacin de Squeak 3.9. La primera versin
beta 1.0 fue liberada el 31 de Julio de 2009.
Actualidad: Recientemente Alan Kay, comenz a trabajar en el Proyecto Croquet, que busca ofrecer
un entorno 3D en red de cdigo libre para el desarrollo colaborativo.
La programacin orientada a objetos o POO (OOP segn sus siglas en ingls) es un paradigma de
programacin que usa objetos y sus interacciones, para disear aplicaciones y programas informticos. Est
basado en varias tcnicas, incluyendo herencia, abstraccin, polimorfismo y encapsulamiento. Su uso se
populariz a principios de la dcada de los aos 1990. En la actualidad, existe variedad de lenguajes de
programacin que soportan la orientacin a objetos.
Pensar en programar como una entidad viva en la computadora, en donde los objetos evolucionan,
modificndose a s mismos de acuerdo a ciertos factores.
Programar con Orientacin a Objetos: Para construir un programa usando orientacin a objetos, el primer
concepto con el que voy a trabajar, y lo primero que va a saltar a la vista, es el del trmino de objeto.
Rpidamente, un objeto es una unidad de software de la cual lo que me importa es: qu le puedo preguntar
y/o pedir, y a qu otros objetos conoce. Los objetos responden a los pedidos interactuando con los otros
objetos que conoce, y as se va armando una aplicacin.
O sea, en vez de enfocarse en rutinas, variables, funciones, punteros, etc.; nos introduce a pensar en
objetos: con qu objetos voy a interactuar, sus caractersticas, qu les voy a poder preguntar, con qu otros
objetos tienen que interactuar estos, y otras cosas que surgen a partir de estas.
De hecho, el resultado de la tarea va a ser la descripcin de estos objetos, cmo se conocen entre ellos, y
cmo interactan.
Caractersticas
Comportamiento
Pedido
Invocacin de mtodo
Objeto A Objeto B
(objeto emisor) (objeto receptor)
Respuesta
Ejecucin del mtodo como respuesta
definir nuevos tipos de entidades en el mundo real. La abstraccin es clave en el proceso de anlisis
y diseo orientado a objetos, ya que mediante ella podemos llegar a armar un conjunto de clases
que permitan modelar la realidad o el problema que se quiere atacar.
Encapsulamiento: Significa reunir a todos los elementos que pueden considerarse pertenecientes a
una misma entidad, al mismo nivel de abstraccin. Esto permite aumentar la cohesin de los
componentes del sistema. Es comn que se confunda este concepto con el principio de ocultacin,
principalmente porque se suelen emplear conjuntamente.
Principio de ocultacin: Cada objeto est aislado del exterior, es un mdulo natural, y cada tipo de
objeto expone una interfaz (protocolo) a otros objetos que especfica cmo pueden interactuar con
los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su
modificacin por quien no tenga derecho a acceder a ellas, solamente los propios mtodos internos
del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el
estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e
interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los
datos internos del objeto de una manera controlada y limitando el grado de abstraccin.
Objeto externo
Miembros
Privados
Herencia: las clases no estn aisladas, sino que se relacionan entre s, formando una jerarqua de
clasificacin. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que
pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los
objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden
compartir (y extender) su comportamiento sin tener que volver a implementarlo. Esto suele
hacerse habitualmente agrupando los objetos en clases y estas en rboles o enrejados que reflejan
un comportamiento comn. Cuando un objeto hereda de ms de una clase se dice que hay
herencia mltiple.
2.3 OBJETO
Es una abstraccin que utilizaremos como representacin computacional de una entidad de la realidad
tiene unas propiedades particulares (atributos) y una forma de operar con ellas (mtodos).
Cosas en lo que se toca es slo un soporte: un libro, una pelcula, un artculo en una revista, un
contrato, una ley;
Cosas bien abstractas: un nmero, un conjunto, un nombre, una letra, una funcin matemtica
OBSERVADOR
Para comprender mejor el concepto de objeto emisor y receptor y porque del envo de mensajes,
introduciremos el concepto de Observador.
Un objeto es cualquier ente o entidad que tiene alguna utilidad/significado/sentido para el que tiene
que trabajar con l, esto quiere decir que nos va a interesar quien va a trabajar/interactuar con el objeto,
ese alguien por ahora lo vamos a llamar observador y vamos a suponer que los observadores son
personas.
Distintos observadores van a ver distintos objetos. Es probable que en la visin de un carpintero que
describe su negocio aparezcan sillas y no aves, mientras que en la de un ornitlogo (bilogo especializado en
aves) lo ms probable es que pase lo contrario.
Un observador tampoco es alguien en abstracto, es alguien haciendo algo/en un rol; los objetos que va
a ver son aquellos con los que necesita interactuar de alguna forma para poder cumplir su rol. Esto se logra,
asumiendo el Rol de analista y produciendo un recorte de la realidad.
Armar modelos y trabajar en base a ellos es la forma que encontramos las personas para poder pensar
acerca del mundo complejo en el que vivimos
Por lo tanto un Objeto ser una representacin esencial de entes de la realidad, el cul adems tendr
definido ciertos comportamientos, que sern requeridos por otros objetos que interacten con l.
REALIDAD
DOMINIO
ENTE
OBSERVADOR
Visin Aristotlica -> El Observador
recorta la realidad para observar el
Dominio como un observador
Contrapartida computacional que representa externo
(Modela esencialmente) un ente del dominio del
Problema -> OBJETO
Entonces, siempre que hablamos de un Objeto estamos diciendo tambin que ese objeto existe
porque hay alguien que lo observa, alguien que reflexiona sobre su existencia.
Si recordamos que un programa orientado a objetos es un conjunto de Objetos que colaboran entre
s envindose mensajes, podremos inferir que existirn algunos objetos que sern observados y otros
observadores.
Ahora la figura del observador cambi, ya no es una persona que lo modela, sino un objeto que es
capaz de interactuar con otro, por lo tanto habr que analizar en el conjunto de objetos cuales son los que
interviene.
Capacidad de inspeccin
2.4.1 ABSTRACCIN
Un Objeto es una abstraccin que utilizamos como una representacin computacional de entes de la
realidad, el cul responde a dos caractersticas:
Esenciales: aquellas que hacen que el ente sea lo que es, que no pueden cambiar, que si falta algo
ya no es lo que era.
Accidentales: Un ente puede poseerlos, pero si no los tuviera o se lo cambiara, no dejara de ser lo
que es. (color, tamao, etc.)
Representacin esencial
Un Objeto es una abstraccin que utilizamos como representacin computacional de entes de la realidad.
Una abstraccin no simplifica la realidad, sino que modela sus caractersticas esenciales representadas a
travs de su comportamiento
Los objetos en la orientacin a objetos son las representaciones computacionales de los entes con los
que vamos a interactuar.
2.4.2 IDENTIDAD
La identidad es una caracterstica intrnseca de los objetos. Un buen nombre cierra una idea. Identidad
es diferente a igualdad. Para verificar una igualdad se deben comparar dos objetos y con un criterio
definido.
2.4.3 COMPORTAMIENTO
Un objeto tambin queda representado por su comportamiento, el cual estar definido por el conjunto
de mensajes que el objeto pueda responder (para que sirve, como utilizarlo, etc.). Este conjunto de
mensajes que el objeto puede responder se lo denomina Protocolo.
m1
m2
m3
Los mensajes, son el vocabulario que el objeto es capaz de entender, es lo que hay que saber para
poder comunicarse con l.
Protocolo
Conjunto de mensajes que un objeto puede responder. O planteado desde otro punto de vista las reglas
a cumplir para poder comunicarse con un objeto.
A travs del protocolo de un objeto, definimos la utilidad del ente que estamos representando, o sea su
esencia.
extraer: unMontoDeDinero
depositar: unMontoDeDinero
consultarSaldo:
El vocabulario que entiende el objeto (Su Protocolo) es el LENGUAJE DEL DOMINIO, y por lo tanto no
debe estar expresado en trminos de computacin sino del dominio.
MENSAJE
MTODO
m1
m2
m3
La idea esencial, es que el mtodo le indica al objeto que hacer para cada mensaje que puede recibir.
Le enva mensajes. Un mensaje es cada una de las formas posibles de interactuar con un objeto. Para
pedirle algo a un objeto, lo que hago es enviarle un mensaje. Cada objeto entiende un conjunto acotado de
mensajes (Protocolo)
S es posible (y altamente deseable, como veremos mas adelante) que haya muchos objetos capaces de
entender el mismo mensaje, incluso aunque sean bastante distintos entre s. Eso permite ir armando un
vocabulario mediante el cual uno interacta con los objetos.
hay un emisor
hay un receptor
hay un nombre, que identifica el mensaje que estoy enviando entre todos los que entiende el
receptor.
mensaje: cada una de las formas posibles de interactuar con un objeto, que se identifica por un nombre y
puede llevar parmetros.
envo de mensaje: cada interaccin con un objeto. Tiene: emisor, receptor, selector, eventualmente
parmetros (que son objetos), y eventualmente un resultado (que es otro objeto).
Pedido
Invocacin de mtodo
Objeto A Objeto B
(objeto emisor) (objeto receptor)
Respuesta
Ejecucin del mtodo como respuesta
Donde objeto destino es el nombre que le di al objeto en el entorno en donde estoy escribiendo el
cdigo. Y mensaje ser el nombre del selector del mensaje propiamente dicho.
Para poder especificar un MTODO debo pedir identificar con mis colaboradores.
Podemos pensar en dos tipos de colaboradores:
Habituales (internos)
Eventuales (externos)
Colaboradores internos
m1: c externo
C1 m2
C2 m3
mX
Lo que yo conozco de mis colaboradores es su nombre (como yo me refiero a ellos, en general un rol);
El Objeto mX puede colaborar con c1 y c2 (siempre) y con c externo (siempre que responda a m1).
El protocolo del objeto es PBLICO, y la definicin de mtodos y colaboradores es PRIVADA, es interna
al objeto. Esta parte interna es la implementacin del objeto, y est encapsulada. Puede ser cambiada en
cualquier momento mientras se mantenga invariante su protocolo pblico. Esto es lo que se conoce como
ENCAPSULAMIENTO.
Cuando un objeto enva un mensaje a otro, SIEMPRE recibe como respuesta un OBJETO. En SmallTalk
ampliamos el concepto de colaboracin.
mensaje m1: c
Objeto nulo (nil)
Puede ser:
objeto
Objeto no nulo
Aspecto sintctico
Un objeto conoce a otro cuando puede hacer una asignacin de un nombre a un objeto.
El mtodo es donde se escribe el cdigo que alguien deber programar, donde programar quiere
decir: indicar qu mensajes va a entender el objeto (su protocolo), y para cada uno de estos mensajes
(selectores) existe un Mtodo donde se escribe el cdigo que se va a ejecutar cuando el Objeto reciba este
Mensaje.
O sea: fue un programador el que decidi que el Objeto va a entender un determinado mensaje y
escribi el cdigo asociado a ese mensaje. Ese cdigo es el que se va a ejecutar cuando se invoque el
mensaje.
La seccin de cdigo que se asocia a un mensaje se llama mtodo. Un mtodo tiene un nombre, que es
el del mensaje correspondiente; y un cuerpo, que es el cdigo que se ejecuta.
Mtodo: seccin de cdigo que se evala cuando un objeto recibe un mensaje. Se asocia al mensaje
mediante su nombre.
Corolario: casi todo el cdigo que escribamos va a estar en mtodos, que definen qu mensajes
entiende cada objeto, y determina qu hacer cuando los recibe.
La nica forma que tengo de interactuar con un objeto es envindole mensajes. Los nombres de
mensaje con un parmetro terminan con dos puntos, eso indica que atrs viene un parmetro; los dos
puntos forman parte del nombre.
2.7 ENCAPSULAMIENTO
Se puede cambiar la implementacin de un objeto, y el usuario de ese objeto no se enter.
Cmo logramos esto? Porque no cambiamos el protocolo del objeto, o sea el conjunto de mensajes
que entiende; y lo nico que ve el usuario del objeto son los mensajes que entiende, no ve cmo el objeto
lo implementa adentro suyo (mtodos y estado interno).
Trabajando en Smalltalk, el Observador no tiene forma de conocer la forma del estado interno de un
objeto, ni sus valores; y tampoco puede acceder a detalles sobre cul es la implementacin que est detrs
de los mensajes que le enva. Lo nico que conoce es el comportamiento que el objeto exhibe (Protocolo);
siendo lo nico que necesita conocer para poder interactuar con el objeto.
Esta idea de que un observador no ve todos los aspectos de un objeto sino solamente aquellos que le
sirven para interactuar con l se llama encapsulamiento; la idea del nombre es que los aspectos internos del
objeto se encapsulan de forma tal que los observadores no pueden verlos.
La idea de encapsulamiento tambin puede observarse en la relacin que nosotros tenemos con l.
Al encapsular un objeto, estoy al mismo tiempo acotando y explicitando (haciendo explcitas) las formas
posibles de interaccin; slo se puede interactuar con un objeto mediante el comportamiento que exhibe.
Esto nos da varias ventajas que pasamos a comentar.
Como las formas de interaccin son acotadas y las maneja quien programa el objeto, se hace ms
sencillo probar si un objeto se comporta correctamente.
Tambin resulta ms controlable cualquier cambio que haga en la implementacin, siempre que
respete el conjunto de mensajes definidos (protocolo)
A su vez, como es ms sencillo probar si un objeto funciona bien o no, se simplifica darnos cuenta si
con un cambio de implementacin rompemos algo.
Otro efecto es que al explicitar el comportamiento lo estamos documentando, entonces para alguien
que quiera usar el objeto que construimos es fcil saber qu usos le puede dar y cmo usarlo. De alguna
forma el comportamiento que exhibe el objeto forma un manual de uso.
Eso se potencia si seguimos la sabia poltica de poner abajo del nombre de cada mtodo un comentario
que explica qu se puede esperar, como lo hicimos en los ejemplos de cdigo. Es una convencin de
Smalltalk que definitivamente conviene respetar en el cdigo que escribamos nosotros.
En Smalltalk no hay forma de que un usuario del objeto acceda a la variable (Colaborador Interno),
entonces es necesario. Adems, el definir el mensaje permite hacer cambios de implementacin que resulta
lo ms conveniente.
Resumiendo encapsulamiento: quien usa un objeto slo ve lo que necesita para poder interactuar con
l, que el comportamiento que exhibe. Los detalles internos quedan encapsulados en el objeto. Y as quedan
acotadas y explicitadas las formas posibles de interactuar con un objeto.
Esto significa que el de la izquieda pone un nombre y, por ejemplo, asigna la identificacin de algn objeto.
Podemos pensar la colaboracin como un canal por el cual enva colaboradores y recibe un objeto como
resultado. En este momento termina la colaboracin y se cierra el canal (esto es una metfora, los objetos
no viajan de un lado al otro, sino que se manejan referencias, viajan las identidades de los objetos).
Relacin de conocimiento
Si envo un colaborador externo, es porque el destino es quien colabora con l. Si recibo un objeto, es
porque quiero colaborar con l (enviarle mensajes).
El receptor del mensaje no tiene idea de quien le enva el mensaje (no puede dialogar, no es cliente
servidor). Esto es bueno porque est totalmente desacoplado; los objetos estn preparados para responder
a cualquiera que le enve le mensaje.
El emisor, asume que existe un objeto con capacidad de responder al mensaje que envo.
El nico error que podra ocurrir es que un objeto reciba un mensaje que no entiende:
La colaboracin -> un contrato entre emisor y receptor. El emisor debe escribir bien el mensaje y
enviar un colaborador externo que sepa hacer cosas que requiere el receptor. Por su lado el receptor debe
devolver un objeto que sepa hacer cosas que requiere el emisor.
Gap Semntico
Representacin del
FIG. 5.8 MODELADO EN POO
ente de la realidad
2.9 POLIMORFISMO
Dos o ms objetos son polimrficos respecto de un conjunto de mensajes si todos ellos pueden
responder de manera semnticamente equivalente, an si su implementacin es distinta.
Se dice que un objeto es polimrfico con otro cuando un determinado observador no puede
distinguirlos entre si. Como en Smalltalk no se puede observar un objeto ms que envindole mensajes, un
objeto es polimrfico con otro cuando un determinado observador les enva un conjunto de mensajes y
ambos responden de manera indistinguible.
Tipo= {m1, m2, ...} conjunto de mensajes con un nombre (es un protocolo, no un tipo tradicional).
: el objeto e conforma con el protocolo T1 (puede responder los mensajes elementos de T1). La
interface de java hace algo parecido.
Para que un Lenguaje, pueda interpretar el Polimorfismo, debe necesariamente poseer binding
dinmico o tardo (Ligadura en tiempo de ejecucin).
Ahora el oficial nos pide a nosotros, que programamos al cliente, que le agreguemos la capacidad
de entender el mensaje montoTotalCredito, que es la suma de los dos anteriores.
Cuando escribo un mtodo, estoy parado en el objeto que va a recibir el mensaje que estoy
habilitando, en este caso el cliente.
Si soy el cliente y me preguntan mi montoTotalCredito, lo que tengo que devolver es la suma entre
mi montoTopeDescubierto y mi montoCreditoAutomatico.
Estos dos montos cmo los obtengo? Envindome los dos mensajes a m mismo, para no repetir
las cuentas que estn en esos dos mtodos.
Y cmo hago para enviarme mensajes a m mismo? Fcil, usando la palabra clave self que incluye
el Smalltalk. Self es exactamente yo mismo, enviarle un mensaje a self es envirmelo a m, donde
Entonces queda
montoTotalCredito
La definicin formal:
Self: en un mtodo, referencia al objeto que recibi el mensaje correspondiente, que sirve para enviarme
mensajes a m mismo
DESTRUCCION
MIOBJ
Ventana Cualquier
C.A Objeto
Un nmero
4
2 1 3
1 2 3
Analicemos a MIOBJ de la figura anterior - Nadie lo referencia, nadie lo conoce, entonces, nadie lo
puede alcanzar... Ok Quin lo destruye?
Alternativas:
Entonces no le puedo decir que 1 mate a MIOBJ pues 1 no sabe que existen 2 y 3.
Tengo que tener un objeto que sepa que un MIOBJ se convirti en basura. Entonces aparece la
figura del garbage colector (recolector de basura).
Smalltalk, Java, Python, entre otros, tienen un Garbage Collector que automticamente libera
memoria, el mismo se encarga de destruir los objetos que no estn referenciados, es decir, cuando un
objeto deja de estar referenciado es desalojado y liberada la memoria.
CREACIN
crear
Creador de C.A.
Colaboradores Depositar
internos Extraer
Saldo
El creador de CA sabe. Tiene el conocimiento de cmo crear CA. Es una fbrica de CA. Y le mando
el simple mensaje CREAR.
Suponiendo que tengo una CA le mando el mensaje clone y l hace una copia igual pero con identidad
diferente. En el momento de nacer el nuevo objeto era igual al que estoy clonando, luego ya est en
condiciones y sabe como recibir mensajes y hacer movimientos.
Entonces puedo hacer un clon bsico y luego le agregamos comportamientos para que a partir de
un objeto bsico pase a ser una CA (o lo que sea)
El creador de CA no sabe COMO crear un CA sino que sabe QUE es un CA. O sea que le puedo
preguntar cul es el protocolo de esa CA? y adems le puedo ampliar ese conocimiento y decirle que
ahora las CA puedan informar sus movimientos.
crear
Hemos dado un salto de abstraccin. No slo representan entes de la realidad sino conceptos de la
realidad.
crear
Caja de Ahorro
Una Caja al recibir un mensaje saldo le puede pedir a Caja de Ahorro que me diga cmo responder
al mensaje SALDO. Ergo Caja de Ahorro es un REPOSITORIO de todos los comportamientos de todos los
mtodos de todos los objetos usados a partir del CONCEPTO que posee Caja de Ahorro
Este ltimo, el Clonado o POO basado en prototipos podra tener CA con comportamiento distinto,
en cambio en el claseado todas las CA tienen el mismo comportamiento.
En el clonado puedo conocer un conocimiento inicial y luego voy expresando como aumento mi
conocimiento de manera inductiva. Si aparece alguno nuevo, lo copio y le pongo las diferencias.
En la implementacin por Clases puedo abstraer y definir la clase con las todas las caractersticas
comunes.
El conocimiento est en los objetos y el protocolo que sabe responder. Desde ahora y en lo que se
basa la potencialidad del paradigma es que puedo Inspeccionar un objeto, ver sus mtodos y ver sus
colaboradores internos. En este contexto el del POO puro, el concepto de Programar ser INSEPCCIONAR
CLASES (objetos que representan clases.)
2.12 CLASES
Hasta ahora hemos trabajado con objetos que creamos y tienen su propio comportamiento, el cul
es distinto al de todos los dems.
Es hora de hacernos algunas preguntas Qu pasa si quiero tener objetos que se comporten de la
misma manera? Tengo que codificar lo mismo de nuevo cada vez?
Como ya hemos vistos en creacin de objetos, la forma ms habitual (aunque no la nica Existen
dos formas: clases y prototipos) de resolver ese problema es a partir del concepto de clase. En lugar de
definir cada objeto por separado, defino una clase con las caractersticas que sern comunes a los objetos, y
luego voy a crear los objetos a partir de esta clase.
Lo primero en que pensamos es que todos los objetos compartan los mismos mtodos.
Por otro lado, cada objeto tendr la necesidad de poder representar un determinado estado, el cual
se reflejar de acuerdo a su estado interno.
Hasta aqu en ningn momento nos ocupamos del problema de la creacin de los objetos; La
aparicin del concepto de clase nos permite describir con precisin cundo y cmo se crean objetos
El hecho de crear la clase y definir sus variables y mtodos no crea ningn objeto. Una clase ser el
molde a partir del cual se crearn objetos a instancia de la clase.
Esto me devolver un objeto nuevo, de la clase NombreClase. Decimos que este nuevo objeto es
instancia de la clase, ya que fue creado utilizando a la clase como molde.
NombreClase new
es una instancia de la clase NombreClase, y que en realidad es un objeto. La palabra instancia se usa
cuando queremos remarcar la relacin entre los objetos y las clases,
clase: molde a partir del cual se crean los objetos; y en el que se definen los mtodos y el conjunto de
variables que tendrn los objetos que se creen a partir del molde
Instancia: cada objeto es instancia de la clase que se us como molde para crearlo. Cada objeto es instancia
de exactamente una clase.
Las instancias de una clase entienden, y tienen la capacidad de responder los mensajes para los
cuales hay mtodos definidos en la clase.
Se definen clases.
Los mtodos se escriben en las clases, y las variables se definen para las clases. O sea, todo
el cdigo est en las clases, excepto el que ponemos en ventanas de interaccin.
Los objetos se crean instancindolos, para lo cual se usa la sentencia: Clase new.
2.13.1 ASOCIACIN
Es una relacin entre clases. Diremos que dos (o ms) clases tiene una relacin de asociacin cuando
una de ellas tenga que requerir o utilizar alguno de los servicios (es decir, acceder a alguna de las
propiedades o mtodos) de las otras. Se da cuando una clase usa a otra clase para realizar algo.
Las relaciones de asociacin crean enlaces entre objetos. Estos enlaces no tienen por qu ser
permanentes (en la mayora de los casos, no lo son). Los objetos deben tener entidad fuera de la relacin (a
diferencia de las relaciones de composicin).
Esta relacin permite asociar objetos que colaboran entre si. Cabe destacar que no es una relacin
fuerte, es decir, el tiempo de vida de un objeto no depende del otro.
Para validar la asociacin, la frase Usa un, debe tener sentido, por ejemplo:
Un ejemplo grfico:
Esta relacin es utilizada cuando una clase se compone de otras clases, es un tipo de asociacin que
indica que una clase es parte de otra clase.
Se presenta entre una clase TODO y una clase PARTE que es componente de TODO. La
implementacin de este tipo de relacin se consigue definiendo como atributo un objeto de la otra clase
que es parte-de.
Los objetos de la clase TODO son objetos contenedores. Un objeto contenedor es aquel que
contiene otros objetos.
La pc tiene un teclado
Un ejemplo grfico:
Tiene 1 Docente
Docente
Agregacin: La agregacin implica una composicin dbil, si una clase se compone de otras y
quitamos alguna de ellas, entonces la primera seguir funcionando normalmente, por ejemplo
un objeto de tipo Agenda tiene una lista de objetos de tipo Contacto, si quitamos algn objeto
de tipo Contacto no afectamos la estructura bsica del objeto de tipo Agenda.
El tiempo de vida de un objeto est condicionado por el tiempo de vida del objeto que lo
incluye, por ejemplo si tenemos una objeto de tipo Silla, que est compuesto de cuatro objetos de
tipo Pata, si eliminamos un objeto de tipo pata, quedar con tres, lo cual rompe la definicin original
que tena el tipo Silla, La silla no puede existir sin sus patas.
De todas las relaciones posibles entre las distintas clases y objetos, hay que destacar por su
importancia en O.O la relacin de herencia, sta es una relacin entre clases que comparten su estructura y
el comportamiento, la estudiaremos ms en detalle en la seccin 2.15.
Un ejemplo grfico:
Persona
Alumno Docente
2.14 REUTILIZACIN
Hay dos mecanismos en POO para aplicar reutilizacin, es decir, para construir clases utilizando otras
clases:
Composicin: Una clase posee objetos de otras clases (relacin tiene un). Se puede
reutilizar los atributos y mtodos de otras clases, a travs de la invocacin de los mensajes
correspondientes.
Herencia: Se pueden crear clases nuevas a partir de clases preexistentes (relacin es un).
Se puede reutilizar los atributos y mtodos de otras clases como si fueran propios.
2.15 HERENCIA
La herencia es un mecanismo que permite la definicin de una clase a partir de la definicin de otra ya
existente. Es la caracterstica clave de los sistemas orientados a objeto para propiciar entre otros aspectos
la reusabilidad.
En general el concepto de herencia, se refiere al mecanismo por el cual los objetos comparten
comportamiento. En el mundo de las clases se denomina herencia, mientras que en el de los prototipos
recibe el nombre de delegacin; en esta forma alterna de implementar conocimiento comn, la distincin
entre clases e instancias no es necesaria: cualquier objeto pueden ser un prototipo.
Es por esto que existen dos estrategias bsicas, para implemetar el modelo de herencia: Clases-Herencia
y Prototipos-Delegacin:
Las clases se organizan jerrquicamente, y una nueva clase puede reutilizar la estructura y
comportamiento de otras previamente definidas.
Jerarqua de Clases
Alumno
Alumno A Particular
Universitario
Las clases no suponen una necesidad prctica en el desarrollo orientado a objetos, los lenguajes
basados en prototipos prescinden de ellas y sus funciones se llevan a cabo mediante mecanismos
alternativos.
Los objetos pueden ser de dos tipos generales, las Las clases actan como colecciones de
clases y las instancias. Las clases definen la comportamiento (mtodos) y estructuras que son
disposicin y la funcionalidad bsicas de los iguales para todas las instancias, mientras que las
objetos, y las instancias son objetos "utilizables" instancias llevan los datos de los objetos.
basados en los patrones de una clase particular.
Hay una distincin entre la estructura y el Hay una distincin del estado.
comportamiento.
El objeto tiene uno o ms atributos parent, de forma que cuando no puede responder a un mensaje, le
reenva ste a su padre.
Existe una cadena de objetos apuntando a sus padres, hasta llegar a un objeto padre de todos.
El objeto est compuesto por las partes que define cada una de las clases de las que hereda.
Todos los atributos y mtodos heredados estn disponibles en el mismo objeto (si bien se necesita la cla
se para poder interpretarlos).
Sobre la herencia implementada por delegacin o por concatenacin, se puede decir que con respecto a
la forma de aplicar el comportamiento compartido, y a la forma de implementarlo, resulta ms flexible y
por lo tanto otorga caractersticas dinmicas, lo que facilita la exploracin de dominios en conjunto con una
metodologa apoyada en los prototipos. Mientras que la herencia por concatenacin es ms rgida en su
definicin pero ms uniforme en su aplicacin y por ende es posible, establecer una jerarqua de herencia y
de tipos correspondientes lo que facilita la construccin de herramientas que soporten este mecanismo. Por
lo tanto se puede afirmar que concatenacin y delegacin pueden ser implementadas en ambos ambientes
ya sean de clases o prototipos y el mecanismo de implementar la herencia estar en funcin del propsito y
funcionalidad que se persiga en la construccin del sistema.
Tener en cuenta que la herencia por concatenacin es ms eficiente porque hereda solo lo que es
diferente, no duplica.
2.16 POLIMORFISMO
La palabra polimorfismo proviene del griego y significa que posee varias formas diferentes. Este es uno
de los conceptos esenciales de una programacin orientada a objetos. As como la herencia est relacionada
con las clases y su jerarqua, el polimorfismo se relaciona con los mtodos.
Esta propiedad, como su mismo nombre sugiere mltiples formas, se refiere a la posibilidad de acceder
a un variado rango de funciones distintas a travs de la misma interfaz. O sea, que, en la prctica, un mismo
identificador puede tener distintas formas (distintos cuerpos de funcin, distintos comportamientos)
dependiendo, en general, del contexto en el que se halle inserto.
Otra definicin:
Comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al
llamarlos por ese nombre se utilizar el comportamiento correspondiente al objeto que se est usando. O
dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes
tipos, y la invocacin de un comportamiento en una referencia producir el comportamiento correcto para
el tipo real del objeto referenciado. Cuando esto ocurre en tiempo de ejecucin, esta ltima caracterstica
se llama asignacin tarda o asignacin dinmica. Algunos lenguajes proporcionan medios ms
estticos (en tiempo de compilacin) de polimorfismo, tales como las plantillas y la sobrecarga de
operadores de C++.
El polimorfismo de sobrecarga ocurre cuando las funciones del mismo nombre existen, con
funcionalidad similar, en clases que son completamente independientes una de otra (stas no tienen que ser
clases secundarias de la clase objeto). Por ejemplo, la clase complex, la clase image y la clase link pueden
todas tener la funcin "display". Esto significa que no necesitamos preocuparnos sobre el tipo de objeto con
el que estamos trabajando si todo lo que deseamos es verlo en la pantalla.
Por lo tanto, el polimorfismo de sobrecarga nos permite definir operadores cuyos comportamientos
varan de acuerdo a los parmetros que se les aplican.
Ejemplos:
En Java y Python es posible, agregar el operador + y hacer que se comporte de manera distinta
cuando est haciendo referencia a una operacin entre dos nmeros enteros (suma) o bien cuando
se encuentra entre dos cadenas de caracteres (concatenacin).
Sentencias Resultados
Java int a = 2, b = 3; 5
int c = a + b;
String nom= Juan; ape= Perez; Juan,Perez
nomCompleto = nom+ , +ape;
Python a = 2 5
b = 3
c = a + b
Ejemplos:
Los literales 1, 2, etc. son usados para representar tanto valores enteros de precisin
arbitraria, como enteros de precisin limitada.
Los operadores numricos, como +, suelen estar definidos para distintos tipos numricos.
El operador de igualdad (== en Haskell) suele estar definido para bastantes tipos de datos
(como los numricos y caracteres) aunque no para todos.
El polimorfismo paramtrico es la capacidad para definir varias funciones utilizando el mismo nombre,
pero usando distintas combinaciones de parmetros(nmero y/o tipo). El polimorfismo paramtrico
selecciona automticamente el mtodo correcto a aplicar en funcin del tipo de datos pasados en el
parmetro.
Por lo tanto, podemos por ejemplo, definir varios mtodos homnimos de addition() efectuando una
suma de valores.
int addition(int,int) devolvera la suma de dos nmeros enteros.
float addition(float, float) devolvera la suma de dos flotantes.
char addition(char, char) dara por resultado la suma de dos caracteres definidos por el
autor.
Una signature es el nombre y tipo (esttico) que se da a los argumentos de una funcin. Por esto, una
firma de mtodo determina qu elemento se va a llamar.
La habilidad para redefinir un mtodo en clases que se hereda de una clase base se llama
especializacin. Por lo tanto, se puede llamar un mtodo de objeto sin tener que conocer su tipo intrnseco:
esto es polimorfismo de subtipado. Permite no tomar en cuenta detalles de las clases especializadas de una
familia de objetos, enmascarndolos con una interfaz comn (siendo esta la clase bsica).
Imagine un juego de ajedrez con los objetos rey, reina, alfil, caballo, torre y pen, cada uno heredando
el objeto pieza.
El mtodo movimiento podra, usando polimorfismo de subtipado, hacer el movimiento
correspondiente de acuerdo a la clase objeto que se llama. Esto permite al programa realizar el
movimiento.de_pieza sin tener que verse conectado con cada tipo de pieza en particular.
2.17 AMBIENTE
.Para que haya objetos que interacten, se enven mensajes y se conozcan entre s; tienen que estar
en algn lugar, tiene que haber algo que los contenga. A ese lugar lo llamamos ambiente de objetos.
Cualquier versin de Smalltalk, es un ambiente de objetos, en el cual viven los objetos con los que
trabajamos y modelamos. Cuando creamos un objeto, se agrega al ambiente.
Ahora, para que un ambiente no crezca indefinidamente, tiene que haber alguna forma de sacar
objetos. Cmo hago para sacar un objeto del ambiente?. La respuesta para la mayora de los lenguajes que
soportan la orientacin a objetos, incluido Smalltalk, es el ambiente se arregla. Dicho en forma sencilla, se
da cuenta cuando un objeto no tiene referencias, y lo saca. Esta caracterstica es la que se conoce como
garbage collector.
Hay una relacin fuerte entre un ambiente de objetos y la memoria de la PC donde corre, no
conviene pensar en el ambiente como el formato que una aplicacin con objetos le da a la memoria.
Algunos ambientes Smalltalk swappean a disco, existen ambientes distribuidos, hay tcnicas para
deshidratar objetos de un ambiente en una base de datos relacional y despus volver a hidratarlos
cuando hacen falta.
2.18 SOFTWARE
El software segn el paradigma de objetos: Objetos que viven en un ambiente y que interactan
entre s envindose mensajes.
A partir de esta definicin queda ms claro que programar consiste en definir qu objetos necesito,
definir los mensajes que va a entender y que van a formar su comportamiento, y escribir el cdigo que
soporta cada objeto definido, en donde se incluye enganchar mediante las variables de cada objeto las
referencias necesarias para que cada objeto conozca a quienes debe enviarle mensajes.
Hacer software en gran escala hay mucho ms de lo que me tengo que ocupar: manejo de
memoria, base de datos, performance, etc. Hay proyectos de software nada pequeos que se desarrollaron
o se desarrollan usando los conceptos del paradigma en una forma bastante razonable, y que se comportan
bastante bien tanto en performance como en uso de recursos10. Cuando hubo problemas, ms bien se
debieron al uso imcompleto o inadecuado de estos conceptos, y no al revs.
Hay muchsimo para decir sobre esto, por ahora destacamos dos factores:
los conceptos de objetos, estos bsicos que aparecieron hasta ahora: objeto, mensaje,
polimorfismo, interaccin, referencias; bien usados, permiten manejar modelos bastante
complejos sin que se te vayan de las manos. Esto permite que haya menos necesidad de
hacer chequeos redundantes, repetir cosas, etc., lo que en escala provoca que el soft
construido con objetos se hace ms eficiente, y no menos.
Para ello tomamos como libro cabecera el del autor Wilf Lalonde, Descubra Smalltalk97. Este autor
es uno de los pioneros en el uso productivo de Smalltalk y centra la atencin de su libro en el dialecto de
Smalltalk/V desarrollado para Microsoft Windows. En el desarrollo de la Asignatura y ejercitacin prctica se
utilizar el ambiente de Smalltalk - Pharo 3.0.
3.1 INTRODUCCIN
Smalltalk es un lenguaje orientado a objetos puro, todas las entidades que maneja son objetos. La
programacin en Smalltalk consiste en: [GIPSI 96].
Crear clases.
Crear instancias.
Especificar la secuencia de mensajes entre objetos.
Toda la programacin en Smalltalk se realiza mediante el envo de un mensaje a un objeto para
invocar uno de sus mtodos.
Smalltalk es un lenguaje altamente interactivo y se implementa como intrprete. Esto permite a los
usuarios trabajar en muchas cosas diferentes a la vez dado que pueden suspender su actividad en una
ventana y continuar otra actividad distinta en otra ventana simplemente moviendo el apuntador de una a
otra ventana. Las ventanas pueden tambin moverse alrededor de la pantalla usando el ratn. [Cceres
Gonzlez 04].
Transcript: ventana principal del sistema Smalltalk/V, que es un editor de texto utilizado para evaluar
expresiones. El propio entorno tambin la utiliza para mostrar mensajes al programador.
Workspaces: contienen un editor de texto y pueden utilizarse para evaluar expresiones.
Inspect it: permiten observar la estructura interna de un objeto y modificar el valor de las mismas.
Browsers: permite inspeccionar y editar la biblioteca de clases del ambiente.
Todas las referencias tienen un tamao fijo constante y se le asigna espacio en la pila. Los objetos
referenciados se almacenan en otro sector de la memoria, llamado heap (montculo), que no est sujeto al
protocolo de asignacin de la pila.
Una asignacin a una referencia, cambia el valor de la referencia por el valor contenido en otra
referencia. De esta manera, si tenemos dos variables no solo tendrn el mismo valor sino que referencian al
mismo objeto. Por ejemplo, x := y.
En los lenguajes con asignacin de esttica de tipos, como Java cuando trabaja con tipos primitivos
de datos, los tipos se asocian con las variables al momento de ser declaradas. Por ejemplo (en Java): int var
En Smalltalk, las variables no se declaran con tipos especficos. De esta manera, no es posible
asignar a una variable un valor ilegal.
En un lenguaje con asignacin dinmica de tipos, cada valor debe llevar consigo una identificacin
que permite conocer la naturaleza exacta del valor. Esta identificacin queda ligada al valor a travs de la
asignacin. Con el paso del tiempo, a un identificador se le pueden pasar valores de muchos tipos
diferentes.
identificadorVariable := 10.
identificadorVariable := Hola.
3.3.1 COMENTARIOS
Esta tcnica permite comentar lo que estamos haciendo. Cualquier cosa entre comillas dobles es un
comentario y Smalltalk lo ignora.
Sintaxis:
Un comentario
Por ejemplo:
temperaturaHoy := 22.
Los literales [Cuenca] hacen referencia siempre al mismo objeto. Por ejemplo:
$a denota el carcter a.
Para poder utilizar una variable local esta debe estar previamente declarada, para lo cual se listan
sus nombres encerrados entre barras:
variable1 := expresin.
Ejemplo:
| temperaturaAyer temperaturaHoy |
temperaturaAyer := 10.
temperaturaHoy := 22.
Por ejemplo, las clases se identifican mediante variables globales, como Integer, Number,
Magnitude y Object. Otra variable global es Transcript, que hace referencia a la ventana que encontramos
en Smalltalk. [LaLonde 97].
3.3.4 PSEUDO-VARIABLES
Es un identificador que referencia a un objeto, no se les puede asignar un objeto y siempre
referencian al mismo objeto.
3.3.4.2 true
Referencia a un objeto que representa el verdadero lgico [Gmez Deck 07].
3.3.4.3 false
Referencia a un objeto que representa el falso lgico [Gmez Deck 07].
3.3.4.4 self
Referencia al objeto receptor de un mensaje: objeto actual. Se utiliza cuando como parte de la
implementacin de un mtodo es necesario invocar a un mtodo de la misma clase. No se utiliza self para
hacer referencia a un atributo de la clase.
3.3.4.5 super
Indica que debe ejecutarse el mtodo de la clase base del objeto actual. [Gmez Deck 07].
3.3.4.6 thisContext
Referencia al objeto contexto-de-ejecucin que tiene toda la informacin referente a la activacin
de un mtodo [Gmez Deck 07].
3.3.5 SMBOLOS
Los smbolos (Symbol) son cadenas de caracteres (String) usadas como nombres de clases, mtodos,
etc. No pueden existir smbolos con el mismo conjunto de caracteres.
Sintaxis:
#unSmbolo.
Ejemplo:
3.4.1 CLASES
Una clase contiene elementos llamados miembros, que pueden ser atributos (variables de instancias),
variables de clase y poolDictionaries.
Donde:
Object subclass: indica la clase madre o base de la cual es clase hija la clase que se est creando.
#NombreClase: indica el identificador que se le asigna a la clase. Este identificador debe comenzar con
mayscula y si se encuentra constituido por ms de una palabra, cada palabra debe comenzar con
maysculas. El nombre de la clase debe ser representativo de los objetos que permite instanciar.
Variables de instancia: son los atributos del objeto y existen durante el tiempo de vida del objeto
instancia de la clase [Goldberg/ Robson 83]. Los nombres de atributos slo pueden ser referidos desde
el interior de los mtodos de su clase.
Variables de clase: son compartidas por todas las instancias de una clase [Goldberg/ Robson 83]. En
consecuencia, hay una sola instancia de cada una de estas variables. Por otra parte, la clase, sus
rosubclases, las subclases de stas, y as sucesivamente, y cada una de las instancias de sta (y de las
subclases) pueden acceder a los objetos de las variables de clase [Lalonde 97].
Pool dictionaries: son variables contenedoras. Todas las variables mantenidas por los diccionarios
comunes son accesibles desde las instancias y la clase que tiene el diccionario comn en su definicin.
[Lalonde 97].
Si debiramos desarrollar una aplicacin bancaria, y se detecta que uno de los conceptos principales es
el de CuentaBancaria, nos llevar a pensar en la necesidad de disear una clase que provea objetos para
representar las cuentas del banco.
Si la informacin a mantener de cada cuenta fuera: nmero, titular, saldo y cantidad de cuentas que
posee el banco, la definicin de la clase en Smalltalk sera la siguiente:
Una convencin entre desarrolladores Smalltalk, indica que si el nombre de una variable se
encuentra compuesta de ms de una palabra (a excepcin de la primer palabra), cada una de ellas debe
comenzar con una letra mayscula.
Por ejemplo, si tuviramos una clase que representa una CuentaBancaria con los atributos nmero,
titular y saldo:
El identificador de una variable de clase debe comenzar con una letra mayscula.
Supongamos que la clase CuentaBancaria posee una tasa de inters comn para todas las cuentas
bancarias y adems posee una variable de clase que determina la cantidad de instancias que se han creado a
partir de la clase. La declaracin sera la siguiente:
Luego se inspecciona el diccionario y se agregan las distintas constantes (ver en el tema Colecciones
la clase Dictionary). Por ejemplo, en el diccionario global MarcasAutomoviles se pueden agregar las
constantes (Claves): Chevrolet, Fiat, Renault. Las distintas opciones deben comenzar con mayscula.
Adems, de la clave de la opcin se debe agregar el valor asociado a dicha clave.
Seguidamente, cuando se define una clase en el apartado poolDictionaries listamos los diccionarios
globales que sern accesibles a las instancias de la clase y a la propia clase.
Se debe tener presente que estos diccionarios no son accesibles desde las clase hijas ni de las
instancias de las clases hijas.
poolDictionaries: 'MarcasAutomoviles'
Por ejemplo:
Cuando se crea un objeto, todas sus variables de instancia (atributos) se inicializan en nil. Lo
correcto es que inmediatamente despus de instanciar un objeto, sus variables de instancia asuman valores
iniciales vlidos a travs del mtodo de inicializacin.
No todos los objetos se pueden crear enviando el mensaje new, as por ejemplo, si le enviamos el
mensaje new a la clase Fraction el sistema nos visualizar un mensaje de error. Para ello es necesario enviar
el mensaje de divisin a un entero, como: 1/2.
| variable |
variable := 1/2.
3.4.3 MTODOS
Un mtodo en Smalltalk consta de dos partes:
Un patrn del mensaje (tambin denominado cabecera del mtodo) con el nombre del selector
que identifica el mtodo y los nombres de sus parmetros, denominados parmetros del mtodo o
colaboradores externos.
Cuerpo del mtodo, que se encuentra constituido por tres componentes:
o Un comentario para describir la actuacin de ese mtodo concreto.
o Una lista de variables temporales o locales que puedan ser utilizadas en las sentencias.
o Las sentencias que responden al mensaje enviado.
Las variables temporales o locales creadas en los mtodos, son creadas para una tarea especfica y
se encuentran disponibles solo mientras dura la actividad para la cual han sido creadas [Goldberg/ Robson
83].
Sintaxis
patrnDelMensaje
comentario
|variablesTemporales|
sentencias.
Por ejemplo, si la clase CuentaBancaria posee un mtodo que le permite incrementar su saldo en
un 20%, el mtodo sera:
Depositar
Argumentos de mtodos
patrnDelMensaje
comentario
|variablesTemporales|
sentencias.
comentario
|variablesTemporales|
sentencias.
Nota: Los caracteres <> indican opcionalidad (no forman parte de la sintaxis del mtodo)
depositar: importe
|porcentaje|
Por correspondencia, un mtodo definido para cargar o modificar los atributos de un objeto, recibe el
nombre de mtodo de modificacin (o modificador).
Por convenio, los programadores de Smalltalk, como nombres de mtodos de acceso y modificacin
utilizan los mismos nombres que los de sus correspondientes nombres de atributos.
En consecuencia, si la clase CuentaBancaria posee el atributo numero, los nombres de los mtodos de
acceso y de modificacin sern:
Mtodo de Modificacin
titular: unTitular
titular:= unTitular.
Mtodo de Acceso
titular
Si consideramos la clase CuentaBancaria donde sus atributos son: numero, titular y saldo su mtodo de
inicializacin tendra, por ejemplo, la siguiente forma:
initialize
Inicializa la instancia
numero:= 0.
saldo:= 0.
Este mensaje debe ser enviado a la clase antes de la creacin de sus instancias, siempre que sus
instancias as lo requieran.
Por ejemplo, si la clase Cuenta Bancaria tuviera la variable de clase cantidadInstancias y se desea
inicializarla en cero:
inicializarVariablesDeClase
cantidadInstancias isNil
CuentaBancaria inicializarVariablesDeClase
Ejemplos:
10 between: 5 and: 15
5 factorial Receptor: 5
Selector: factorial
8 + 2 Receptor: 8
Selector: +
Colaborador externo: 2
Colaboradores externos: 5 y 15
Mensajes Unarios
5 factorial
Date tomorrow
Mensajes Binarios
Un mensaje binario se puede encontrar constituido por uno o dos caracteres y pueden contener una
combinacin de los siguientes caracteres especiales:
Por ejemplo:
Por ejemplo:
a isKindOf: Integer
Aqu, between: 1 and: 10 es un mensaje compuesto por dos palabras claves, donde:
Por analoga con 1+2, podemos observar que 5, 1 y 10 son los operandos y between: and: es el
operador. Obsrvese que los smbolos dos puntos forman parte del operador.
No hay lmite en cuanto al nmero de operandos que puede tener un mensaje, pero entre cada
operando deber haber un palabra clave. Por lo tanto, lo siguiente no est permitido:
5 between 1 and 10 (No permitido: faltan dos veces los dos puntos)
Expresiones como: 1 class, 1 + 2, y 1 between: 0 and: 10, constan de un receptor (objeto receptor del
mensaje): el objeto es 1 y en cada expresin se le envan, respectivamente, los mensajes:
class
+2
between:0 and:10, respectivamente.
20+ 10 se transforma en 30
3. Localizacin del mtodo correspondiente a un objeto receptor particular y realizacin de una copia, el
mtodo se copia.
4. Emparejamiento del mtodo con el patrn del mensaje perteneciente al mtodo copia, de la forma:
a. Emparejamiento del objeto receptor codificado en la expresin con la variable especial self -
tambin denominada pseudovariable- que identifica al objeto receptor, al tiempo que se
ejecuta el mtodo copia.
En el ejemplo, se empareja unaCuenta con self.
b. Emparejamiento del selector codificado en la expresin con la cabecera del mtodo copia.
En el ejemplo, la clusula depositar: porcentaje: de la expresin se empareja con la clusula
depositar: porcentaje: que se encuentra en la cabecera del mtodo copia.
c. Emparejamiento de los parmetros de la expresin, los parmetros del mensaje con sus
correspondientes parmetros que se encuentran en la cabecera del mtodo copia.
En el ejemplo, el entero 2500 se empareja con el parmetro del mtodo importe y el
entero 30 se empareja con el parmetro del mtodo porcentaje del mtodo copia.
5. Ejecucin del cuerpo del mtodo copia hasta la localizacin de una expresin de respuesta. Si el mtodo
no posee una expresin de respuesta, se ejecutar una expresin de respuesta por omisin ^self.
6. Devolucin del objeto calculado en la expresin de respuesta al emisor del mensaje, para su uso en
posteriores clculos.
Por ejemplo, si la clase Cuenta Bancaria contara con los mtodos depositar y extraer:
unaCuenta depositar:3000;
extraer:500;
depositar:400 porcentaje:20.
Ejemplo 1 con selector binario: La prioridad de los selectores unarios se realiza estrictamente de izquierda a
derecha.
1 + 2 (devuelve como resultado el objeto 3)
Ejemplo 2 con selector unitario: La prioridad de los selectores unarios se realiza estrictamente de izquierda a
derecha.
1 negated (devuelve como resultado el objeto -1)
-1 negated (devuelve como resultado el objeto 1)
0 factorial (devuelve como resultado el objeto 1)
1 factorial (devuelve como resultado el objeto 1)
1 negated negated (devuelve como resultado el objeto 1)
initialize
x:=0.
y:=0.
x
"Answer the value of x"
^ x
x: anObject
"Set the value of x"
x := anObject
y
"Answer the value of y"
^ y
y: anObject
"Set the value of y"
y := anObject
asString
"Retorna los valores de x e y, en forma de coordenadas cartesianas"
^ '(' , x, ', ', y, ')'.
calcularDistancia
"La distancia entre el origen y la coordenada x,y es igual a la
hipotenusa: raiz cuadrada de la suma del cuadrado de x y cuadrado de y"
^((self x squared) + (self y squared) ) sqrt.
En Workspace:
|p|
p x:10;
y:5.
Transcript show: 'Distancia desde la coordenada (0,0) a ', p asString, ' es: ',
p calcularDistancia asString.
nombre, legajo,
aula, nombre,
docente sueldo
cant. de Alumnos inscriptos
cant. de Alumnos regulares
initialize
legajo := 0.
apellido := ''.
cargo := ''.
legajo
^legajo
legajo: anObject
legajo := anObject
apellido
^apellido
apellido: anObject
apellido := anObject
cargo
^cargo
cargo: anObject
cargo := anObject
asString
|res|
initialize
codigo := ''.
turno := ''.
docente := nil.
codigo
^codigo
codigo: anObject
codigo := anObject
turno
^turno
turno: anObject
turno := anObject
docente
^docente.
docente: anObject
docente := anObject.
asString
|res|
Para mostrar la invocacin de objetos en cascada, vamos a implementar en Workspace como se debe
hacer para mostrar el nombre del docente, por ejemplo.
En Workspace para poder mostrar en Transcript el nombre del docente, se deber seguir el
proceso de invocacin de mensajes, correspondiente a la relacin definida, se deber pedirle al curso el
nombre del docente y este le pedir al docente su nombre, vemos a continuacin el ejemplo en Workspace:
|unCurso unDocente|
unDocente legajo: 1;
apellido: 'Lopez';
cargo: 'Adjunto'.
Transcript show: String cr, 'Los datos del curso son: ', unCurso asString.
Transcript show: String cr, 'El nombre del docente del curso: ', unCurso codigo
asString, ' es: ', (unCurso docente) nombre asString.
Como estudiamos en la primera seccin, La Herencia es la propiedad que permite a los objetos
construirse a partir de otros objetos.
Una subclase o clase hija o clase derivada, es un nuevo tipo de objetos definido por el usuario que
tiene la propiedad de heredar los atributos y mtodos de una clase definida previamente, denominada
superclase o clase madre o clase base [Ceballos, 2003].
Cuando se define una nueva clase, las variables de instancia proporcionadas por la nueva clase se
aaden a las variables de instancia que se obtienen automticamente de las clases que se encuentran ms
arriba en la jerarqua. La subclase puede aadir ms variables de instancia pero no puede eliminar ninguno
de los atributos heredados.
Una subclase puede, a su vez, ser una superclase de otra clase dando lugar a una jerarqua de clases.
Por lo tanto, una clase puede ser una superclase directa de una subclase, si figura explcitamente en la
definicin de la subclase, o una superclase indirecta si est varios niveles arriba en la jerarqua de clases, y
por lo tanto no figura explcitamente en el encabezado de la subclase [Ceballos, 2003].
Smalltalk admite herencia simple, es decir, que una clase hija solo puede tener una clase madre. Sin
embargo, una clase madre puede tener tantas clases hijas como se requieran.
Cuando se crea una instancia de una subclase su estructura de atributos est conformada por los
atributos propios ms los atributos heredados, no teniendo acceso directo a los atributos heredados por
respetar la propiedad de encapsulamiento de las superclases. En este caso, se deber utilizar el mtodo de
acceso que corresponda de la superclase.
En Smalltalk, los inspectores indican de dnde proceden las variables de instancia heredadas.
Object
Persona
Alumno
Se declara la clase base Persona, utilizando como clase base a la clase Object por defecto:
Object subclass: #Persona
instanceVariableNames: 'dni nombre telefono'
classVariableNames: ''
poolDictionaries: ''
category: 'HerenciaPPR'
Se declara la clase derivada Alumno, utilizando como base a la clase Persona:
Persona subclass: #Alumno
instanceVariableNames: 'legajo promedio'
classVariableNames: ''
poolDictionaries: ''
category: 'HerenciaPPR'
El uso de super provoca que la bsqueda del mtodo comience en la superclase del objeto receptor.
Por ejemplo:
Las variables de instancia estn definidas en la definicin de la clase. Los datos de la instancia se
mantienen en un rea de datos creada por Smalltalk.
Variables de Instancia: Cada subclase tiene su propia copia (estado) de variables, tanto las propias
como las heredadas.
Por ejemplo: el objeto alumno tiene las variables de instancia: dni, nombre, telefono, legajo y
promedio. Estas variables incluyen las variables de instancia heredadas de Persona.
Persona
dni dni
nombre
nombre
telfono
alumno telfono
legajo
promedio legajo
Alumno
promedio
El objeto usuario observa todos El objeto usuario no conoce la
los protocolos del alumno estructura interna del alumno
Variables de Clase: Una variable de clase es una variable que es compartida por todos los objetos
de la clase.
Slo existe una copia de la variable de clase en la jerarqua local de clases. Todos los objetos de la
clase referencian a esta nica copia de la variable.
Las variables de clase tambin permiten compartir la informacin a travs de todas las subclases de
la clase en que fueron declaradas.
Por defecto las variables de instancia se inicializan con el valor nil. A travs del mtodo initialize se
inicializan las variables de instancia a un valor por defecto definido por el usuario.
Para inicializar los atributos propios y heredados de una clase hija, en el mtodo de inicializacin de
la clase hija se deben inicializar en primer lugar los atributos heredados llamando al mtodo initialize de la
clase base y seguidamente sus propias variables de instancia.
Initialize
Inicializar atributos heredados de su clase base
super initialize.
Inicializar atributos propios
atributoPropio1:= 0.
atributoPropio2:= ' '.
La herencia de mtodos es til para permitir a una clase modificar su comportamiento respecto de
su superclase. Esto puede ser hecho agregando nuevos mtodos, o redefiniendo los mtodos heredados.
Agregacin de Mtodos:
Redefinicin de Mtodos:
Redefinir un mtodo heredado significa volverlo a escribir en la subclase con el mismo nombre y
los mismos colaboradores externos que tena en la superclase y su implementacin adaptada a las
necesidades de la subclase.
Una subclase puede redefinir (volver a definir) algn mtodo existente en la superclase, con el
objeto de proveer una implementacin diferente, por ejemplo: mtodo asString.
Para redefinir un mtodo en la subclase, se tiene que declarar con la misma signatura (nombre y
colaboradores externos).
En la invocacin de mtodos, si existen dos mtodos con la misma signatura, uno en la subclase y
otro en la superclase, se ejecutar siempre el de la subclase.
Usando el ejemplo de la clase Alumno, al definir el mtodo asString se lo est redifiniendo, ya que
tanto la clase base Persona, como la clase Object ya las tienen implementadas.
asString
|res| datos de Persona datos de Alumno
res := super asString,
', Legajo: ', self legajo asString,
', Promedio: ', self promedio asString.
^res.
Cuando un objeto recibe un mensaje se busca el mtodo asociado al mensaje en la clase del objeto
receptor del mensaje, si no se encuentra en la clase de dicho objeto se continua la bsqueda en la clase
inmediata superior jerrquicamente y, as sucesivamente, hasta ejecutar el mtodo correspondiente. En el
caso de no existir dicho mtodo, el sistema emite un error. Este procedimiento recibe el nombre de enlace
dinmico.
Son clases genricas que sirven para agrupar clases del mismo gnero. Definen comportamientos
que se implementarn en las subclases.
Definen un protocolo comn para una jerarqua de clases que es independiente de las opciones de
representacin.
No se pueden instanciar, es decir no se pueden crear objetos a partir de ellas, ya que representan
conceptos tan generales, con comportamientos que no siempre se pueden definir cmo ser la
implementacin de los mismos.
Los mtodos abstractos, son mtodos que no poseen implementacin, se definen en las clases
abstractas.
Smalltalk no tiene una sintaxis dedicada para especificar que un mtodo o una clase es abstracta.
Por convencin, el cuerpo de un mtodo abstracto consiste en la expresin: self subclassResponsibility.
Este es conocido como un "mtodo de marcador", e indica que subclases tienen la responsabilidad
de definir una versin concreta del mtodo.
Los mtodos subclassResponsibility siempre deben ser redefinidos, y por lo tanto no deben ser
ejecutados. Si se olvida de redefinir uno, y se ejecuta, se produce una excepcin.
Una clase se considera abstracta si uno de sus mtodos es abstracto. Nada en realidad le impide
crear una instancia de una clase abstracta; todo funcionar hasta que se invoca un mtodo abstracto.
Por ejemplo, si queremos definir un mtodo abstracto, llamado size, en una clase abstracta,
definimos:
size
self subclassResponsibility.
Tambin podemos definirlo sin cuerpo, pero no producir una excepcin si se invoca
equivocadamente, por ejemplo:
size
sin implementacin
Para finalizar, en alguna clase derivada se deber redefinir e implementar el mtodo, por ejemplo:
size
^ size
Una fbrica de dulces desea implementar un sistema de produccin donde se manejen los datos de
las golosinas especficamente de sus chocolates, caramelos sin relleno y con relleno.
De los chocolates se disponen los siguientes datos: cdigo (entero), nombre, precio, ingredientes
(cadena de caracteres) y tipo de chocolate (negro o blanco).
De los caramelos sin relleno: cdigo (entero), nombre, precio, ingredientes (cadena de caracteres),
sabor y color.
De los caramelos con relleno: cdigo (entero), nombre, precio, ingredientes (cadena de caracteres),
sabor del relleno y cantidad de relleno.
Object
Atributos propios
Golosina cdigo
nombre
precio
ingredientes
initialize
self codigo: 0. "El cero representa que no tiene codigo asignado aun"
self nombre: 'Sin nombre asignado'.
self precio: 0.0.
self ingredientes: 'Sin ingredientes establecidos'.
asString
^String cr, 'Codigo: ', self cdigo asString, ' Nombre:', self nombre
asString, ' Precio: $', self precio asString, ' Ingredientes: ', self
ingredientes asString.
initialize
super initialize.
self tipo: 'Negro'. "Por defecto el chocolate es negro"
initialize
super initialize.
self sabor: 'No asigando'.
self color:'No asignado'.
initialize
super initialize.
self saborRelleno: 'No asignado'.
self cantidadRelleno: 0.
^String cr, super asString, ' Sabor del relleno: ' , ' RELLENO: ', self
saborRelleno asString, ' Cantidad de relleno: ' , self cantidadRelleno asString.
En Workspace:
Polimorfismo de sobrecarga:
Por ejemplo, el operador +, se comporta de diferentes formas segn la clase donde est definido:
| a b c|
a := 2.
b := 6.
a := 2.5.
b := 3.5.
Polimorfismo paramtrico:
Por ejemplo, usando la clase Alumno vista anteriormente, el mensaje legajo responde al
polimorfismo paramtrico, utiliza en el mismo objeto (mbito), el mismo nombre de mensaje con
colaboradores diferentes:
|alumno leg|
Polimorfismo de subtipado
Object
Collection
Bag IndexCollection
Set
Symbol
Enunciado
Para administrar los empleados de una empresa, se debe desarrollar un programa orientado a
objetos que pueda manejar mediante clases las siguientes entidades descubiertas durante la etapa de
anlisis del sistema:
Empleado: que tiene los siguientes datos: legajo y nombre.
Empleado Asalariado: (es un Empleado) que tiene como atributo el monto del salario semanal. El
clculo del ingreso de este empleado se establece por el monto del salario semanal.
Empleado por Comisin: (es un Empleado) que tiene como datos: el monto de ventas por semana,
y el porcentaje de comisin por ventas. El ingreso para estos empleados es el montoComision que se
calcula como el porcentajeComision*montoVentas/100.
Se acompaa un diagrama orientativo:
Object
Atributos propios
Empleado legajo,
nombre
Asalariado PorComision
Se pide:
1. Implementar las clases Empleado, Asalariado y PorComision que tengan los mtodos para
inicializar, los mtodos de acceso y modificadores, el mtodo asString, que retorna una cadena con
los atributos y el mtodo montoIngreso, que retorna el ingreso que le corresponde segn lo
enunciado anteriormente.
2. Realizar las pruebas de funcionamiento instanciando algunos objetos e invocando sus mtodos.
Resolucin
1. Codificacin en Smalltalk (se generan los mtodos de acceso y modificacin automticamente desde
Pharo 3.0.).
initialize
legajo := 0.
nombre := ''.
legajo
^ legajo
legajo: anObject
legajo := anObject
nombre
^ nombre
nombre: anObject
nombre := anObject
asString
"Mtodo redefinido"
|res|
res := String cr, 'El Empleado: ', self legajo asString,', con nombre: ',
self nombre asString.
^ res.
montoIngreso
"Mtodo abstracto"
self subclassResponsibility.
initialize
super initialize.
salarioSemanal := 0.0.
salarioSemanal
^ salarioSemanal
salarioSemanal: anObject
salarioSemanal := anObject
asString
"Mtodo redefinido"
|res|
res := super asString, ' tiene un salario semanal de ', self salarioSemanal
asString.
^ res.
montoIngreso
"Mtodo redefinido"
^ self salarioSemanal.
initialize
super intialize.
montoVenta := 0.0
porcentajeComision := 0.0.
montoVenta
^ montoVenta
montoVenta: anObject
montoVenta := anObject
porcentajeComision
^ porcentajeComision
porcentajeComision: anObject
porcentajeComision := anObject
asString
"Mtodo redefinido"
|res|
res := super asString, 'tiene una comision de ', self porcentajeComision
asString, ' y genero un monto de ', self montoVenta asString.
^ res.
montoIngreso
"Mtodo redefinido"
|montoComision |
|empleadoAsalariado empleadoComision|
Transcript show: String cr, 'El monto de Ingreso es: ', empleadoAsalariado
montoIngreso asString. "Mtodo polimrfico, redefinido en la clase Asalariado "
Transcript show: String cr, 'El monto de Ingreso es: ', empleadoComision
montoIngreso asString. "Mtodo polimrfico, redefinido en la clase Comision"
Como la clase empleado tiene un mtodo abstracto, si bien la misma se puede instanciar en
Smalltalk, no se podr invocar al mtodo montoIngreso, ya que producir una excepcin:
|empleado|
Transcript show: String cr, 'El monto de Ingreso es: ', empleado montoIngreso
asString.
Se produce el error de
excepcin, porque
montoIngreso no est
implementado.
Al ser un lenguaje que usa asignacin dinmica de tipos, los objetos se caracterizan por los mensajes que
entienden. Si dos objetos entienden el mismo conjunto de mensajes y reaccionan de la misma manera, para
todo propsito prctico son indistintos, independientemente de las relaciones de sus clases respectivas. Por
este motivo, es til hacer que todos los objetos hereden gran parte de su comportamiento de una clase base
comn.
En un lenguaje as, toda clase definida por el usuario debe ser una subclase de alguna clase ya existente.
La siguiente es una lista de los principales mensajes que responden todos los objetos:
Todas las variables (globales o locales) tienen el valor nil hasta que se les asigna algn otro objeto.
3.8.3 MAGNITUDES
La librera de Smalltalk ofrece objetos muy diferentes, tales como nmeros, fechas y horas; todos esos
objetos (totalmente dismiles en su significado y utilizacin) tienen, sin embargo, algo en comn: pueden ser
ordenados de mayor a menor y compararse entre s. Todos ellos son magnitudes. [Cuenca].
La clase Magnitude es una superclase abstracta que define lo que tienen en comn tanto los nmeros como
las fechas y las horas; dicho de otra forma, define qu comportamientos debe tener un objeto para ser
considerado como una magnitud lineal.
Las diferentes subclases de Magnitude agregan el comportamiento necesario para especializar esta
definicin abstracta de magnitud hasta obtener magnitudes concretas tales como nmeros, fracciones,
fechas y horas.
Object
Magnitude
3.8.3.1 NMEROS
Smalltalk cuenta con varias clases de nmeros, todos ellos instancias de subclases de Number.
Number es una clase abstracta que agrupa las caractersticas y comportamientos de los nmeros en general.
Los nmeros reales, tales como 3.1415927 2.4633, son instancia de la clase Float, mientras que las
fracciones como 1/3 2/5 son instancia de la clase Fraction. Esto significa que tanto la Float como Fraction
son clases concretas.
La siguiente es una lista de los principales mensajes que comprenden todos los objetos numricos:
3.8.3.1.1 ENTEROS
La clase que representa nmeros enteros es Integer; sin embargo nmeros como 4 10000 no son
instancia de Integer, sino de alguna de sus subclases. Esto se debe a que atendiendo a razones de eficiencia
en el uso de la memoria y dependiendo del valor absoluto del nmero en cuestin, es conveniente
almacenarlo usando diferentes representaciones internas: para nmeros pequeos basta con usar 16 bits,
pero para nmeros ms grandes sern necesarios 32 bits. Pero estas diferencias de representacin no hacen
variar el comportamiento que exhiben los objetos numricos enteros, que se encuentra definido en su
totalidad en la clase abstracta Integer; sus subclases concretas solamente especializan la forma en que sus
instancias se almacenan en memoria. [Cuenca].
Las instancias de Integer, adems de todos los mensajes anteriores, son capaces de contestar los siguientes
mensajes:
3.8.3.1.2 FRACCIONES
Cuando el resultado de una divisin entre enteros no da como resultado otro nmero entero, el
resultado ser una instancia de la clase Fraction.
Las fracciones tambin son nmeros, por lo que responden a todo el protocolo descripto ms arriba y
adems cuenta con los siguientes mensajes principales:
3.8.3.2 CARACTERES
Las instancias de la clase Character representan caracteres del cdigo ASCII; hay por lo tanto 256
instancias de sta clase. [Cuenca].
En adicin a los heredados de Magnitude, los principales mensajes que comprenden las instancias de
Character son los siguientes:
Las clases Date y Time permiten obtener objetos que representan respectivamente fechas y horas. [Cuenca].
Date today
Por ejemplo:
Para evitar escribir el nombre del mes en el keyword month: ; es posible utilizar el servicio de traduccin
ofrecido por la clase Date:
Los principales mensajes ofrecidos por las instancias de Date son los siguientes (en los ejemplos se asumir
que la variable unaFecha se refiere al objeto creado con la expresin anterior, es decir: 10/7/1982):
Ejemplo 1:
|unaFecha|
unaFecha dayOfMonth
Rta: 10
Ejemplo 2:
|unaFecha unaFecha2|
Rta: 167
Time now
Para crear un objeto que represente un instante de tiempo en especial, se utiliza el mensaje:
Las instancias de Time responden a los siguientes mensajes (los ejemplos asumen que la variable unTiempo
ha sido inicializada con la siguiente expresin: Time fromSeconds: ( (60*60*6) + (30*60) ) Equivalente a las
6:30 a.m ).
Ejemplo 1:
|unTiempo|
unTiempo minutes
Rta: 30
Ejemplo 2:
|unTiempo unTiempo2|
Rta: 8:00:50 am
3.8.4 BOOLEANOS
Los objetos booleanos representan valores de verdad y falsedad. Existen solo 2 objetos booleanos: true
y false, instancias respectivamente de las clases True y False, subclases a su vez de la clase abstracta
Boolean.
Object
Boolean
True False
Los objetos booleanos definen mensajes para permitir la construccin de expresiones lgicas:
& AND
| OR
3.8.5 BLOQUES
Los bloques son objetos que representan secuencia de expresiones Smalltalk (cdigo). [Cuenca].
Los bloques ms altos son objetos instancias de la clase HomeContext y los bloques anidados son instancias
de la clase Context. No es posible crear bloques mediante el envo del mensaje new a Context o
HomeContext. [Lalonde97].
Object
`Context
HomeContext
Un bloque est formado por una secuencia de sentencias separadas por punto y encerrada entre corchetes.
Ejemplo:
| a b c |
La secuencia de instrucciones contenida en el bloque se ejecuta cuando el bloque recibe el mensaje value. El
resultado de la evaluacin del bloque es igual al valor de la ltima sentencia del bloque.
| a b c |
[ a:= 5.
b:= 7.
c:= a negated + b factorial
] value
Resultado: 5035
Los bloques constituyen objetos como cualquier otro, por lo cual pueden ser asignados a variables:
| a b c unBloque|
unBloque := [ a:= 5.
b:= 7.
c:= a negated + b factorial
].
unBloque value Resultado: 5035
Un bloque sin instrucciones se denomina bloque nulo y al ser evaluado devuelve nil.
| bloqueNulo |
bloqueNulo := [ ].
bloqueNulo value Resultado: nil
Un bloque puede recibir ninguno, uno o dos parmetros. En cada uno de esos casos la sintaxis es la
siguiente:
[ : x | sentencias ]. un parmetro
Los mensajes para evaluar bloques de uno y dos parmetros son, respectivamente:
value: parmetro
Ejemplos:
bloque de un parmetro
| unBloque |
unBloque := [ :x | x*2 ].
Paso de mensajes al bloque con un parmetro:
unBloque value: 2 Resultado: 4
unBloque value: 3 Resultado: 6
Ejemplos:
Ejemplo 1:
1 to: 10 Itera de 1 hasta 10, imprimiendo los sucesivos nmeros
do: [ :x | Transcript show: x; cr]. en la ventana Transcript.
Ejemplo 2:
0 to: -10 Itera de 0 a -10, de a dos valores por vez, e imprime
by: -2 esos valores en la ventana Transcript.
do: [ :x | Transcript show: x; cr.]
|k total|
k:= 1.
total:= 0. Repite el segundo bloque mientras la condicin
k<10 sea verdadera.
[ k<10]
whileTrue: [
total:= total + k factorial.
Transcript show: total; cr.
k := k +1
]
|k total|
k:= 1.
total:= 0. Repite el segundo bloque mientras la condicin k=0 sea falsa.
[k=0]
whileFalse: [ total:= total + k factorial.
k := k -1].
Transcript show: total.
Se requiere desarrollar un programa orientado a objetos en Smalltalk, que permita modelar los artculos que
tiene a la venta un comercio. De cada artculo se conoce su:
Cdigo, es un valor numrico que identifica a cada artculo.
Descripcin, correspondiente al nombre del artculo.
Costo, que representa el costo de compra en pesos del artculo.
Tipo, los valores que puede asumir son: 1, 2, 3.
Stock, que representa la cantidad de unidades disponibles en stock del artculo.
Adems, cada artculo debe exhibir el siguiente comportamiento:
a) precioVenta, que calcule el precio unitario de venta el cual se calcula sumndole al costo un porcentaje
de ganancia que depende directamente del tipo de artculo. Si es tipo 1 el porcentaje de ganancia es el
10%; si es tipo 2, el porcentaje de ganancia es del 20%; si es tipo 3, el porcentaje de ganancia es del
25%.
b) += unaCantidad, que permita incrementar el stock actual del artculo en una cierta cantidad, siempre y
cuando esta cantidad fuese mayor o igual a cero.
a) -= unaCantidad, que permita descontar del stock actual del artculo una cierta cantidad, siempre y
cuando el stock sea mayor o igual a esta cantidad, y esta cantidad fuese positiva o cero.
c) calcularImporteTotalStock, que calcule el importe total de venta que se obtendra de todo el stock de
artculos.
d) asString, que devuelva todos los datos del artculo.
initialize
"inicializa los atributos de un artculo con valores por defecto"
self codigo: 0.
self descripcion: 'no especificado'.
self costo:0.
self tipo: 1.
self stock: 0.
codigo
"devuelve el valor de cdigo"
^ codigo
codigo: unCodigo
"asigna unCodigo al atributo cdigo del artculo"
codigo:=unCodigo.
costo
"Devuelve el valor de costo"
^ costo
costo: unCosto
"asigna unCosto al atributo costo del artculo siempre y cuando unCosto
sea Number y sea positivo o 0"
unCosto isNumber
ifTrue:
[
(unCosto>=0.0)
ifTrue:
[
costo:=unCosto.
^true.
].
].
^false.
descripcion
"Devuelve el valor de descripcion"
^ descripcin
descripcion: unaDescripcion
"asigna unaDescripcion al atributo descripcin del artculo"
descripcion:=unaDescripcion.
stock
"Devuelve el valor de stock"
^ stock
stock: unStock
"asigna unStock al atributo stock del artculo siempre y cuando unStock
sea Number y sea positivo o 0"
unStock isNumber
ifTrue:
[
(unStock>=0)
ifTrue:
[
stock:=unStock.
^true.
].
].
^false.
tipo
"Devuelve el valor de tipo"
^ tipo
tipo: unTipo
"asigna unTipo al atributo tipo del artculo siempre y cuando unTipo sea
Integer y est comprendido entre 1 y 3"
unTipo isInteger
ifTrue:
[
((unTipo>=1) & (unTipo<=3))
ifTrue:
[
tipo:=unTipo.
^true.
].
].
^false.
asString
"devuelve todos los datos del artculo"
^String cr, 'Cdigo: ',self codigo asString, String cr, 'Descripcin:
',self descripcion asString, String cr, 'Tipo: ',self tipo asString, String
cr, 'Stock: ',self stock asString.
+=unaCantidad
"agrega unaCantidad al stock de artculos"
unaCantidad isNumber
ifTrue:
[
unaCantidad>=0
ifTrue:
[
self stock: self stock + unaCantidad.
].
].
-=unaCantidad
"descuenta unaCantidad del stock de artculos"
unaCantidad isNumber
ifTrue:
[
self stock >= unaCantidad
ifTrue:
[
self stock: self stock - unaCantidad.
].
].
importeTotalEnStock
"devuelve el importe total de todos los artculos en stock"
^self stock * self importeVenta.
importeVenta
"devuelve el importe de venta unitario en base al costo y tipo de
artculo"
|porcGanancia|
porcGanancia:=10. "Por defecto asumimos que es tipo 1"
(self tipo = 2)
ifTrue: [
porcGanancia:=20.
]
;
ifFalse: [
(self tipo = 3)
ifTrue: [
porcGanancia:=25.
].
].
^self costo + (self costo * (porcGanancia/100) asFloat).
En Workspace:
|art|
art:=Articulo new initialize.
Transcript show: art asString; cr.
art -=30.
Transcript show: art asString; cr.
Transcript show: 'Importe total en stock: $',art importeTotalEnStock; cr.
art+=50.
Transcript show: art asString; cr.
Transcript show: 'Importe total en stock: $',art importeTotalEnStock; cr.
Las colecciones permiten agrupar objetos para poder operar sobre ellos. En general podremos
referirnos a esa coleccin de objetos bajo un mismo nombre, y poder agregar o sacar objetos, filtrarlos,
recorrerlos y muchas otras cosas de manera mucho ms sencilla. Las colecciones nos van a permitir modelar
conjuntos de objetos, como ser: las piezas de un tablero, los empleados de una fbrica, la flota de buques de
una empresa de transporte fluvial, etc. y poder realizar operaciones sobre ese grupo.
Las colecciones se pueden ver como un conjunto de objetos, y de hecho vamos a decir eso
normalmente (abusando del lenguaje), pero en realidad las colecciones son conjuntos de referencias a
objetos; es decir, los objetos no estn adentro de la coleccin, sino que la coleccin los conoce (los
referencia) de alguna forma. Es importante aclarar que, conceptualmente, la coleccin no tiene adentro
suyo a sus elementos. Al agregar un objeto a la coleccin simplemente se agrega una referencia que parte
de la coleccin y llega al objeto agregado. Es importante destacar tambin que los objetos que se agregan
a una coleccin pueden estar referenciados por otros objetos que existan y que no necesariamente estn
relacionados con la coleccin.
Los objetos agregados pueden ser incluso otras colecciones, dado que las colecciones son tambin objetos.
Pero, y si las colecciones son un conjunto de objetos (o referencias ms correctamente), cmo las
representamos? Sabemos que en Smalltalk slo tenemos objetos y mensajes, por lo cual las colecciones van
a ser representadas como...objetos!!!
En Smalltalk no estamos limitados en cuanto al tipo de objeto que podemos agregar. Por ejemplo,
podemos agregar a nuestra coleccionCDs un nmero, un String, una fecha... lo que sea. Se dice que las
colecciones en Smalltalk son heterogneas dado que permiten que cualquier objeto de cualquier clase
pueda ser agregado a ellas junto con otros objetos de otras clases.
Las colecciones de Smalltalk son polimrficas y presentan un protocolo unificado, por lo que todas
las diferentes formas de colecciones provistas por el entorno responden a un mismo conjunto de mensajes
bsicos, lo que facilita su aprendizaje y el cambio de un tipo de coleccin a otra. [Cuenca].
Object
Collection
Bag IndexCollection
Set
Symbol
Collection: define el comportamiento comn a todas las posibles formas de representar colecciones.
IndexedCollection: representa una forma ms especializada de coleccin en donde es posible acceder a
cada elemento de la coleccin por medio de subndices numricos.
FixedSizeColletion: especializa IndexCollection parar representar colecciones subindicables con una
cantidad fija de elementos. Sus subclases concretas permiten manejar arreglos (Array), cadenas de
caracteres (String) e intervalos numricos (Interval).
CLASES CONCRETAS [Cuenca]:
Set y Bag son colecciones desordenadas, las instancias de Bag admiten duplicados, mientras que las de
Set no.
OrderedCollection es una coleccin indexada en la que se mantiene el orden en que los objetos son
insertados. Tiene una subclase, SortedCollection, en la cual es posible especificar que los elementos de
la coleccin se ordenen siguiendo un criterio especfico (por ejemplo, de menor a mayor).
Dictionary es una coleccin que mantiene asociaciones entre objetos llamados claves (keys) y valores
(values).
3.9.2 SET1
La primera clase que vamos a usar es una coleccin que se llama Set. Un Set representa un conjunto
entendido como los conjuntos matemticos que aprendimos en la escuela.
El orden de los objetos agregados en una coleccin Ser no corresponde con el orden de insercin de
los mismos y tampoco tiene un criterio de orden detectable. sta es una de las caractersticas que distinguen
a un Set entre otros tipos de colecciones que existen en Smalltalk: los elementos no estn ordenados. La
otra caracterstica de un Set es que no repite sus elementos, es decir que si agregamos dos veces un mismo
objeto, no aparecer dos veces en l.
Para crear una coleccin Set y asignarla a una variable que represente a nuestra coleccin de CDs,
escribimos:
Supongamos que tenemos definida la clase de los CDs. Creamos instancias de CDs y los agregamos
a nuestro conjunto coleccionCDs, mandndole el mensaje add:. Definimos adems un cuarto CD que no
agregamos.
cd1 := CD new.
cd1 titulo: Abbey Road.
cd1 autor: The Beatles.
cd1 origen: U.K..
cd2 := CD new.
cd2 titulo: Tribalistas.
cd2 autor: Tribalistas.
cd2 origen: Brasil.
cd3 := CD new.
cd3 titulo: Peluson of milk.
cd3 autor: Spinetta.
cd3 origen: Argentina.
cd4 := CD new.
cd4 titulo: Piano Bar.
cd4 autor: Charly Garca.
cd4 origen: Argentina.
1
Basado en el apunte Colecciones en Smalltalk de la Universidad Tecnolgica Nacional Facultad Regional Buenos
Aires (ctedra de Paradigmas de Programacin), de Victoria Pocladova, Carlos Lombardi, Leonardo Volinier y Jorge Silva.
3.9.3 BAG2
Esta coleccin es de las denominadas sin orden y es la representacin de una bolsa. Una bolsa de
objetos. El Bag es la coleccin ms adecuada para representar por ejemplo un carrito o bolsa de
supermercado. Imagnense que puedo poner tres latas de tomates, dos botellas de agua y siete peras.
Bien, tenemos el objeto unaLata y queremos agregar a mi carrito de compras 3 latas de tomates.
Entonces hago:
En mi carrito debera haber 3 latas de tomates. Pero, como vimos, si representamos a mi carrito de
compras con un Bag s voy a tener 3 objetos dentro de mi carrito.
El Set est concebido para la representacin de conjuntos. Una propiedad distintiva sobre conjuntos
es que los elementos que pertenecen al conjunto son nicos en l. Es decir, en los conjuntos no vamos a
tener dos veces el mismo elemento (no admite repetidos). Salvo por esta propiedad, el comportamiento es
el mismo que el del Bag.
3.9.4 ORDEREDCOLLECTION
Es una coleccin indexada en la que se mantiene el orden en que los objetos son insertados o agregados
a la coleccin [Cuenca]. Al contrario de un Set o un Bag, en donde los elementos estn "todos tirados".
2
Basado en el apunte Colecciones en Smalltalk de la Universidad Tecnolgica Nacional Facultad Regional Buenos
Aires (ctedra de Paradigmas de Programacin), de Victoria Pocladova, Carlos Lombardi, Leonardo Volinier y Jorge Silva.
Mensaje
at: indice put: unObjeto Coloca unObjeto en la posicin indice de la coleccin (ndice debe ser un
nmero entero)
at: indice Retorna el objeto ubicado en la posicin indice de la coleccin
indexOf: unObjeto Retorna el ndice de la posicin que unObjeto ocupa en la coleccin ( uno
(1) es el ndice del primer elemento). Si unObjeto no figura en la coleccin,
devuelve cero (0)
indexOf: unObjeto Retorna el ndice de la posicin que unObjeto ocupa en la coleccin ( uno
ifAbsent: unBloque (1) es el ndice del primer elemento). Si unObjeto no figura en la coleccin,
evala unBloque
First Retorna el primer elemento de la coleccin
Last Devuelve el ltimo elemento de la coleccin
copyFrom: inicio to: fin Retorna una coleccin conteniendo los elementos del receptor
comprendidos entre inicio y fin.
replaceFrom: inicio to: fin Reemplaza los elementos del receptor comprendidos entre inicio y fin por
with: otraColeccion los objetos contenidos en otraColeccion
replaceFrom: inicio to: fin Reemplaza los elementos del receptor comprendidos entre inicio y fin por
with: otraColeccion los objetos contenidos en otraColeccion, extrayndolos a partir de la
posicin otroIndice
startingAt: otroIndice
replaceFrom: inicio to: fin Reemplaza los elementos del receptor comprendidos entre inicio y fin por
withObject: unObjeto unObjeto
3
Basado en el apunte Colecciones en Smalltalk de la Universidad Tecnolgica Nacional Facultad Regional Buenos
Aires (ctedra de Paradigmas de Programacin), de Victoria Pocladova, Carlos Lombardi, Leonardo Volinier y Jorge Silva.
Y podemos seguir agregndole elementos, ante lo cual la coleccin "se estira", pues tiene un tamao
variable (a diferencia de un array que veremos ms adelante).
l unString fragmento l
unString := 'Hola, buenos das'.
fragmento := unString copyFrom: 7 to: (unString size).
fragmento Resultado: 'buenos das'
3.9.5 SORTEDCOLLECTION
La clase SortedCollection [Cuenca] provee colecciones ordenadas segn un criterio especifico.
SortedCollection new
Se obtiene una coleccin que ordena sus elementos de menor a mayor. Esto implica que los objetos
contenidos en una Sortedcollection que utiliza el criterio de ordenamiento por defecto deben poder
responder al mensaje <=.
Ejemplo 1:
| unaSortedCollection |
l unBloque unaColeccion l
unBloque := [ :x :y | x >= y ].
unaColeccion := SortedCollection sortBlock: unBloque.
El sortBlock es un bloque que necesita 2 parmetros, que son los objetos a comparar. El cdigo del
bloque es un cdigo que debe devolver true o false. Para ordenar los objetos dentro de la coleccin, se
evala el cdigo y si el objeto retornado es true, el primer parmetro va antes que el segundo. Si retorna
false, el segundo parmetro se ubica antes que el primero.
3.9.6 ARRAY
Array es una coleccin donde su caracterstica distintiva es que es de tamao fijo. Por ejemplo, para
instanciar un Array, hacemos Array new: 6, donde 6 es la cantidad de elementos que contendr.
En casos especiales donde los elementos son literales booleanos, strings o numeros, se pueden crear los
arreglos de la siguiente forma:
que representa una instancia de Array conteniendo los objetos que se indican.
Los arreglos literales son especialmente tiles para crear colecciones inicializadas.
4
Basado en el apunte Colecciones en Smalltalk de la Universidad Tecnolgica Nacional Facultad Regional Buenos
Aires (ctedra de Paradigmas de Programacin), de Victoria Pocladova, Carlos Lombardi, Leonardo Volinier y Jorge Silva.
Los Arrays no implementan el mensaje add:, justamente porque no se pueden modificar su tamao.
La forma de agregarles elementos es a travs del mensaje at:put:, como por ejemplo:
Si bien los arreglos literales son instancia de Array, es posible obtener a partir de ellos una instancia
de la clase deseada usando los mensajes de conversin; por ejemplo: [Cuenca]
#(1 2 3 4 5 ) asOrderedCollection
#(1 2 3 4 5 ) asSet
#(1 2 3 4 5 ) asBag
#(1 2 3 4 5 ) asSortedCollection
Todas las colecciones5 entienden una serie de mensajes que permiten obtener distintos tipos de
colecciones con los mismos elementos que la coleccin receptora. Estos mensajes son de la forma
as{ColeccionQueQuiero}.
Por ejemplo, si tuviese una coleccin de la clase Bag, y quiero sacarle los repetidos, s que el Set no tiene
repetidos, entonces tomo mi coleccin como un Set. Hacemos lo siguiente:
Si tuviese un array, y lo quiero convertir en una coleccin de tamao variable, podra hacer:
Si quisiera ordenar mi carrito de compras del producto ms caro al ms barato, hara algo como:
Tambin est el mensaje asSortedCollection (o sea sin el dos-puntos, o sea que no requiere parmetro) que,
como dijimos antes, ordenar los elementos por el orden natural, dado por el mensaje <. En este caso,
5
Basado en el apunte Colecciones en Smalltalk de la Universidad Tecnolgica Nacional Facultad Regional Buenos
Aires (ctedra de Paradigmas de Programacin), de Victoria Pocladova, Carlos Lombardi, Leonardo Volinier y Jorge Silva.
debemos tener en cuenta que todos los objetos que agreguemos a esta coleccin debern entender el
mensaje <, pues si as no fuera, tendramos un error de mensaje no entendido.
Mensaje Ejemplos
Nota:
Ejemplo:
3.9.8.2 C ONSULTA
Mensaje
Size Devuelve la cantidad de elementos contenidos en la coleccin
isEmpty Retorna true si la coleccin est vaca
notEmpty Retorna true la coleccin contiene algn objeto
includes: unObjeto Retorna true si la coleccin incluye a unObjeto
ocurrencesOf: unObjeto Retorna la cantidad de elementos de la coleccin que son iguales a unObjeto
Ejemplo 1:
| unaColeccion |
unaColeccion := OrderedCollection new.
unaColeccion isEmpty Respuesta: true
unaColeccion size Respuesta: 0
unaColeccion := #( 2 'Hola').
unaColeccion size Respuesta: 2
unaColeccion includes: 2 Respuesta: true
unaColeccion includes: 5 Respuesta: false
unaColeccion := Array with:1 with:5 with:2 with:5.
unaColeccion ocurrencesOf: 5 Respuesta: 2
Ejemplo 2:
Ejemplo 3:
Utilizando variables, el mensaje size devuelve la cantidad de elementos que posee la coleccin.
Ejemplo 1:
Ejemplo 2:
Ejemplo 3:
3.9.8.4 RECORRIDO
Mensaje
do: unBloque Evala unBloque para cada elemento de la coleccin, pasndole cada
elemento de la coleccin como parmetro a unBloque
select: unBloque Evala unBloque para cada elemento de la coleccin.
Retorna una nueva coleccin conteniendo todos aquellos elementos que
hicieron que unBloque evaluara en true
reject: unBloque Evala unBloque para cada elemento de la coleccin.
Retorna una nueva coleccin conteniendo todos aquellos elementos que
hicieron que unBloque evaluara en false
collect: unBloque Evala unBloque para cada elemento de la coleccin.
Retorna una nueva coleccin conteniendo el resultado de las sucesivas
evaluaciones del bloque
detect: unBloque Evala unBloque para cada elemento de la coleccin.
Retorna el primer elemento que haga que unBloque evale en true. Si
ningn elemento cumple la condicin, provoca un error
detect: unBloque Evala unBloque para cada elemento de la coleccin.
ifNone: bloqueExcepcion Retorna el primer elemento que haga que unBloque evale en true. Si
ningn elemento cumple la condicin, bloqueExcepcion es evaluado
inject: objetoInicial Evala unBloqueBinario para cada elemento de la coleccin. Este bloque
into: unBloqueBinario tiene dos parmetros: el segundo es el elemento de la coleccin receptora
del mensaje; el primero es el resultado de la evaluacin de unBloqueBinario
en la intervencin anterior. La primera vez es objeoInicial. Retorna el valor
unBloqueBinario en la ltima iteracin.
Ejemplo 1: Contar cuantas veces figura la letra A en la frase: Hola, que tal?
3.9.9 DICTIONARY
Los diccionarios6 (Dictionary) son un tipo especial de colecciones, ya que sus elementos son pares de claves
y valores. Los objetos que referencia esta coleccin son instancias de una clase particular: Association. En
una Association se tienen dos objetos, uno que juega el rol de clave y el otro el valor. En particular el objeto
nil no puede ser la clave de una asociacin de un diccionario.
Con los diccionarios se pueden representar obviamente diccionarios de palabras o sinnimos, pero tambin
se pueden representar cosas interesantes como una agenda, donde cada elemento del diccionario es una
letra, y el valor asociado son todos los contactos que empiezan con esa letra.
Otra forma de ver a un diccionario es como una lista, donde el acceso a los elementos no se hace por ndice
entero sino por cualquier otro objeto. De hecho, el mensaje para agregar nuevos elementos al diccionario es
at: put:, pero en este caso el primer parmetro puede ser cualquier objeto.
Vemoslo grficamente con un ejemplo de cdigo:
6
Basado en el apunte Colecciones en Smalltalk de la Universidad Tecnolgica Nacional Facultad Regional Buenos
Aires (ctedra de Paradigmas de Programacin), de Victoria Pocladova, Carlos Lombardi, Leonardo Volinier y Jorge Silva.
Observar que el diccionario crea una instancia de Association y que cada instancia referencia a la clave y
valor que se agregaron al diccionario.
Ejemplo: una tabla de traduccin que asocie palabras en castellano con su equivalente ingls, tal como la
siguiente:
Clave Valor
Auto Car
Mesa Table
Perro Dog
Gato Cat
Azul Blue
A diferencia del resto de las colecciones, los diccionarios definen mtodos que permiten realizar
operaciones sobre las asociaciones, sobre los objetos que son clave y sobre los objetos que son valor.
Mensaje
removeKey: unaClave Elimina el valor asociado a unaClave. Si unaClave no figura en el diccionario, ejecuta
unBloque
ifAbsent: unBloque
Ejemplo 1:
Ejemplo 2:
Ejemplo 3:
Los mensajes bsicos para la recuperacin de los elementos de un Dictionary son los siguientes:
Mensaje
at: unaClave Devuelve el valor asociado a unaClave. Si la clase no figura en el diccionario,
genera un error
keyAtValue: unObjeto Busca si entre los valores figura unObjeto y si lo encuentra, devuelve la
clave de la que est asociado. En caso contrario, devuelve nil
keyAtValue: unObjeto Busca si entre los valores figura unObjeto y si lo encuentra, devuelve la
ifAbsent: unBloque clave de la que est asociado. En caso contrario, ejecuta unBloque
Keys Retorna una coleccin conteniendo todas las claves del diccionario
Values Retorna una coleccin conteniendo todos los valores del diccionario
Por ejemplo:
Dentro de un diccionario, los pares clave-valor se almacenan en instancias de la clase Association. [Cuenca].
Mensaje
associationAt: unaClave Devuelve la asociacin que tiene como clave a unaClave. Si la clave no figura
en el diccionario, genera un error
associationAt: unaClave Devuelve la asociacin que tiene como clave a unaClave. Si la clave no figura
en el diccionario, ejecuta unBloque
ifAbsent: unBloque
Una vez obtenida la asociacin, pueden recuperarse la clave y el valor envindole los mensajes key y value
respectivamente.
Ejemplo 1:
Ejemplo 2:
Ejemplo 3:
3.9.9.3 RECORRIDO
En adicin a las operaciones de recorrido heredadas de Collection, Dictionary ofrece adems los siguientes
servicios:
Mensaje
associationsDo: unBloque Para cada asociacin, evaluar unBloque con esa asociacin como
parmetro
associationsSelect: unBloque Para cada asociacin, evaluar unBloque con esa asociacin como
parmetro.
keysDo: unBloque Para cada una de las claves del diccionario, evaluar unBloque con esa clave
como argumento
4. ANEXO I: EJEMPLOS
La idea Original del presente ejemplo est tomada de Apunte: Introduccin a la orientacin a objetos de
la Asignatura Paradigmas de Programacin UTN FRBA Autores: Carlos Lombardi Nicols Passerini
Y ac es donde entra el software. Los objetos de la orientacin a objetos son las representaciones
computacionales de los entes con los que vamos a interactuar.
Si hago una aplicacin para que el ornitlogo registre la informacin que va obteniendo y genere
reportes y otros resultados, s voy a tener en esa aplicacin un objeto que representa a Pepita. Si un usuario
quiere saber cunto vol Pepita entre el 21 y el 25 de febrero, su velocidad standard de vuelo, su peso, cul
fue el vuelo ms largo que hizo, etc.; se lo va a pedir al objeto que representa a Pepita.
Cuando el ornitlogo quiera registrar un vuelo de Pepita, el resultado de un anlisis, el cdigo de su
anillo identificatorio; es probable que lo haga pidindole a ese objeto que registre la informacin.
El cdigo que voy a escribir es el que va a implementar el objeto que representa a Pepita, de forma
tal de poder registrar todo lo que resulta de las interacciones del ornitlogo, y poder responder
correctamente a las consultas que le puedan interesar al mismo ornitlogo o a otro usuario.
Concentrmonos ahora en el primer pedido: cunto vol Pepita entre el 21 y el 25 de febrero.
Supongamos que la respuesta es 32 km.
Para poder formular la pregunta, el usuario tiene que poder representar de alguna forma las dos
fechas y/o el perodo entre ambas. S, adivinaste: va a haber objetos que representen las fechas, y objetos
que representen perodos de tiempo.
La respuesta tambin va a estar dada por un objeto, que representa la magnitud 32 km, y que
est a su vez compuesto por dos, uno que representa al nmero 32 y el otro a la unidad de medida
kilmetro.
Si le pido el cdigo del anillo identificatorio, me va a responder un cdigo, p.ej. AZQ48. Si ya tens
claro que hay un objeto que representa al cdigo, y tambin hay un objeto que representa a cada letra, le
ests tomando la onda.
Resumiendo: adems de los objetos que representan los entes que tienen sentido para los usuarios
(en este caso Pepita), aparecen muchos objetos ms que representan conceptos ms bsicos (fechas,
distancias, nmeros, cdigos, texto, unidades de medida. Cualquier ente que quiera representar, lo tengo
que representar mediante un objeto; la orientacin a objetos no me da otras formas.
A partir de ahora, en vez de decir el objeto que representa a X vamos a decir el objeto X. P.ej.
vamos a hablar del objeto Pepita, los objetos fecha, los objetos nmero, etc.
Los objetos con los cuales decida trabajar van a conformar el modelo y los vamos a elegir en base
al criterio: Que tenga sentido interactuar con ellos de alguna forma.
Por lo expuesto hasta el momento, claramente va a existir un objeto Pepita; es aquel con el que va
a interactuar el ornitlogo en las formas que describimos ms arriba. A una fecha le puedo pedir el mes, qu
da de la semana es, si eso no anterior a otra fecha, y otras cosas; entonces es probable que aparezcan
objetos fecha. Lo mismo con una distancia (le puedo pedir que se sume a otra distancia, que me diga a
cuntos metros equivale), un nmero (le puedo pedir que se multiplique con otro nmero), un texto (le
puedo pedir la cantidad de letras, si aparece o no cierta letra).
A las interacciones vistas como una unidad las vamos a llamar comportamiento; es la palabra que
se usa en la literatura sobre orientacin a objetos.
Si le quiero indicar al objeto Pepita que Pepita (la golondrina de verdad) comi 30 gramos de alpiste
(lo que el objeto Pepita necesita saber porque eso aumenta su energa), el 30 (o el 30 gramos) va a ser
un parmetro. Si no, el objeto Pepita debera entender un mensaje comiste 30 gramos de alpiste, otro
distinto comiste 50 gramos de alpiste, y as hasta el infinito
Puede haber un resultado, que es la respuesta que obtiene el emisor. P.ej. si le pido al objeto Pepita
la energa, un resultado posible es 48 joules.
Est claro que tanto los parmetros como el resultado son objetos, en los ejemplos de recin el
parmetro es el objeto 30 (o 30 gramos) y el resultado es el objeto 48 (o 48 joules).
Hasta ac queda claro que si el ornitlogo quiere saber cunta energa tiene Pepita en un
determinado momento, lo que tiene que hacer es enviarle el mensaje energa al objeto pepita. Bajemos un
poco a detalle.
El ornitlogo trabaja en un entorno Smalltalk. En el entorno en el que est trabajando, el ornitlogo
tuvo que haber configurado al objeto Pepita.
Para poder interactuar directamente con un objeto, se le pone un nombre dentro del entorno en el
que estoy trabajando; p.ej. pepita. En Smalltalk los nombres de los objetos empiezan en minscula, salvo
excepciones que veremos ms adelante.
La configuracin va a incluir pasarle a pepita las observaciones relevantes; si lo que le interesa es ir
viendo la evolucin de la energa, le va a pasar los registros de los eventos que la afectan, p.ej. las veces que
comi (que aumentan su energa) y las veces que vol (que la disminuyen).
energia
pepita
Despus de esto, slo queda enviarle a pepita el mensaje energa. En cdigo, esto se hace as:
pepita energa
objeto mensaje
Volviendo: cuando el ornitlogo enva el mensaje pepita energa qu pasa? Obviamente, pasa que
se ejecuta cdigo.
Qu cdigo? Ah vamos. Para que el ornitlogo pueda interactuar con pepita, alguien la tuvo que
programar; donde programar quiere decir: indicar qu mensajes va a entender pepita, y para cada uno
escribir el cdigo que se va a ejecutar cuando pepita lo reciba.
O sea: fue un programador el que decidi que pepita va a entender el mensaje energa, y escribi el
cdigo asociado a ese mensaje. Ese cdigo es el que se va a ejecutar cuando el ornitlogo ejecute pepita
energa.
La seccin de cdigo que se asocia a un mensaje se llama mtodo. Un mtodo tiene un nombre,
que es el del mensaje correspondiente; y un cuerpo, que es el cdigo que se ejecuta.
Un detalle: en la jerga de objetos, se usa mucho el trmino evaluar en vez de ejecutar.
Lo que no vimos es dnde se escriben los mtodos. Para eso falta un rato.
Antes de pasar a otro tema; arriba dijimos el ornitlogo tuvo que haber configurado al objeto
Pepita. Cmo hizo? Obviamente envindole los mensajes que le dicen a pepita lo que le pas a Pepita.
Dicho en general, los que le indican a la representacin computacional lo que le pas al objeto
representado.
Insistimos, la nica forma que tengo de interactuar con un objeto es envindole mensajes. P.ej.
para indicarle que Pepita comi 30 gramos de alpiste una forma posible es
pepita comiAlpiste: 30
Los nombres de mensaje con un parmetro terminan con dos puntos, eso indica que atrs viene un
parmetro; los dos puntos forman parte del nombre. La sintaxis de envo es
Vamos a programar una versin muy simplificada de pepita. Los que queremos que pepita haga es:
lo nico que quiero es poder saber en cada momento cunta energa tiene pepita,
los nicos eventos relevantes son comer alpiste y volar,
el alpiste le brinda 4 joules por cada gramo que come,
en cada vuelo consume 10 joules de costo fijo (es lo que le cuesta arrancar), ms un joule por cada
minuto que vuela,
Para hacerla fcil vamos a representar los joules, gramos y minutos con nmeros, p.ej. la cantidad
30 joules la vamos a representar con el nmero 30.
energia
energiaCalculada
comiAlpiste: gramos
vol: minutos
Pepita
Volviendo, con el planteo que hicimos alcanza con que pepita tenga una sola variable (un solo
colaborador interno), llammosla energaCalculada.
El cdigo para pepita es como sigue, indentando para marcar las distintas partes
Pepita
variables
energaCalculada
mtodos
comiAlpiste: gramos
"Le indican a pepita que comi alpiste; el parmetro es la cantidad expresada en gramos"
energiaCalculada := energiaCalculada + (gramos * 4)
vol: minutos
"Le indican a pepita que vol; el parmetro es la duracin del vuelo expresada en minutos"
Se nos abre luego la ventana de System Browser: Nautilus, en la cual podemos crear nuestros
paquetes, con sus clases y sus correspondientes categoras de mtodos y mtodos, modificarlos, entre otras
cosas.
Luego, creamos un nuevo protocolo llamado negocio, con los mtodos especficos de la clase.
Ahora usemos a pepita. En Smalltalk Pharo, esto se puede hacer creando un entorno en el cual se
interacta con el objeto (obviamente, envindole mensajes). Ese entorno es una ventana de texto; el texto
se escribe, se pinta y se evala; si hay un resultado, se muestra en la misma ventana. Los envos de mensajes
se separan con un punto decimal, como si cada uno fuera una oracin.
Supongamos que la simulacin que le interesa al ornitlogo es esta secuencia: comer 50 gramos de
alpiste, volar 5 minutos, comer otros 30 gramos, volar 10 minutos. Entonces abrimos una ventana
Workspace, de la siguiente forma:
a) Para abrir la ventana Workspace, presionamos botn derecho del ratn, y seleccionamos
Worskspace.
pepita energa.
Para visualizar los resultados, usaremos la ventana Transcript, la cual la podemos encontrar presionando el
botn derecho del ratn, seleccionando Tools, y luego Transcript, como se muestra a continuacin.
Una vez que tenemos abierta la ventana Transcript, en la ventana Worskspace, pintamos solamente
esta lnea (pepita energa), y ponemos evaluar. Ahora s me va a dar un resultado interesante, que es 285
como esperbamos.
energa
"Devuelve la energa del receptor medida en joules"
^energaIngerida - energaConsumida
reset
"Vuelve pepita a un estado inicial"
energaIngerida := 0
energaConsumida := 0
Cmo logramos esto? Porque no cambiamos el protocolo del objeto, o sea el conjunto de
mensajes que entiende; y lo nico que ve el usuario del objeto son los mensajes que entiende, no ve cmo
el objeto lo implementa adentro suyo (mtodos y estado interno).
Trabajando en Smalltalk, el ornitlogo no tiene forma de conocer la forma del estado interno de
pepita, ni sus valores; y tampoco puede acceder a detalles sobre cul es la implementacin que est detrs
de los mensajes que le enva. Lo nico que conoce es el comportamiento que pepita exhibe; es lo nico que
necesita conocer para poder interactuar con el objeto.
Esta idea de que un observador no ve todos los aspectos de un objeto sino solamente aquellos que
le le sirven para interactuar con l se llama encapsulamiento; la idea del nombre es que los aspectos
internos del objeto se encapsulan de forma tal que los observadores no pueden verlos.
La idea de encapsulamiento tambin puede observarse en la relacin que nosotros tenemos con el
mundo que nos rodea: para interactuar con una videocasettera me alcanza con entender el control remoto,
no necesito (afortunadamente!) saber p.ej. por dnde pasan las correas que llevan el movimiento del
motor a los cabezales; para darle de comer a una golondrina no necesito la composicin qumica de sus
jugos gstricos, y miles de etc.
Al encapsular un objeto, estoy al mismo tiempo acotando y explicitando (haciendo explcitas) las
formas posibles de interaccin; slo se puede interactuar con un objeto mediante el comportamiento que
exhibe. Esto nos da varias ventajas que pasamos a comentar.
Como las formas de interaccin son acotadas y las maneja quien programa el objeto, se hace ms
sencillo probar si un objeto se comporta correctamente.
si los patrones de interaccin con dos objetos son los mismos, lo lgico es que tengan un
vocabulario en comn(Protocolo Conjunto de mensajes). Yendo un poco ms all en esta idea, si hago esto
le va a ser ms fcil al observador hablar con uno o con el otro indistintamente.
Veamos cmo sera la codificacin de pepe
Pepe
variables
energaCalculada
mtodos
comiAlpiste: gramos
"Le indican a pepe que comi alpiste; el parmetro es la cantidad expresada en gramos"
energiaCalculada := energiaCalculada + (gramos * 16) - 45
vol: minutos
"Le indican a pepe que vol; el parmetro es la duracin del vuelo expresada en minutos"
energiaCalculada := energiaCalculada - 30
energa
"Devuelve la energa del receptor medida en joules"
^energaCalculada
reset
"Vuelve pepe a un estado inicial"
energaCalculada := 0.
Si quiero ejecutar la misma simulacin con pepe en lugar de con pepita qu tengo que cambiar en
el cdigo? Solamente el objeto al que le envo los mensajes. Al observador le es felizmente indistinto hablar
con uno o con el otro, no necesita ninguna adaptacin.
Ahora demos un paso ms. El ornitlogo tiene preparados distintas simulaciones, que evalan lo
que pasara con la energa de un ave en distintos escenarios; tiene datos de varias aves y quiere aplicarles
los distintos escenarios a cada una y ver con cunta energa quedan.
A esta altura est clarsimo que vamos a representar cada ave con la que quiere trabajar el
ornitlogo mediante un objeto, y que todos estos objetos van a entender el mismo protocolo, los mensajes
reset, comiAlpiste:, vol: y energa.
Observemos que adems de trabajar con muchas aves, el ornitlogo quiere tener a mano muchas
simulaciones. Entonces, de repente tiene inters de representar simulaciones as como representamos
aves. Una vez decidido esto, debera quedarnos claro que van a aparecer objetos simulacin, porque (otra
vez) cualquier ente que quiera representar, lo voy a representar mediante un objeto.
Cmo va a interactuar el ornitlogo con un objeto simulacin? Pasndole el (objeto) ave con el
que quiere que trabaje, y despus dicindole sencillamente algo as como dale masa.
Ergo, los objetos simulacin van a entender dos mensajes, a los que vamos a llamar trabajCon: y
daleMasa.
Empecemos armando una simulacin en el cual los pjaros comen mucho, al que vamos a llamar
simulacinGlotona.
Pensemos un poco en cmo implementarlo.
En el mtodo daleMasa vamos a indicarle al ave con la que estamos trabajando la secuencia de
eventos propios de la simulacin, y a devolver la energa que tiene el ave despus de estos eventos.
La simulacin necesita acordarse del objeto ave (colaborador externo) que le pasaron para
trabajar, esto lo va a hacer en el mtodo trabajCon:.
trabajCon: unAve
ave
daleMasa
SimulacionGlotona
trabajCon: unAve
energia
energiaCalculada
comiAlpiste: gramos
T1
vol: minutos
Pepita reset
energia
energiaCalculada
comiAlpiste: gramos
T2
vol: minutos
Pepe reset
Los TIPOS T1 y T2 que se corresponden con los protocolos de ambos Objetos; Pepita y Pepe son Polimorfos,
lo que posibilita que en el mbito del colaborador ave, pueden ser intercambiados.
El cdigo de Simulacin Glotona
SimulacinGlotona
variables
ave
mtodos
trabajCon: unAve
"Le ordenan trabajar con un ave determinada"
ave := unAve
daleMasa
"Le ordenan ejecutar la simulacion"
ave reset.
ave comiAlpiste: 50.
ave vol: 5.
ave comiAlpiste: 30.
ave vol: 10.
^ave energa.
Ahora al ornitlogo le resulta mucho ms fcil evaluar la simulacin para un ave, p.ej. pepita. El
cdigo en la ventana de interaccin queda as:
simulacinGlotona trabajCon: pepita.
simulacinGlotona daleMasa.
Nota antes de seguir: observamos que el parmetro que recibe trabajCon: es un ave. Queremos
destacar esto para mostrar que cualquier objeto puede ser colaborador externo, no solamente los nmeros
uotros objetos simples.
Volviendo, tuvimos que cambiar el cdigo de simulacinGlotona para que trabaje con pepe o con
pepita?
No, para la simulacin trabajar con pepe o con pepita es exactamente lo mismo. De hecho, la idea
es que para la simulacin sea lo mismo trabajar con cualquier ave que yo quiera representar, eso tiene
mucho inters porque puedo usar la misma simulacin para todas las aves.
Obviamente para que esto pase, cada ave que represente tiene que tener un mismo protocolo, o lo
que es lo mismo que entender los mensajes reset, comiAlpiste:, vol: y energa; porque si no en el mtodo
daleMasa le voy a estar enviando al ave un mensaje que no entiende.
De hecho, la simulacin podr interactuar con cualquier objeto que entienda estos cuatro
mensajes, el que sea un ave o no a la simulacin no le importa nada.
Lo que termina pasando es que la simulacin puede interactuar con muchos objetos distintos, de
los cuales lo nico que conoce es cmo de interactuar con ellos, y sin tener que hacer ninguna modificacin
en la simulacin para que trabaje con uno o con el otro.
A esta caracterstica de poder trabajar con objetos distintos en forma transparente la llamamos
polimorfismo; decimos que pepita y pepe son objetos polimrficos.
Ahora, a quin le sirve que pepita y pepe sean polimrficos? A pepita? A pepe? Claro que no!
Le sirve al usuario de pepita y de pepe, que en este caso es es otro objeto, simulacinGlotona.
Lo implementamos ahora en Smalltalk Pharo
pepita := Pepita new.
pepita reset.
pepe := Pepe new.
pepe reset.
simulacion := SimulacionGlotona new.
simulacion trabajCon: pepita.
simulacion daleMasa.
Si ahora:
simulacion trabajCon: pepita.
simulacion daleMasa.
5. BIBLIOGRAFA
Descubra Smalltalk. Autor: Wilf LaLonde. Editorial: ADDISON-WESLEY / DIAZ DE SANTOS. Ao: 1997.
Inside Smalltalk. Vol. II: Lalonde y J. Pugh; Prentice Hall International; 1991.
Smalltalk-80 The Language and Its Implementation. Autores: Adele Goldberg and David Robson.
Editorial: Ao: 1983.
Notas de clase de Tpicos II, curso de la Maestra en Ingeniera de Software UNLP, dictada en 2002 por
Mximo Prieto. Documentos de Juan Carlos Vazquez.
Pharo por Ejemplo. Andrew P. Black, Stphane Ducasse, Oscar Nierstrasz, Damien Pollet With Damien
Cassou and Marcus Denker. Version of 2013-05-12.