Post on 12-Jun-2015
Didier Fabián Granados Muñoz
Sesión No. 5 – La Web y la Orientación a Objetos
Septiembre 2 de 2009
Bueno… y qué es un paradigma?
Un paradigma es un conjunto de teorías generales,
suposiciones, leyes o técnicas de que se vale una escuela de
análisis o comunidad científica para evaluar todas las cosas.
La Programación Orientada a Objetos es intentar llevar a un
programa de computador una visión de un problema que sea
lo más cercana posible a la realidad, de acuerdo al ámbito en el
que se desarrolla el mismo.
El mundo está lleno de objetos reales, los
cuales se pueden representar como tales
en una solución computarizada.
Clase
Objeto
Es el molde o plantilla con el que se puede construir
objetos. En otras palabras, es una abstracción de
objetos.
Es cualquier cosa de la cual podamos emitir un concepto,
o descripción. En la POO, un objeto es una instancia de
una clase, llamando instanciar al hecho de producir y
completar un objeto llenando con valores sus atributos.
Los objetos no solo tienen sus características. También
tienen la capacidad de ejecutar diferentes acciones.
Encapsulamiento.
Público.
Privado.
Protegido.
Herencia.
Simple.
Múltiple.
Polimorfismo.
Sobrecarga de métodos.
Tipificación.
Concurrencia.
Persistencia.
Entre otras…
En UML, una clase está representada por un rectángulo con tres
secciones.
Nombre de la clase
Atributos de la clase con
su encapsulamiento y
tipo de dato.
Métodos de la clase, con
su encapsulamiento y tipo
de dato que retorna,
class System
Chev rolet
Automóv il
Mazda Renault
Un taxi es un automóvil con número de operación y que trabaja para una empresa.
Asociación Agregación Composición
“es parte de” “debe tener”“se relaciona con”
Genericidad.
Excepciones.
Interfaces.
Clases abstractas.
Hay muchos lenguajes, pero solo vamos a ver lo necesario…
La teoría que vimos en la clase pasada tiene su aplicación
en un lenguaje de programación que sea orientado a
objetos.
Dependiendo del lenguaje, muchas cosas se aplican de la
misma manera, pero hay otras que sí tienen diferencias
extremas (especialmente la sintaxis) y que, sencillamente,
no están.
A continuación se hará un recorrido por la
implementación más sencilla y común que existe en todos
los lenguajes orientados a objetos.
También se irán viendo palabras claves que no se han
dicho durante el curso, y se irán explicando en su
momento.
1. Para crear una clase
Se hace uso de la palabra
clave class.
Algunos lenguajes la
declaran con la primera
letra en mayúscula
(Class).
class Automovil
2. Para declarar atributos
Según la sintaxis del
lenguaje, se llama
primero el tipo de dato y
luego el nombre del
atributo.
Y antes del tipo de dato,
el tipo de
encapsulamiento.
public String color
3. Para declarar métodos
De igual manera que los
atributos, se llama
primero el tipo de dato y
luego al método.
Y antes del tipo de dato,
el encapsulamiento.
Si tiene parámetros, estos
deben tener primero el
tipo de dato y luego su
nombre.
public Motor setMotor(Motor motor)
4. Constructor
Un constructor es un método
perteneciente a la clase que
posee unas características
especiales:
Se llama igual que la clase.
No devuelve nada, ni
siquiera void.
Pueden existir varios, pero
siguiendo las reglas de la
sobrecarga de funciones.
De entre los que existan, tan
sólo uno se ejecutará al
crear un objeto de la clase.
También se encapsula. public Automovil()
5. Instanciación
Recordar que en la clase anterior se dijo cómo se instancia una
clase…
Existe la palabra clave new.
Cuando se define la instancia, ésta deberá ser tipada con la
misma clase y luego, se debe invocar al constructor de la clase.
Si hay sobrecarga del constructor, se debe invocar el que se
ajuste a las necesidades del programador.
Automovil mazda = new Automovil()
Automovil chevrolet = new Automovil(2009, "MOR345")
6. Invocación de atributos y métodos
Para invocar un método de una clase, depende de su
encapsulamiento y de que la clase haya sido instanciada, a no
ser que dicho método sea declarado como estático.
Normalmente se llama desde la misma variable de instancia.
Si es estático, se llama anteponiendo el nombre de la clase y
luego el nombre del atributo o método.
Automovil mazda = new Automovil();
Automovil chevrolet = new Automovil(2009, "MOR345");
int placa = mazda.getPlaca(); // mazda es instancia
int numeroPuertas = Automovil.numeroPuertas;
Los demás conceptos (herencia, interfaces, asociaciones…) son muy variables de acuerdo al lenguaje de programación.
Conceptos claros.
Orientación al Objeto pura.
Seguridad.
Alto nivel.
Modelo de ejecución simple.
Sintaxis fácil de leer.
Eliminación de la redundancia.
Pequeño.
De fácil transición a otros lenguajes.
Soporte para el aseguramiento de la corrección.
Entornos agradables.
El Simula 67 fue considerado como el primer lenguaje de
programación orientado a objetos.
Fue diseñado en 1967 por Ole-Johan Dhal y Kristen Nygaard
en el Norwegian Computing Center en Oslo.
El nombre de Simula 67 fue acortado a Simula en 1986,
existiendo un estándar del lenguaje desde 1987.
class POLIGONO;
virtual: procedure set_vertices
begin
procedure dibuja begin ... end;
end POLIGONO
POLIGONO class TRIANGULO
...
end TRIANGULO
...
ref(TRIANGULO) t; ref(POLIGONO) p;
...
p :- t;
p.set_vertices;
p.dibuja;
(p qua TRIANGULO).dibuja
Primer lenguaje creado con tecnología de objetos puros
El origen de Smalltalk está alrededor de 1970 en la
Universidad de Utah de la mano de Alan Kay
Smalltalk se desarrolla en el Xerox Palo Alto Research Center
(PARC) de la mano de Alan Kay, Adele Goldberg y Daniel
Ingalls
Los conceptos de Smalltalk han influido en el diseño de LPOO
y en el aspecto y sensación de los GUI como los de Macintosh
o Motif.
Algunas versiones: Smalltalk 72, Smalltalk 74, Smalltalk 76,
Smalltalk 78 y Smalltalk 80, Smalltalk/V de Digital.
Entorno de programación: Lenguaje Smalltalk básico, colección
de clases y el entorno real de programación.
El estilo del lenguaje se enfatiza la ligadura dinámica y no
realiza chequeo de tipos.
El bloque fundamental es la clase, que contiene la descripción
de variables y métodos.
Los métodos contienen el código, y definen cómo responde
un objeto a un mensaje.
La ejecución de una rutina de un objeto se denomina en la
terminología de Smalltalk “enviar un mensaje” al objeto, cuya
clase encontrará la forma apropiada de manejar dicho
mensaje.
Todo en Smalltalk son objetos, incluyendo a las propias clases.
El entorno de Smalltalk permite un rápido desarrollo de
programas.
La biblioteca de clases fue diseñada para ser extendida y
adaptada por adición de subclases para satisfacer las
necesidades de la aplicación.
La arquitectura Modelo Vista Controlador (MVC) es una
importante contribución de Smalltalk.
Concepto Características ¿Las implementa?
Abstracción Variables de instanciaMétodos de instanciaVariables de claseMétodos de clase
SíSíSíSí
Encapsulamiento De variablesDe métodos
PrivadoPúblico
Modularidad Tipos de módulo Ninguno
Jerarquía HerenciaUnidades genéricasMetaclases
SimpleNoSí
Tipos Comprobación estrictaPolimorfismo
NoSí
Concurrencia Multitarea Indirectamente(mediante clases)
Persistencia Objetos persistentes No
C++ es un lenguaje híbrido, extensión del lenguaje C.
Fue desarrollado por Bjarne Stroustrup en los laboratorios
AT&T.
Las primeras versiones del lenguaje se denominaron C con
clases, y datan de 1980.
El nombre de C++ se debe a Rick Mascitti, quien lo bautizó de
esta manera en el verano de 1983.
C++ fue instalado por primera vez fuera del grupo de
investigación del autor en julio de 1983.
En 1987 surge la necesidad de estandarización de C++.
Dispone de capacidades para la herencia simple y múltiple.
Por defecto C++ tiene ligadura estática.
Las funciones definidas como virtuales pueden beneficiarse del
concepto de ligadura dinámica.
C++ es estrictamente tipado, aunque admite la posibilidad de
casting.
No cuenta con un recolector de basura.
La ausencia de un gestor automático de memoria por defecto,
obliga al concepto de destructor.
Ocultamiento de la información incluso a los descendientes.
Cuenta con un mecanismo de acceso especial por parte de
una clase o una función que se declare como friend.
Soporte de manejo de excepciones.
Soporte de genericidad mediante las plantillas.
Permite sobrecarga de operadores.
Sintaxis oscura, y gramática difícil de analizar.
Lenguaje complejo, preocupado por la detección temprana de
errores, y por la eficiencia de la ejecución, perdiendo algo de
sencillez y de flexibilidad para el diseño.
…
#include <iostream.h>
#include <string.h>
class Saludos {
char *saludo;
public:
Saludos(char *msg) {
int longitud = strlen(msg);
saludo = new char[longitud+1];
strcpy(saludo, msg);
}
char* muestra(void) {return saludo;}
};
void main(void) {
Saludos s1("Hola Mundo }:()");
Saludos s2("Bye, dear friends :(((");
cout << s1.muestra() << endl;
cout << s2.muestra() << endl;
}
Concepto Características ¿Las implementa?
Abstracción Variables de instanciaMétodos de instanciaVariables de claseMétodos de clase
SíSíSíSí
Encapsulamiento De variablesDe métodos
Público, Privado, ProtegidoPúblico, Privado, Protegido
Modularidad Tipos de módulo Fichero
Jerarquía HerenciaUnidades genéricasMetaclases
MúltipleSíNo
Tipos Comprobación estrictaPolimorfismo
SíSí
Concurrencia Multitarea Indirectamente(mediante clases)
Persistencia Objetos persistentes No
Eiffel fue desarrollado por Bertrand Meyer.
Es un lenguaje orientado al objeto puro.
Soporta ligadura dinámica.
Tiene comprobación estricta de tipos.
Admite herencia múltiple.
Soporta clases parametrizadas.
La gestión de memoria la lleva a cabo el entorno de
programación.
Eiffel proporciona una biblioteca de clases predefinidas muy
completa.
Eiffel cuenta con la clase como único criterio de estructuración.
Una declaración de clase en Eiffel puede incluir una lista de
características exportadas, una lista de clases predecesoras, y
una lista de declaraciones de características
Cuenta con manejo de excepciones
class STACK[T]
creation
create
feature {NONE}
elems : ARRAY[T];
feature
max_size : INTEGER;
total : INTEGER;
create(n : INTEGER) is
require
n > 0
do
!!elems.make(1,n);
max_size := n
ensure
max_size = n;
total = 0;
end;
empty : BOOLEAN is do
Result := total = 0
ensure
equal(strip(), old strip())
end;
...
pop is require
not empty
do
total := total -1
ensure
total = old total -1;
not full
end
invariant
0 <= total;
total <= max_size
end – STACK
Concepto Características ¿Las implementa?
Abstracción Variables de instanciaMétodos de instanciaVariables de claseMétodos de clase
SíSíNoNo
Encapsulamiento De variablesDe métodos
Público (sólo lectura), Privado, SelectivamentePúblico, Privado, Selectivamente
Modularidad Tipos de módulo Clase
Jerarquía HerenciaUnidades genéricasMetaclases
MúltipleSíNo
Tipos Comprobación estrictaPolimorfismo
SíSí
Concurrencia Multitarea Sí (mediante clases de bibliotecas)
Persistencia Objetos persistentes Sí (mediante clases)
Realizado por un equipo de
Sun Microsystems a finales de
1995.
Ha recibido una especial
atención desde los primeros
meses de 1996.
Es un lenguaje orientado al
objeto puro diseñado desde
cero, que recibe muchas
influencias de C++.
Soporta threads (hilos).
Recogida de basura
automática.
Se le atribuyen las siguientes características
Simple y poderoso.
Seguro.
Robusto.
Interactivo.
Independiente de la arquitectura.
Interpretado.
Sencillo de aprender (Hmmmmmmmmm…)
Java produce un bytecode que será interpretado por una
máquina virtual.
La máquina virtual se encuentra a menudo en navegadores
web.
La explosión de Internet ha influido en el auge de Java.
class _saludos {
String saludo = "";
_saludos(String msg) {
saludo = msg;
}
public void mostrar() {
System.out.println(saludo);
}
}
class Saludos {
public static void main(String args[]) {
_saludos s1 = new _saludos("Hola Mundo :)))");
_saludos s2 = new _saludos("Adios amigos :((");
s1.mostrar();
s2.mostrar();
}
}
Concepto Características ¿Las implementa?
Abstracción Variables de instanciaMétodos de instanciaVariables de claseMétodos de clase
SíSíSíSí
Encapsulamiento De variablesDe métodos
Público, Privado, ProtegidoPúblico, Privado, Protegido
Modularidad Tipos de módulo Fichero
Jerarquía HerenciaUnidades genéricasMetaclases
SimpleNoNo
Tipos Comprobación estrictaPolimorfismo
SíSí
Concurrencia Multitarea Indirectamente(mediante clases)
Persistencia Objetos persistentes EJB
Bueno… y entonces…
La programación dinámica en la
Web se inició con la incrustación del
código del lenguaje seleccionado
dentro del código HTML.
Dada la evolución del modelo y la
arquitectura de las aplicaciones, se
optó por separar la capa de lógica
de la capa de presentación.
También han surgido diferentes
frameworks que han permitido
extender el concepto de reutilización
de código.
La programación dinámica en la
Web se inició con la incrustación del
código del lenguaje seleccionado
dentro del código HTML.
Dada la evolución del modelo y la
arquitectura de las aplicaciones, se
optó por separar la capa de lógica
de la capa de presentación.
También han surgido diferentes
frameworks que han permitido
extender el concepto de reutilización
de código.
Un framework, en el desarrollo de software, es una estructura de soporte definida, mediante la cual otro proyecto de software puede ser organizado y desarrollado. Típicamente, puede incluir soporte de programas, bibliotecas y un lenguaje interpretado entre otros software para ayudar a desarrollar y unir los diferentes componentes de un proyecto.Representa una arquitectura de software que modela las relaciones generales de las entidades del dominio. Provee una estructura y una metodología de trabajo la cual extiende o utiliza las aplicaciones del dominio.
Y hablaremos entonces de…
PHP C#
Siglas de Hypertext Preprocessor.
Originalmente diseñado en Perl.
Totalmente orientado a la Web.
Inicialmente era un lenguaje procedural.
Desde la versión 4.2.x comenzó su propia implementación de POO,
aunque se robusteció en la versión 5.x.
Es un lenguaje interpretado.
Siempre tiene que estar en una etiqueta.
No cuenta con tipos de datos, es decir, cualquier variable puede ser
declarada y puede tomar cualquier valor.
Capacidad de conexión con la mayoría de los motores de base de
datos que se utilizan en la actualidad. Se destaca su conectividad con
MySQL y PostgreSQL.
Capacidad de expandir su potencial utilizando la enorme cantidad de
módulos (llamados ext's o extensiones).
Posee una amplia documentación en su página oficial, entre la cual se
destaca que todas las funciones del sistema están explicadas y
ejemplificadas en un único archivo de ayuda.
Es libre, por lo que se presenta como una alternativa de fácil acceso
para todos.
<?php
$saludo = "Hola";
echo $saludo;
?>
Concepto Características ¿Las implementa?
Abstracción Variables de instanciaMétodos de instanciaVariables de claseMétodos de clase
SíSíSíSí
Encapsulamiento De variablesDe métodos
Público, Privado, ProtegidoPúblico, Privado, Protegido
Modularidad Tipos de módulo Fichero
Jerarquía HerenciaUnidades genéricasMetaclases
SimpleNoNo
Tipos Comprobación estrictaPolimorfismo
SíNo
Concurrencia Multitarea Indirectamente(mediante clases)
Persistencia Objetos persistentes No
Su sintaxis básica deriva de C/C++.
A diferencia de PHP, es compilado.
Utiliza el modelo de objetos de la plataforma .NET (o dicho de
otra manera, .NET Framework), el cual es similar al de Java,
aunque incluye mejoras derivadas de otros lenguajes (entre
ellos Delphi).
Aunque forma parte de la plataforma.NET, C# es un lenguaje
de programación independiente diseñado para generar
programas sobre dicha plataforma.
Una variable de objeto de cierta clase no almacena los valores
del objeto sino su referencia (al igual que Java).
El operador de asignación no copia los valores de un objeto,
sino su referencia a él (al igual que Java).
Un constructor tiene el mismo nombre que su clase y es
sintácticamente similar a un método.
Un constructor no devuelve ningún valor.
Al igual que los métodos, los constructores también pueden
ser sobrecargados.
Si no se especifica un constructor en una clase, se usa uno por
defecto que consiste en asignar a todas las variables el valor
de 0, null o false según corresponda.
Para crear un nuevo objeto se utiliza la siguiente sintaxis:
variable = new nombre_clase();.
Un destructor se declara como un constructor, aunque va
precedido por el signo ~.
Se emplea una desasignación de memoria de objetos no
referenciados (recolección de basura), y cuando esto ocurre se
ejecuta el destructor de dicha clase.
El destructor de una clase no se llama cuando un objeto sale
del ámbito.
Todos los destructores se llamarán antes de que finalice un
programa.
La palabra clave this es un apuntador al mismo objeto en el
cual se usa.
La palabra clave static hace que un miembro pertenezca a una
clase en vez de pertenecer a objetos de dicha clase. Se puede
tener acceso a dicho miembro antes de que se cree cualquier
objeto de su clase y sin referencias a un objeto.
Un método static no tiene una referencia this.
Un método static puede llamar sólo a otros métodos static.
Un método static sólo debe tener acceso directamente a
datos static.
Un constructor static se usa para inicializar atributos que se
aplican a una clase en lugar de aplicarse a una instancia.
C# permite la sobrecarga de operadores con la palabra clave
operator.
…
Concepto Características ¿Las implementa?
Abstracción Variables de instanciaMétodos de instanciaVariables de claseMétodos de clase
SíSíSíSí
Encapsulamiento De variablesDe métodos
Público, Privado, ProtegidoPúblico, Privado, Protegido
Modularidad Tipos de módulo Fichero
Jerarquía HerenciaUnidades genéricasMetaclases
SimpleNoNo
Tipos Comprobación estrictaPolimorfismo
SíSí
Concurrencia Multitarea Indirectamente(mediante clases)
Persistencia Objetos persistentes Sí (Web Forms)