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

45
Programación Orientada a Objetos Jose Emilio Labra Gayo Depto. Informática Universidad de Oviedo

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

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

Programación Orientada a Objetos

Jose Emilio Labra GayoDepto. Informática

Universidad de Oviedo

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

ContenidosConceptos de POO

ObjetosClasesMétodosEncapsulaciónPolimorfismo

Lenguajes dinámicos y multiparadigmaTipos dinámicos y Duck typingFunciones lambda y de orden superior

Comparación entre lenguajesResolución de problemasPrincipios de diseño OO: SOLID

Diseño basado en pruebas y comportamiento

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

Lenguajes de ProgramaciónLenguaje de programación = herramienta de comunicación

Humano transmite un programa a un computadorAudiencia del programa: Computadores y otros humanos

Programa Computador

Programador

Computador

Usuario/cliente

jefe proyecto

ProgramadorProgramador

Equipo externo

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

Lenguaje = solución compromiso

Audiencia: Computadores - Humanos

001010000100100010010010010000010001

Formato ideal Formato idealEl 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;}

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

Lenguaje = herramienta

Un problema se resuelve bien con un lenguaje...pero otro problema puede resolverse major con otro

¿Búsqueda de lenguaje universal?

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

Lenguaje = comunicación

Aspectos lingüísticosSintaxis:

Relación de los símbolos entre síEjemplo: ; al final de una sentencia

Semántica ó SignificadoRelación de símbolos con los objetos a los que se aplicanComportamiento 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,...

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

Familias de lenguajes (paradigmas)

EstructuradosC, Pascal

Orientados a ObjetosC++, Java, C#, Ruby, Python, Scala

FuncionalesHaskell, F#, Scala

Basados en programación lógicaProlog

...

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

Imperativos

Basados en máquina de Von NeumannUn estado que puede modificarse Estado: Variables almacenan valores en celdasAsignaciones destructivas

x = x + 1

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

Estructurados

Evolución de los lenguajes imperativosObjetivo: Evitar uso de GOTOEstructuras de control: bucles, condicionales,...Procedimientos/funcionesEjemplos: Pascal, C

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

Orientados a Objetos

Concepto de objetoContiene 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

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

Funcionales

Concepto de funciónToma unos parámetros y devuelve un valor

Transparencia referencialNo efectos laterales

function suma(a,b) = a + bfunction fact(n) = if n == 0 then 1 else n * fact(n - 1)x = suma(2,fact(5)) # 122

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

Funcionales

Funciones como elementos de primera clasePueden pasarse como argumentos, asignarse a variables, etc.

Lenguajes funcionales puros: HaskellHíbridos OO y funcionales: Scala

function aplica2(f,x) = f (f x)function suma3(x) = x + 3

x = aplica2(suma3,5) # 11

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

Evolución Lenguajes POO

1955 1960 1965 1970 1975 1980 1985 1990 1995 2000 2005 2010 2015

Simula 67 C++

LISP

ALGOL CImperativos

Orientadosa Objetos

Funcionales

PASCAL

Lógicos

C#Java

Python

Haskell ScalaErlang

Smalltalk

Ruby

Perl PHP Hack

Javascript

Schema

Prolog

FORTRANCOBOL

ClojureF#

Groovy

SwiftObjecttive-C

Go

Modula

Dart

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

Procesamiento de lenguajes

InterpreteAnaliza el programa y lo ejecuta directamente

CompiladorAnaliza el programa y lo transforma Normalmente, genera programa ejecutable

Comprensible por una máquina (virtual o concreta)

Ventajas: puede optimizarse el códigopueden detectarse errores en el programa

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

Tiempo compilación vs ejecución

Programador

Programa

Compilador

Datos entrada

CódigoEjecutable

Salida

tiempo de compilación

tiempo de ejecución

Máquina

Usuario

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

Tipo

Conjunto de operaciones que soporta un valorChequeo de tipos

Estático: En tiempo de compilaciónDinámico: En tiempo de ejecución

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

Tipos como contratos

El tipo permite saber qué operaciones soportaPuede ayudar a detectar errores de tiposEl compilador puede optimizar el código

Seguridad de tiposNo pedir una operación a un valor que no la soportaEjemplo:

x = 4 + "Hola"print x # TypeError

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

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ónVentajas: mayor flexibilidad

http://stackoverflow.com/questions/125367/dynamic-type-languages-versus-static-type-languageshttp://www.smashingmagazine.com/2013/04/18/introduction-to-programming-type-systems/

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

Categorías de tipos

Tipos definidos por el usuarioEjemplo: Persona, Asignatura,...

Tipos primitivos: predefinidos por el sistemaEjemplos: int, float, boolean...En algunos lenguajes tienen tratamiento diferente

Corresponden con tipos básicos de un computadorMayor eficiencia

En otros lenguajes son igual que el restoPara el programador son igual que el resto de tiposEl compilador intenta detectarlos y optimizar el código

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

Elección de lenguajes

Múltiples factoresParadigma: OO, functional, lógico, concurrente, ...Implementación: Compilado, interpretado, VMTipos: Dinámico, estático, híbridoPlataformas: crossplatform vs específicoConcurrencia/paralelismoEntornos de desarrollo...

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

Criterios de elecciónConcisió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ásicosAbstracción: Evitar que algo deba ser enunciado más de una vezExtensibilidad: Admitir la creación de nuevas características no previstasSeguridad: Existen medios para comprobar que los programas no contienen erroresAutomatización: Pueden automatizarse tareas mecánicas, tediosas o susceptibles de erroresPortabilidad: Los programas funcionan en diferentes máquinas y clases de máquinasEficiencia: Buen rendimiento tanto del programa ejecutándose como del procesador del lenguajeEntorno: Factores externos como entorno de desarrollo, documentación, ejemplos, programadores, etc.

Referencia: tesis doctoral. Labra, 2001

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

Lenguajes en la asignatura

PythonTipos dinámicos, Orientado a Objetos

RubyTipos dinámicos, Orientado a Objetos puro

PHPTipos dinámicos, Orientado a Objetos

ScalaTipos estáticos, Funcional y Orientado a Objetos

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

Desarrolladores multilingües

Ventajas de conocer más de un lenguajeMuchos lenguajes son similares

Identificar conceptos comunesIdentificar diferencias

Adaptarse a cambios¿Cuál será el lenguaje más popular dentro de 20 años?

Desarrollos políglotasVarios lenguajes coexisten en 1 proyecto

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

Programación Orientada a Objetos

Definiciones generales

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

Objetos

Objeto: Estado interno + MétodosEstado interno: No accesible desde exteriorMétodos: Operaciones que manipulan el estado

Un objeto puede: Enviar mensajes a otros objetos

Invocar método de otro objeto: obj.métodoReferirse a sí mismo

Variable self ó this

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

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

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

Encapsulación

Estado del objeto no accesible desde el exteriorSolamente a través de métodosTipos de métodos:

Lectura: No modifican el estado del objetoEjemplo: getEdad

Escritura: Pueden modificar el estado del objetoEjemplo: crece

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

Clases

Clase: Plantilla que permite generar objetosAtributos (campos comunes)Definición de métodos communes

Método especial: newGenera objetos (= instancias de la clase)Atributos variables de instancia

NOTAEl 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

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

Ejemplo de clasePersona = 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

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

Clase ≠ Tipo

Clase = plantilla para generar un objetoTipo = conjunto de operaciones de un objeto

En algunos lenguajes un objeto puede soportar más operaciones que las definidas en una clase

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

Herencia

Una subclase hereda de otra (superclase)Subclase hereda los campos y métodos de superclaseAñade otros campos y métodosPosibilidad: Redefinir métodos de la superclase

Superclase

Subclase

Relación is-a

Representación en UML

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

Ejemplo de herenciaUsuario = 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, "[email protected]")luis.crece()print getEdad(luis) # 16

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

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, "[email protected]")print puedeVotar(juan) # falseprint puedeVotar(luis) # true

puedeVotar(persona) = persona.getEdad() > 18

El Sistema admite valores de tipo Persona, pero también de cualquier subtipo (Usuarios)

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

Clases abstractas

No permiten generar instanciasSu único propósito es que sean derivadas

Persona = abstract class [ ... ]Usuario = class extends Persona [ ... ]

luis = Usuario.new("Luis", 34, "[email protected]") # OKjuan = Persona.new("Juan", 15) # Error

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

Niveles de acceso

Permite delimitar qué campos internos son accesiblesprivate: no son accesibles protected: accesibles a las subclasespublic: son accesibles

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

Herencia simple/múltiple

Herencia simple: Una clase sólo puede heredar de una superclase

Herencia múltipleUna clase puede heredar de varias superclassProblema del diamante

Estudiante

Becario

Empleado

Persona

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

Alternativas a Herencia múltiple

Relación "can-act-as"Posibilidades:

Interfaces: Métodos sin comportamientoTraits/mixins: Métodos con comportamiento

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

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

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

Ejemplo de InterfazSaludador = 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 ... ]

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

Traits (rasgos)

Interfaces que pueden incluir implementacionesPHP, Scala: traits Ruby: mediante módulos (mixins)

Facilitan reutilización de comportamientoUna clase incluye un trait

Relación "includes"

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

Ejemplo con traitsSaludador = 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: ... ]

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

Métodos ó atributos estáticos

Métodos/atributos asociados a una claseForman parte de la clase, no de los objetos de esa clase

Son globalesLa clase actúa como una etiquetaPeligros asociados a variables/procedimientos globales

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

Ejemplo con atributo estáticoPersona = 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

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

Modularización y espacios de nombres

Programas grandes deben descomponerseMinimizar colisiones de nombresMódulo = conjunto de definiciones

Identificado con un nombreFacilita el desarrollo independienteRelaciones entre módulos

Qué definiciones se importan/exportanVisibilidad de las definicionesFacilidades para modificar definiciones importadas

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

Ejemplo de móduloUniversidad = module [ import Persona , class Profesor ... , class Estudiante ... , ... ]

import Universidadpepe = Universidad::Profesor.new("Jose", 34)