1 introducción a los lenguajes de programación y a la programación orientada a objetos

Post on 16-Jan-2017

510 Views

Category:

Engineering

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Programación Orientada a Objetos

Jose Emilio Labra GayoDepto. Informática

Universidad de Oviedo

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

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

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;}

Lenguaje = herramienta

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

¿Búsqueda de lenguaje universal?

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,...

Familias de lenguajes (paradigmas)

EstructuradosC, Pascal

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

FuncionalesHaskell, F#, Scala

Basados en programación lógicaProlog

...

Imperativos

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

x = x + 1

Estructurados

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

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

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

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

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

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

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

Tipo

Conjunto de operaciones que soporta un valorChequeo de tipos

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

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

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/

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

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...

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

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

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

Programación Orientada a Objetos

Definiciones generales

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

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

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

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

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

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

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

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, "luis@example.com")luis.crece()print getEdad(luis) # 16

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) # falseprint puedeVotar(luis) # true

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

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

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, "luis@example.com") # OKjuan = Persona.new("Juan", 15) # Error

Niveles de acceso

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

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

Alternativas a Herencia múltiple

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

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

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

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 ... ]

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"

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: ... ]

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

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

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

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

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

top related