Está en la página 1de 54

1

Universidad de Granada
E.T.S. Ingeniera Informtica
Diego Montesinos Hervs
Irene Daz Valenzuela
Andrs Herrera del Pino
Jos Antonio Sez Muoz
3 Ingeniera Informtica
Programacin Dirigida a Objetos
Grupo B - Curso 2006-2007
Eiffel
2
1.Introduccin
3
1.Introduccin
Eiffel es un lenguaje de programacin orientado a
objetos centrado en la construccin de software
robusto.
Diseado por Bertrand Meyer, apareci en 1985 y
fu desarrollado por Meyer y Eiffel Software.
Eiffel es un lenguaje con tipos fuertes, pero relajado
por herencia. Implementa administracin automtica
de memoria, generalmente mediante algoritmos de
recoleccin de basura.
4
1.1 Caractersticas esenciales
- Mecanismos de ayuda al Diseo por contrato que
se integraron firmemente con el mecanismo de
herencia y otras construcciones del lenguaje.
- Estructura de programa orientada a objetos, las
clases son la unidad bsica.
- Asignacin esttica de tipos.
- Ayuda para la gestin automtica de memoria,
implementada por el recolector de basura.
- Papel central de la herencia, incluyendo herencia
mltiple y mecanismo para hacerla segura.
5
1.1 Caractersticas esenciales
- Un sistema uniforme de tipos que maneja las semanticas
de referencia y valor, donde todos los tipos (incluyendo los
tipos bsicos) estn basados en clases.
- Tipos genricos.
- Bloques(agent) (similares a los de Smalltalk)
- Rutinas 'once' (evaluadas solamente la primera vez), para la
comparticin de objetos e inicializacin.
- Sintaxis basada en las palabras clave de ALGOL/Pascal
pero sin separador (se puede usar el punto y coma, es
opcional).
6
1.2 Caractersticas de diseo
- Eiffel enfatiza en sentencias declarativas sobre
cdigo procesal.
- Eiffel evita los trucos de codificacin o tcnicas de
codificacin previstas.
- Se intenta no slo hacer cdigo ms legible, sino
tambin permitir a los programadores concentrarse en
los aspectos importantes del programa sin meterse
en detalles de implementacin.
7
1.2 Caractersticas de diseo
La simplicidad de Eiffel se ha pensado para promover
respuestas simples, extensibles y reutilizables para los
problemas de computacin.
Los compiladores proveen tcnicas de optimizacin con el
objetivo de crear cdigo extremadamente eficiente,
comparable a C++, por ejemplo.
Al igual que los lenguajes de programacin vistos en la
asignatura, Eiffel tambin utiliza semntica en el heap.
8
2.Caractersticas
de Eiffel
9
2.Caractersticas
La meta del lenguaje, bibliotecas, y
mtodos de programacin es crear un
software que utilice mdulos lo ms
reutilizables posible.
10
2.1 Eiffel soporta...
Herencia mltiple: permite que una
clase herede de varias superclases.
Adems posibilita a los subtipos
adaptarse a sus propiedades
heredades renombrndolas o
estableciendo reglas de seleccin
para ellas.
11
2.1 Eiffel soporta...
Tipos genricos: Eiffel usa tipos
parametrizados (genricos), como en
otros lenguajes como Ada, Java, C#,
que permiten definir un tipo sin
especificar todos los otros tipos que
usa. Los tipos no especificados son
sustituidos por parmetros en estos
puntos del cdigo.
12
2.1 Eiffel soporta...
Polimorfismo: capacidad que tienen
objetos de diferentes clases de responder
al mismo mensaje. Esto significa que
puede haber muchos mensajes con el
mismo nombre, en diferentes clases.
Cada clase responde al mensaje con su
cdigo propio (mtodo).
13
2.1 Eiffel soporta...
Encapsulacin : ocultamiento del estado, es decir,
de los datos miembro, de un objeto de manera que
slo se puede cambiar mediante las operaciones
definidas para ese objeto.
De esta forma, el usuario de la clase puede obviar la
implementacin de los mtodos y propiedades para
concentrarse slo en cmo usarlos. Por otro lado se
evita que el usuario pueda cambiar su estado de
maneras imprevistas e incontroladas.
14
2.1 Eiffel soporta...
Asignacin fuerte de tipos
En LPs con tipos, una expresin de valores est
bien formada cuando a su valor se le puede
asignar un tipo, ya sea en tiempo de compilacin o
de ejecucin.
No se procede a la evaluacin si no se ha podido
determinar por inferencia dicho tipo
Podramos hablar de tipo de la expresin
Los LPs en que las expresiones han de ser
consistentes respecto a los tipos se dice que son
LPs con asignacin fuerte de tipos
15
2.1 Eiffel soporta...
Equivalencia de mtodos y tipos: como
ya sabemos de otras asignaturas, en
algunos LPs, si S es subtipo de T, podemos
utilizar S donde se espere un parmetro de
tipo T, y si una funcin devuelve un tipo T,
podra devolver tipo S sin problema ninguno.
Por extensin, donde corresponde una
clase cualquiera, nos podemos encontrar
con cualquier subclase suya.
16
2.2 Contribucin de Eiffel
Su contribucin ms importante a la ingeniera del
software es el Diseo por Contracto (DbC), en el
cual se tienen:
Assertions(afirmaciones)
Precondiciones
Postcondiciones
Invariantes de clase
que son usadas para asegurar la correccin
del programa sin sacrificar la eficiencia.
17
2.2 Contribucin de Eiffel
Assertions(afirmaciones)
En Eiffel, las afirmaciones son
integradas en el lenguaje y son
extradas automticamente para
generar la documentacin de la
clase.
18
2.2 Contribucin de Eiffel
Una afirmacin es un predicado (por ejemplo, una
expresin booleana) situada en un programa para
indicar que la afirmacin es verdad en ese lugar. Por
ejemplo, el siguiente cdigo contiene dos
afirmaciones:
x:= 5;
{x > 0}
x:= x + 1
{x > 1}
Se usan para ayudar a la especificacin de
programas y asegurar la correccin del cdigo.
19
2.2 Contribucin de Eiffel
Algunos lenguajes de programacin modernos incluyen la
sentencia de afirmacin (assert(cond)) que es una condicin
que se comprueba en tiempo de ejecucin. Si la evaluacin
de la condicin falla, se produce un fallo de afirmacin como
resultado, el cual puede causar que la ejecucin se aborte o
puede causar el reconsiderar una va alternativa para el
programa.
El uso de afirmaciones ayuda al programador a disear,
desarrollar y comprobar la correccin del cdigo. Adems
permite hacer comprobaciones durante el proceso de pruebas,
durante la ejecucin, y detectar los posibles fallos, permitiendo
al programador detectar bugs de sus programas.
20
2.2 Contribucin de Eiffel
Precondiciones:
Es una afirmacin (condicin o predicado) que
debe ser siempre verdadero al principio de la
ejecucin de alguna seccin de cdigo.
Si la precondicin falla, el efecto de la seccin de
cdigo puede estar indefinido y puede que se
produzcan errores en la ejecucin.
Ejemplo: para calcular el factorial de un nmero
la precondicin es que el nmero sea mayor o
igual que 0.
21
2.2 Contribucin de Eiffel
Postcondiciones:
Es una afirmacin (condicin o predicado) que
debe ser siempre cierto justo despus de la
ejecucin de un algn trozo de cdigo.
Ejemplo: Para una funcin que calcule el
factorial, la poscondicin puede ser que el
resultado sea siempre mayor o igual que 1.
22
2.2 Contribucin de Eiffel
Invariante de representacin.
Es una serie de condiciones impuestas sobre los
objetos de una clase que determinan si un objeto
est o no bien formado.
Los mtodos de la clase deben preservar el
invariante de representacin.
Los invariantes de representacin son establecidos
durante la construccin y continuamente se mantiene
tras las llamadas a los mtodos pblicos.
23
2.2 Contribucin de Eiffel
El diseo de Eiffel est basado en la teora de la
programacin orientada a objetos.
El lenguaje tiene un soporte formal para tipos
abstractos de datos.
Bajo el correcto diseo de texto software se debe ser
capaz de reproducir una documentacin para el
diseo final del software a partir de la informacin de
la implementacin que est formalizada para el tipo
abstracto de dato.
24
2.3 Implementaciones y entornos
EiffelStudio es un entorno de desarrollo integrado
(cdigo libre o licencias comerciales). Es un
entorno orientado a objetos que usa tcnicas de
interfaz de usurario como el pick-and-drop.
EiffelEnvision es un pluggin para Microsoft Visual
Studio, que permite a los usuarios editar ,compilar y
depurar programas en Eiffel al usar Microsoft Visual
Studio IDE.
25
2.3 Implementaciones y entornos
Existen dos implementaciones de cdigo libre:
SmartEiffel (implementacion GNU, basada en una
versin anterior del lenguaje)
Visual Eiffel.
Originalmente, el lenguaje Sather estaba basado en
Eiffel, pero fue modificndose, y ahora incluye
varias caractersticas de la programacin funcional.
Parte de Apple Media Tool est basado en Eiffel.
26
2.4 Especificaciones y estndares
El lenguaje Eiffel es un estndar
internacional de la ISO (International
Organization for Standardization).
El estndar fue desarrollado por ECMA
International y su primera versin fue aprobada
por ECMA el 21 de Junio de 2005 como el
standard ECMA 367 (Eiffel: Analysis, Design
and Implementation Language)
27
2.4 Especificaciones y estndares
La segunda edicin fue adoptada por ECMA en
Junio de 2006 y en el mismo ao por la ISO
(Noviembre de 2006).
El desarrollo software de Eiffel y de sus bibliotecas,
dio lugar a implementar un estndar; Eiffel
Software's EiffelStudio 5.7, que implementa
algunos de los mejores mecanismos del lenguaje.
El equipo de SmartEiffel se apart de este estndar
para crear su porpia versin del lenguaje, el cual
parece est ms cerca del estilo original de Eiffel.
28
2.4 Especificaciones y estndares
Bibliografa de especificacin del lenguaje Eiffel:
Bertrand Meyer: Eiffel: The Language, Prentice Hall,
segunda edicin, 1992 (primera edicin: 1991)
Bertrand Meyer: Standard Eiffel, 1997.
Bertrand Meyer: Object-Oriented Software Construction,
Prentice Hall: primera edicin, 1988; segunda edicin, 1997.
29
3.Cmo programar
en Eiffel
30
3.Cmo programar en Eiffel
Un programa en Eiffel es un conjunto de clases.
Pueden definirse conjuntos de clases denominados cluster.
Estos conjuntos pueden subdividirse en subclusters
anidados
Las clases contienen features que son similares a los
mtodos en otros lenguajes.
En una clase se definen sus invariantes y contienen otras
propiedades tales como las notes que es una seccin para
incluir la documentacin.
Los tipos de datos estndar son tambin clases.
Todo sistema tiene una clase denominada root, que
contendr un constructor llamado root procedure. Para
ejecutar un programa en Eiffel se debe crear una instancia
de la clase root y ejecutar su root procedure.
31
3.Cmo programar en Eiffel
Existen seis instrucciones bsicas en Eiffel:
asignacin, creacin de objetos, llamada a
rutinas, condicional y seleccin.
Para facilitar la abstraccin de datos y el
ocultamiento de informacin, Eiffel, igual que
ocurra en SmallTalk no permite la asignacin entre
variables de instancia de los objetos, sino que
necesita de una interfaz para manejar los datos.
El concepto de diseo por contrato es central en
Eiffel, sus mecanismos estn muy integrados en el
lenguaje. Las caractersticas del contrato se
extienden por medio de la herencia.
32
3.1 Ejemplo de programa en Eiffel
class
HELLO_WORLD
create
make
feature
make is
do
io.put_string (Hello
World!)
io.put_new_line
end
end
33
3.2 Descripcin de una clase
Una clase contiene un conjunto de feature (mtodos). Como las
clases representan un conjunto de objetos, un feature es una
operacin sobre estos objetos. Estas pueden ser de dos tipos:
Consultores, que dan informacin sobre una instancia
rdenes que modifican una instancia.
Esta distincin es importante en los mtodos de Eiffel. En particular:
Principio de Acceso Uniforme: desde el exterior cualquier
consultor es un atributo o el resultado de una operacin. La
notacin es la misma en ambos casos.
Principio de separacin entre las rdenes y consultores.
Esto no es una regla del lenguaje, pero se entiende como una
buena prctica de programacin que no se realicen cambios en
el mismo.
34
3.3 Sobrecarga
Eiffel soporta la sobrecarga de funciones y operadores, es
decir, los nombres de funciones pueden volver a usarse en
diferentes clases, pero siempre haciendo referencia al mismo
comportamiento.
Para hacer uso de esta funcionalidad simplemente tenemos
que asignar el mismo nombre a distintos feature en las distintas
clases implicadas. Veamos un ejemplo con el operador +
a + b for a,b: INTEGER
a + b for a,b: REAL
a + b for a,b: VECTOR [INTEGER]
Sin embargo, Eiffel no soporta la sobrecarga de funciones
dentro de una misma clase como ocurre en otros lenguajes
como C++, por tanto, las funciones f (x: X) y f(y: Y) no podran
convivir en la misma clase.
35
3.4 Genricos
Pueden definirse clases genricas que usen
parmetros. Estos parmetros genricos aparecen
entre parntesis.
class LIST [G]..-
G es llamado parmetro formal genrico. En la
declaracin, G representa un tipo arbitrario, por
tanto, una funcin podr devolver un valor de tipo
G y una rutina usarlo como argumento.
item: G do ... end
put (x: G) do ... end
36
3.4 Genricos
Tambin es posible tener parmetros formales
limitados, para los que el parmetro actual debe
heredarse de una clase dada. Por ejemplo en
class HASH_TABLE [G, KEY -> HASHABLE]
una derivacin HASH_TABLE [INTEGER,
STRING] slo es vlida si STRING hereda de
HASHABLE. Teniendo KEY limitada por
HASHABLE significa que para x: KEY podremos
aplicarle a x todos los mtodos de HASHABLE.
37
3.5 Herencia
Para heredar de una o ms clases, se debe incluir la
palabra reservada inherit al principio:
class C inherit
A
B
... Rest of class declaration ...
38
3.5 Herencia
Una clase puede sobrecargar alguno de los
features heredados. Esto debe aparecer
explcitamente en la declaracin, usando la
palabra reservada redefine en la clausula de
herencia
class C inherit
A
redefine f, g, h end
B
redefine u, v end
39
3.6 Clases y mtodos abstractos
Las clases pueden definirse como deferred class en lugar
de como class para indicar que esas clases no pueden ser
instanciadas. Es lo que en otros lenguajes se conoce como
clases abstractas.
Un mtodo o feature puede ser igualmente abstracto
colocando la palabra deferred en lugar de una clausula do.
Si una clase tiene algn mtodo deferred debe declararse
como tal, aunque tambin pueden hacerlo clases que no los
contengan.
40
3.7 Renombramiento
Cuando una clase hereda de una o ms clases, toma todos
sus mtodos con los nombres originales. Es posible en este
lenguaje renombrarlos haciendo uso de la palabra reservada
rename.
Esto es especialmente necesario en el caso de la herencia
mltiple, pues puede darse el caso de colisiones entre
mtodos de distintas clases, lo cual violara el principio de no
sobrecarga de nombres dentro del mismo mtodo, devolviendo
un error.
41
3.8 Tuplas
El tipo tupla puede verse como una forma simple de
clase, dando solo atributos y el correspondiente
constructor. Un ejemplo tpico sera:
TUPLE [name: STRING; peso: REAL; date: DATE]
y puede usar como una forma simple de descripcin
cuando una clase no es necesaria. Una instancia de
una tupla es simplemente una secuencia de valores
entre parentesis
["Brigitte", 3.5, Anoche]
42
3.8 Tuplas
Los componentes de una tupla pueden accederse
como si fueran atributos de una clase, por ejemplo
si t ha sido asignado a la tupla, t.peso sera 3.5
La notacin del punto tambin puede usarse para
asignar valores a una tupla
t.peso := t.peso + 0.5
Los nombres de atributos son opcionales, por tanto,
puede expresarse una tupla como TUPLE [A, B, C].
43
3.9 Bloques (agent)
Pueden ser utilizados para realizar iteraciones
Una_lista.do_all (agent accin)
Si queremos ejecutar las acciones solo para los
elementos que cumplen una condicin
Una_lista.do_if (agent accin, agent condicin)
44
3.9 Bloques (agent)
En los ejemplos anteriores, accin y condicin son rutinas. Al
poner la palabra agent delante se llama automticamente con
los parmetros adecuados.
Si deseamos llamar a una rutina cualquiera, podemos hacerlo
de 2 formas
a.call([args]) siendo a una rutina
Directamente a ([args])
Los argumentos se pasan como una tupla
45
3.10 Mtodos una sola vez
(once routines)
Estos mtodos realizan los clculos una sola vez (en la
primera llamada), y las dems veces que se invocan devuelven
una referencia al resultado.
Para declarar estos mtodos utilizaremos la palabra once en lugar
de do.
shared_object: SOME_TYPE
once
create Result.make (args)
-- This creates the object and returns a
reference to it through Result
end
46
3.11 Conversiones
Eiffel proporciona, al igual que otros muchos
lenguajes, mecanismos de conversin.
Simplemente generaliza los mecanismos de
conversin de la mayora de los lenguajes de
programacin, pudindose aplicar siempre que
los tipos sean compatibles.
47
3.11 Conversiones
Se puede realizar:
my_string := my_date
Convierte una fecha en un string.
create my_string.make_from_date (my_date)
Para realizar la conversin de la primera forma,
es necesario que haya un constructor
implementado para dicho fin, es decir, haber
implementado la segunda forma
48
3.12 Manejo de excepciones
Se realiza a nivel de procedimientos.
Si una operacin falla en una rutina, la rutina
entera falla y se produce un error.
Si dicho error no lo maneja dicha rutina es
transferido a la rutina superior, as
sucesivamente hasta que, o bien se captura la
excepcin, o llega el error al SO.
49
3.12 Manejo de excepciones
Para capturar las excepciones se utilizan los bloques
rescue. stos se ejecutan cuando se produce un fallo.
Son similares a los bloques trycatch de Java.
Se puede volver a probar a ejecutar la rutina que fall
despus de realizar las operaciones de gestin del
error usando la palabra retry dentro del cdigo del
bloque rescue (esto no existe en Java).
50
3.13 Concurrencia
Existen bibliotecas de hebras como
EiffelThreads y otras muchas, pero
que an no forman parte de la
espcificacin estndar oficial de Eiffel.
51
3.14 Operadores
La interpretacin de una operacin del tipo a+b es a.plus(b).
Para implementar un alias para una funcin se hace lo
siguiente:
<func> alias <op> (<param>:<tipo>):<tipo_devuleto>
---declaracin normal de funcin---
end
52
3.14 Operadores
Existen tambin operadores libres que se pueden
utilizar para definir sintaxis infija o prefija, por
ejemplo para aplicaciones matemticas o fijas.
Cada clase puede tener, adems, una funcin
asociada con el operador [] para poder utilizar la
notacin a[i] en las clases que tengan estructura
similar a un array (vectores, matrices, ).
53
3.15 Lxico y sintaxis
Eiffel no es sensible a las maysculas
Los comentarios de linea se indican con - -
El separador de instrucciones (;) se suele omitir, salvo para
separar instrucciones en la misma lnea
Es usual agrupar los mtodos con caractersticas similares
para una mayor legibilidad
class <nombre> inherit <clases>
feature
--declaraciones
...
end
54
3.15 Interfaces para otras
herramientas y lenguajes
Eiffel, a pesar de ser un L.O.O., posee una
arquitectura abierta para interaccionar con
software externo.
Proporciona un interfaz directo con C/C++. La
mayora de los compiladores de Eiffel utilizan C
como lenguaje intermedio.
Las ltimas versiones del compilador SmartEiffel
ofrcen tambin la posibilidad de generar bytecode
de Java

También podría gustarte