Programación
Orientada a Objetos
Jose Emilio Labra Gayo
Depto. Informática
Universidad de Oviedo
Contenidos
Conceptos de POO
Objetos
Clases
Métodos
Encapsulación
Polimorfismo
Lenguajes dinámicos y multiparadigma
Tipos d...
Lenguajes de Programación
Lenguaje de programación = herramienta de comunicación
Humano transmite un programa a un computa...
Lenguaje = solución compromiso
Audiencia: Computadores - Humanos
001010000100
100010010010
010000010001
Formato ideal Form...
Lenguaje = herramienta
Un problema se resuelve bien con un lenguaje
...pero otro problema puede resolverse major con otro
...
Lenguaje = comunicación
Aspectos lingüísticos
Sintaxis:
Relación de los símbolos entre sí
Ejemplo: ; al final de una sente...
Familias de lenguajes (paradigmas)
Estructurados
C, Pascal
Orientados a Objetos
C++, Java, C#, Ruby, Python, Scala
Funcion...
Imperativos
Basados en máquina de Von Neumann
Un estado que puede modificarse
Estado: Variables almacenan valores en celda...
Estructurados
Evolución de los lenguajes imperativos
Objetivo: Evitar uso de GOTO
Estructuras de control: bucles, condicio...
Orientados a Objetos
Concepto de objeto
Contiene un estado interno (encapsulación)
Envía mensajes a otros objetos
Otros co...
Funcionales
Concepto de función
Toma unos parámetros y devuelve un valor
Transparencia referencial
No efectos laterales
fu...
Funcionales
Funciones como elementos de primera clase
Pueden pasarse como argumentos, asignarse a
variables, etc.
Lenguaje...
Evolución Lenguajes POO
1955 1960 1965 1970 1975 1980 1985 1990 1995 2000 2005 2010 2015
Simula 67 C++
LISP
ALGOL CImperat...
Procesamiento de lenguajes
Interprete
Analiza el programa y lo ejecuta directamente
Compilador
Analiza el programa y lo tr...
Tiempo compilación vs ejecución
Programador
Programa
Compilador
Datos
entrada
Código
Ejecutable
Salida
tiempo de
compilaci...
Tipo
Conjunto de operaciones que soporta un valor
Chequeo de tipos
Estático: En tiempo de compilación
Dinámico: En tiempo ...
Tipos como contratos
El tipo permite saber qué operaciones soporta
Puede ayudar a detectar errores de tipos
El compilador ...
Tipos estáticos vs dinámicos
Chequeo de tipos puede ser:
Estático: detecta errores en tiempo compilación
Ventajas: posibil...
Categorías de tipos
Tipos definidos por el usuario
Ejemplo: Persona, Asignatura,...
Tipos primitivos: predefinidos por el ...
Elección de lenguajes
Múltiples factores
Paradigma: OO, functional, lógico, concurrente, ...
Implementación: Compilado, in...
Criterios de elección
Concisión notacional: debe permitir describir algoritmos con el nivel de detalle
adecuado.
Integrida...
Lenguajes en la asignatura
Python
Tipos dinámicos, Orientado a Objetos
Ruby
Tipos dinámicos, Orientado a Objetos puro
PHP
...
Desarrolladores multilingües
Ventajas de conocer más de un lenguaje
Muchos lenguajes son similares
Identificar conceptos c...
Programación Orientada a
Objetos
Definiciones generales
Objetos
Objeto: Estado interno + Métodos
Estado interno: No accesible desde exterior
Métodos: Operaciones que manipulan el...
Ejemplo de objeto
juan =
object
[ state: nombre: "Juan Manuel", edad: 34
, methods:
crece(): self.edad = self.getEdad() + ...
Encapsulación
Estado del objeto no accesible desde el exterior
Solamente a través de métodos
Tipos de métodos:
Lectura: No...
Clases
Clase: Plantilla que permite generar objetos
Atributos (campos comunes)
Definición de métodos communes
Método espec...
Ejemplo de clase
Persona = class
[ atributes: nombre, edad
, methods:
crece(): self.edad = self.getEdad() + 1
másViejo(otr...
Clase ≠ Tipo
Clase = plantilla para generar un objeto
Tipo = conjunto de operaciones de un objeto
En algunos lenguajes un ...
Herencia
Una subclase hereda de otra (superclase)
Subclase hereda los campos y métodos de superclase
Añade otros campos y ...
Ejemplo de herencia
Usuario = class extends Persona
[ atributes: email
, methods:
login(email): self.email == email
new(n,...
Polimorfismo
Una expression toma valores de un tipo
...pero admite valores de todos los subtipos
juan = Persona.new("Juan"...
Clases abstractas
No permiten generar instancias
Su único propósito es que sean derivadas
Persona = abstract class
[ ... ]...
Niveles de acceso
Permite delimitar qué campos internos son
accesibles
private: no son accesibles
protected: accesibles a ...
Herencia simple/múltiple
Herencia simple:
Una clase sólo puede heredar de una superclase
Herencia múltiple
Una clase puede...
Alternativas a Herencia múltiple
Relación "can-act-as"
Posibilidades:
Interfaces: Métodos sin comportamiento
Traits/mixins...
Interfaces
Solamente signatura de los métodos
Sin implementación
Signatura:
Nombre del método
Aridad (nº de argumentos)
Ti...
Ejemplo de Interfaz
Saludador = interface
[ methods:
saluda(msg: string)
]
juan = Persona.new("Juan", 34)
juan.saluda("¿Qu...
Traits (rasgos)
Interfaces que pueden incluir implementaciones
PHP, Scala: traits
Ruby: mediante módulos (mixins)
Facilita...
Ejemplo con traits
Saludador = trait
[ methods:
saluda(msg: string) { print "Hola: " + msg }
]
juan = Persona.new("Juan", ...
Métodos ó atributos estáticos
Métodos/atributos asociados a una clase
Forman parte de la clase, no de los objetos de esa c...
Ejemplo con atributo estático
Persona = class
[ static: contadorPersonas = 0
, atributes: nombre, edad
, methods:
crece():...
Modularización y
espacios de nombres
Programas grandes deben descomponerse
Minimizar colisiones de nombres
Módulo = conjun...
Ejemplo de módulo
Universidad = module
[ import Persona
, class Profesor
...
, class Estudiante
...
, ...
]
import Univers...
Próxima SlideShare
Cargando en…5
×

1 Introducción a los Lenguajes de Programación y a la Programación Orientada a Objetos

406 visualizaciones

Publicado el

Curso: Programación Orientada a Objetos
Máster Ingeniería Web - Universidad de Oviedo

Publicado en: Ingeniería
1 comentario
0 recomendaciones
Estadísticas
Notas
  • Sé el primero en recomendar esto

Sin descargas
Visualizaciones
Visualizaciones totales
406
En SlideShare
0
De insertados
0
Número de insertados
6
Acciones
Compartido
0
Descargas
9
Comentarios
1
Recomendaciones
0
Insertados 0
No insertados

No hay notas en la diapositiva.

1 Introducción a los Lenguajes de Programación y a la Programación Orientada a Objetos

  1. 1. Programación Orientada a Objetos Jose Emilio Labra Gayo Depto. Informática Universidad de Oviedo
  2. 2. Contenidos Conceptos de POO Objetos Clases Métodos Encapsulación Polimorfismo Lenguajes dinámicos y multiparadigma Tipos dinámicos y Duck typing Funciones lambda y de orden superior Comparación entre lenguajes Resolución de problemas Principios de diseño OO: SOLID Diseño basado en pruebas y comportamiento
  3. 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. 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. 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. 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. 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. 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. 9. Estructurados Evolución de los lenguajes imperativos Objetivo: Evitar uso de GOTO Estructuras de control: bucles, condicionales,... Procedimientos/funciones Ejemplos: Pascal, C
  10. 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. 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. 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
  13. 13. Evolución Lenguajes POO 1955 1960 1965 1970 1975 1980 1985 1990 1995 2000 2005 2010 2015 Simula 67 C++ LISP ALGOL CImperativos Orientados a Objetos Funcionales PASCAL Lógicos C#Java Python Haskell Scala Erlang Smalltalk Ruby Perl PHP Hack Javascript Schema Prolog FORTRAN COBOL Clojure F# Groovy Swift Objecttive-C Go Modula Dart
  14. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  24. 24. Programación Orientada a Objetos Definiciones generales
  25. 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
  26. 26. Ejemplo de objeto juan = object [ state: nombre: "Juan Manuel", edad: 34 , methods: crece(): self.edad = self.getEdad() + 1 másViejo(otro) = self.edad > otro.getEdad() getEdad(): self.edad ] juan.crece() print juan.getEdad() # 35
  27. 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. 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. 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. 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. 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. 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. 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. 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. 35. Niveles de acceso Permite delimitar qué campos internos son accesibles private: no son accesibles protected: accesibles a las subclases public: son accesibles
  36. 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. 37. Alternativas a Herencia múltiple Relación "can-act-as" Posibilidades: Interfaces: Métodos sin comportamiento Traits/mixins: Métodos con comportamiento
  38. 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
  39. 39. Ejemplo de Interfaz Saludador = interface [ methods: saluda(msg: string) ] juan = Persona.new("Juan", 34) juan.saluda("¿Qué tal?") # Hola: ¿Qué tal? Persona = class implements Saludador [ atributes: nombre, edad , methods: saluda(msg): print "¡Hola! " + msg ... ]
  40. 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. 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. 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. 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. 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. 45. Ejemplo de módulo Universidad = module [ import Persona , class Profesor ... , class Estudiante ... , ... ] import Universidad pepe = Universidad::Profesor.new("Jose", 34)

×