Este documento presenta conceptos clave de la programación orientada a objetos como objetos, clases, métodos, encapsulación, polimorfismo, herencia y módulos. Explica que un objeto encapsula estado interno y métodos, y que las clases son plantillas que generan objetos. También describe conceptos como herencia, interfaces, traits y tipos de métodos y acceso.
3. Lenguajes de Programación
Lenguaje de programación = herramienta de comunicación
Humano transmite un programa a un computador
Audiencia del programa: Computadores y otros humanos
Programa Computador
Programador
Computador
Usuario/cliente
jefe proyecto
Programador
Programador
Equipo externo
4. Lenguaje = solución compromiso
Audiencia: Computadores - Humanos
001010000100
100010010010
010000010001
Formato ideal Formato ideal
El texto en lenguaje
natural es el formato
ideal para tí...
public class Country
implements Comparable<Country> {
private String name;
public Country(String name) {
this.name = name;
}
5. Lenguaje = herramienta
Un problema se resuelve bien con un lenguaje
...pero otro problema puede resolverse major con otro
¿Búsqueda de lenguaje universal?
6. Lenguaje = comunicación
Aspectos lingüísticos
Sintaxis:
Relación de los símbolos entre sí
Ejemplo: ; al final de una sentencia
Semántica ó Significado
Relación de símbolos con los objetos a los que se aplican
Comportamiento del lenguaje: ¿qué hace el programa?
Pragmático:
Relación de los signos con sus intérpretes (usuarios)
Herramientas de desarrollo (IDEs, depuradores, ...)
Estilos de codificación, idiomas, patrones,...
7. Familias de lenguajes (paradigmas)
Estructurados
C, Pascal
Orientados a Objetos
C++, Java, C#, Ruby, Python, Scala
Funcionales
Haskell, F#, Scala
Basados en programación lógica
Prolog
...
8. Imperativos
Basados en máquina de Von Neumann
Un estado que puede modificarse
Estado: Variables almacenan valores en celdas
Asignaciones destructivas
x = x + 1
9. Estructurados
Evolución de los lenguajes imperativos
Objetivo: Evitar uso de GOTO
Estructuras de control: bucles, condicionales,...
Procedimientos/funciones
Ejemplos: Pascal, C
10. Orientados a Objetos
Concepto de objeto
Contiene un estado interno (encapsulación)
Envía mensajes a otros objetos
Otros conceptos:
Clases (generadores de objetos)
Herencia (reutilización de código)
Ejemplos: Java, Python, Ruby
11. Funcionales
Concepto de función
Toma unos parámetros y devuelve un valor
Transparencia referencial
No efectos laterales
function suma(a,b) = a + b
function fact(n) = if n == 0 then 1
else n * fact(n - 1)
x = suma(2,fact(5)) # 122
12. Funcionales
Funciones como elementos de primera clase
Pueden pasarse como argumentos, asignarse a
variables, etc.
Lenguajes funcionales puros: Haskell
Híbridos OO y funcionales: Scala
function aplica2(f,x) = f (f x)
function suma3(x) = x + 3
x = aplica2(suma3,5) # 11
14. Procesamiento de lenguajes
Interprete
Analiza el programa y lo ejecuta directamente
Compilador
Analiza el programa y lo transforma
Normalmente, genera programa ejecutable
Comprensible por una máquina (virtual o concreta)
Ventajas:
puede optimizarse el código
pueden detectarse errores en el programa
15. Tiempo compilación vs ejecución
Programador
Programa
Compilador
Datos
entrada
Código
Ejecutable
Salida
tiempo de
compilación
tiempo de
ejecución
Máquina
Usuario
16. Tipo
Conjunto de operaciones que soporta un valor
Chequeo de tipos
Estático: En tiempo de compilación
Dinámico: En tiempo de ejecución
17. Tipos como contratos
El tipo permite saber qué operaciones soporta
Puede ayudar a detectar errores de tipos
El compilador puede optimizar el código
Seguridad de tipos
No pedir una operación a un valor que no la soporta
Ejemplo:
x = 4 + "Hola"
print x # TypeError
18. Tipos estáticos vs dinámicos
Chequeo de tipos puede ser:
Estático: detecta errores en tiempo compilación
Ventajas: posibilidad de optimización, seguridad
Dinámico: detecta errores en tiempo de ejecución
Ventajas: mayor flexibilidad
http://stackoverflow.com/questions/125367/dynamic-type-languages-versus-static-type-languages
http://www.smashingmagazine.com/2013/04/18/introduction-to-programming-type-systems/
19. Categorías de tipos
Tipos definidos por el usuario
Ejemplo: Persona, Asignatura,...
Tipos primitivos: predefinidos por el sistema
Ejemplos: int, float, boolean...
En algunos lenguajes tienen tratamiento diferente
Corresponden con tipos básicos de un computador
Mayor eficiencia
En otros lenguajes son igual que el resto
Para el programador son igual que el resto de tipos
El compilador intenta detectarlos y optimizar el código
20. Elección de lenguajes
Múltiples factores
Paradigma: OO, functional, lógico, concurrente, ...
Implementación: Compilado, interpretado, VM
Tipos: Dinámico, estático, híbrido
Plataformas: crossplatform vs específico
Concurrencia/paralelismo
Entornos de desarrollo
...
21. Criterios de elección
Concisión notacional: debe permitir describir algoritmos con el nivel de detalle
adecuado.
Integridad conceptual: contiene conjunto de conceptos simple, claro y unificado.
Ortogonalidad: Características independientes pueden ser comprendidas y
combinadas de forma independiente.
Generalidad: Todas las características son generadas a partir de conceptos básicos
Abstracción: Evitar que algo deba ser enunciado más de una vez
Extensibilidad: Admitir la creación de nuevas características no previstas
Seguridad: Existen medios para comprobar que los programas no contienen errores
Automatización: Pueden automatizarse tareas mecánicas, tediosas o susceptibles de
errores
Portabilidad: Los programas funcionan en diferentes máquinas y clases de máquinas
Eficiencia: Buen rendimiento tanto del programa ejecutándose como del
procesador del lenguaje
Entorno: Factores externos como entorno de desarrollo,
documentación, ejemplos, programadores, etc.
Referencia: tesis doctoral. Labra, 2001
22. Lenguajes en la asignatura
Python
Tipos dinámicos, Orientado a Objetos
Ruby
Tipos dinámicos, Orientado a Objetos puro
PHP
Tipos dinámicos, Orientado a Objetos
Scala
Tipos estáticos, Funcional y Orientado a Objetos
23. Desarrolladores multilingües
Ventajas de conocer más de un lenguaje
Muchos lenguajes son similares
Identificar conceptos comunes
Identificar diferencias
Adaptarse a cambios
¿Cuál será el lenguaje más popular dentro de 20 años?
Desarrollos políglotas
Varios lenguajes coexisten en 1 proyecto
25. Objetos
Objeto: Estado interno + Métodos
Estado interno: No accesible desde exterior
Métodos: Operaciones que manipulan el estado
Un objeto puede:
Enviar mensajes a otros objetos
Invocar método de otro objeto: obj.método
Referirse a sí mismo
Variable self ó this
27. Encapsulación
Estado del objeto no accesible desde el exterior
Solamente a través de métodos
Tipos de métodos:
Lectura: No modifican el estado del objeto
Ejemplo: getEdad
Escritura: Pueden modificar el estado del objeto
Ejemplo: crece
28. Clases
Clase: Plantilla que permite generar objetos
Atributos (campos comunes)
Definición de métodos communes
Método especial: new
Genera objetos (= instancias de la clase)
Atributos variables de instancia
NOTA
El concepto de clase no es estrictamente necesario en programación orientada a objetos.
Algunos lenguajes como Self ó Javascript utilizan prototipos.
En otros lenguajes como Ruby, Python las clases son también objetos
29. Ejemplo de clase
Persona = class
[ atributes: nombre, edad
, methods:
crece(): self.edad = self.getEdad() + 1
másViejo(otro) = self.edad > otro.getEdad()
getEdad(): self.edad
new(n,e): self.nombre = n, self.edad = e
]
juan = Persona.new("Juan Manuel", 34)
juan.crece()
print juan.getEdad() # 35
pepe = Persona.new("Jose Luis", 22)
print juan.másViejo(pepe) # true
30. Clase ≠ Tipo
Clase = plantilla para generar un objeto
Tipo = conjunto de operaciones de un objeto
En algunos lenguajes un objeto puede soportar más
operaciones que las definidas en una clase
31. Herencia
Una subclase hereda de otra (superclase)
Subclase hereda los campos y métodos de superclase
Añade otros campos y métodos
Posibilidad: Redefinir métodos de la superclase
Superclase
Subclase
Relación is-a
Representación en UML
32. Ejemplo de herencia
Usuario = class extends Persona
[ atributes: email
, methods:
login(email): self.email == email
new(n,e,em): super.new(n,e), email = em
]
luis = Usuario.new("Luis", 15, "luis@example.com")
luis.crece()
print getEdad(luis) # 16
33. Polimorfismo
Una expression toma valores de un tipo
...pero admite valores de todos los subtipos
juan = Persona.new("Juan", 15)
luis = Usuario.new("Luis", 34, "luis@example.com")
print puedeVotar(juan) # false
print puedeVotar(luis) # true
puedeVotar(persona) = persona.getEdad() > 18
El Sistema admite valores de tipo Persona, pero también de cualquier subtipo (Usuarios)
34. Clases abstractas
No permiten generar instancias
Su único propósito es que sean derivadas
Persona = abstract class
[ ... ]
Usuario = class extends Persona
[ ... ]
luis = Usuario.new("Luis", 34, "luis@example.com") # OK
juan = Persona.new("Juan", 15) # Error
35. Niveles de acceso
Permite delimitar qué campos internos son
accesibles
private: no son accesibles
protected: accesibles a las subclases
public: son accesibles
36. Herencia simple/múltiple
Herencia simple:
Una clase sólo puede heredar de una superclase
Herencia múltiple
Una clase puede heredar de varias superclass
Problema del diamante
Estudiante
Becario
Empleado
Persona
37. Alternativas a Herencia múltiple
Relación "can-act-as"
Posibilidades:
Interfaces: Métodos sin comportamiento
Traits/mixins: Métodos con comportamiento
38. Interfaces
Solamente signatura de los métodos
Sin implementación
Signatura:
Nombre del método
Aridad (nº de argumentos)
Tipos de los argumentos
Una clase implementa un interfaz
Interfaz
Clase
40. Traits (rasgos)
Interfaces que pueden incluir implementaciones
PHP, Scala: traits
Ruby: mediante módulos (mixins)
Facilitan reutilización de comportamiento
Una clase incluye un trait
Relación "includes"
41. Ejemplo con traits
Saludador = trait
[ methods:
saluda(msg: string) { print "Hola: " + msg }
]
juan = Persona.new("Juan", 34)
juan.saluda("¿Qué tal?") # Hola: ¿Qué tal?
Persona = class includes Saludador
[ atributes: nombre, edad
, methods:
...
]
42. Métodos ó atributos estáticos
Métodos/atributos asociados a una clase
Forman parte de la clase, no de los objetos de esa clase
Son globales
La clase actúa como una etiqueta
Peligros asociados a variables/procedimientos globales
43. Ejemplo con atributo estático
Persona = class
[ static: contadorPersonas = 0
, atributes: nombre, edad
, methods:
crece(): self.edad = self.getEdad() + 1
másViejo(otro) = self.edad > otro.getEdad()
getEdad(): self.edad
new(n,e):
contadorPersonas = contadorPersonas + 1
self.nombre = n, self.edad = e
]
juan = Persona.new("Juan", 34)
print Persona.contadorPersonas # 1
44. Modularización y
espacios de nombres
Programas grandes deben descomponerse
Minimizar colisiones de nombres
Módulo = conjunto de definiciones
Identificado con un nombre
Facilita el desarrollo independiente
Relaciones entre módulos
Qué definiciones se importan/exportan
Visibilidad de las definiciones
Facilidades para modificar definiciones importadas
45. Ejemplo de módulo
Universidad = module
[ import Persona
, class Profesor
...
, class Estudiante
...
, ...
]
import Universidad
pepe = Universidad::Profesor.new("Jose", 34)