1 introducción a los lenguajes de programación y a la programación orientada a objetos
Post on 16-Jan-2017
511 Views
Preview:
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