Introducción a la Programación Orientada a Objetos (POO)

Introducción a la Programación

Lenguajes de Programación

Lenguaje de máquina: Compuesto por cadenas binarias que especifican las operaciones y la posición de memoria. También conocido como código binario.

Inconvenientes:

  • Dificultad y lentitud en la codificación.
  • Poca fiabilidad.
  • Dificultad para verificar y poner a punto los programas.
  • Los programas solo se ejecutan en el mismo procesador.

Ventaja: Posibilidad de cargar un programa en memoria sin necesidad de traducción posterior.

Ensamblador

Indican al ordenador las operaciones mediante códigos nemotécnicos. No puede ser ejecutado directamente por el computador, necesita ser traducido a lenguaje de máquina. Se utiliza un ensamblador para obtener el programa objeto en código máquina a partir del programa fuente en ensamblador.

Inconvenientes:

  • Dependencia total de la máquina.
  • Impide la portabilidad entre máquinas con procesadores diferentes.

Ventajas:

  • Fiabilidad de codificación y modificación.
  • Ahorran tiempo y requieren menos atención a detalles.
  • Mayor velocidad en ejecución respecto al lenguaje de alto nivel.

Lenguaje de Alto Nivel

Permite una mejor comprensión de los programas debido al empleo de una terminología que se aproxima al lenguaje humano. Son independientes de las máquinas, pero necesitan su traducción.

Ventajas:

  • Tiempo de formación corto.
  • Modificaciones y puestas a punto fáciles.
  • Reducción del coste de los programas.
  • Transportabilidad.
  • Mejor documentación.
  • Fácil de mantener.

Desventaja:

  • No se aprovecha los recursos internos de la máquina.
  • Aumento de la ocupación de memoria.
  • Tiempo de ejecución mayor.

Paradigmas de Programación

Conjunto de métodos sistemáticos que se aplica en todos los niveles de diseño de software. Atiende a enfoques específicos para la construcción del programa.

  • Imperativo: Utiliza una serie de instrucciones o sentencias que definen cambios en el estado del programa. Se especifican las operaciones a realizar durante el transcurso de la ejecución. Ejemplos: Fortran, Pascal, C, C++.
  • Funcional: Utiliza la definición de funciones matemáticas y su aplicación. El programador codifica funciones y reglas. La repetición se lleva a cabo mediante la recursión.
  • Lógico: Utiliza las aplicaciones de la lógica matemática en la representación de los datos y la inferencia de resultados aplicando a esos datos una serie de reglas que los relacionan. El programador codifica predicados y reglas. Enfoque orientado a la descripción del problema, no a cómo resolverlo.
  • Orientado a Objetos (POO): Se basa en la utilización de entidades denominadas objetos y de las interacciones entre objetos para el diseño de una aplicación. Se busca otorgar gran independencia a las distintas partes. Cada objeto posee una identidad y contiene datos y algoritmos propios que determinan las operaciones que se pueden realizar.

Traductores

  • Intérpretes: Es un traductor que toma un programa fuente, lo traduce y a continuación lo ejecuta.
  • Compiladores: Es un programa que traduce los programas fuente escritos en lenguaje de alto nivel a lenguaje máquina. La velocidad de ejecución de programas compilados es superior a la de los programas interpretados.

Fases de Traducción

Los traductores transforman un texto escrito en un lenguaje (fuente) a otro lenguaje distinto (objeto) manteniendo el significado del texto original.

  • Fase de Análisis: Análisis léxico, sintáctico y semántico. Verifica si el programa en lenguaje fuente es correcto.
  • Fase de Síntesis: Depende del lenguaje objeto, es independiente del lenguaje fuente. Esta fase se lleva a cabo después de que el módulo de análisis ha verificado que el código fuente es correcto. Generación de código objeto.

Máquinas Virtuales

Implementación software que permite la ejecución de un programa sobre plataformas (hardware, sistema operativo) que pueden ser distintas a la utilizada por el usuario (fuente). Ejemplo: Java (fichero .java) – Compilador Java – Bytecode (fichero .class). Las aplicaciones escritas en Java son compiladas y convertidas a bytecode.

Calidad del Software

Crisis del Software:

  • El software era caro, poco fiable y escaso.
  • Las metodologías y técnicas estructuradas no resolvían el problema.
  • Crecimiento de la complejidad de los problemas a representar.
  • Problema principal: Mantenimiento del software.

Mantenimiento: Es lo que sucede después de que se ha distribuido un producto. Significa:

  • Parte noble: Modificaciones (adaptación a los cambios).
  • No noble: Depuración (quitar errores).

Factores Externos: Pueden ser detectados por los usuarios.

Factores Internos: Solo percibidos por los diseñadores e implementadores. La POO es un conjunto de técnicas para obtener calidad interna como medio para obtener calidad externa (reutilización y estabilidad).

Factores Externos de Calidad

  • Corrección
  • Economía
  • Portabilidad
  • Extensibilidad
  • Reutilización
  • Facilidad de verificación
  • Compatibilidad
  • Eficiencia
  • Robustez
  • Integridad
  • Facilidad de uso
  • Funcionalidad
  • Facilidad de reparación
  • Oportunidad

Factores Internos de Calidad

  • Modularidad
  • Legibilidad
  • Corrección: Capacidad de los productos software de realizar con exactitud su tarea, tal y como es definida en la especificación.
  • Robustez: Capacidad de los productos software de reaccionar adecuadamente ante situaciones excepcionales.
  • Extensibilidad: Facilidad de adaptación de los productos software a los cambios en la especificación.

Principios Esenciales de Calidad

  • Simplicidad de la arquitectura del software.
  • Descentralización: Módulos autónomos.
  • Reutilización: Capacidad de un producto software de ser utilizado en la construcción de diferentes aplicaciones.
  • Compatibilidad: Facilidad de combinar unos elementos software con otros.
  • Eficiencia: Capacidad de un sistema software de requerir la menor cantidad posible de recursos hardware.
  • Portabilidad: Facilidad de transferir productos software a diferentes plataformas (entornos hardware y software).
  • Facilidad de Uso: Facilidad de aprender a usar.
  • Funcionalidad: Conjunto de posibilidades ofrecido por un sistema.
  • Oportunidad: Capacidad de un sistema software de ser lanzado cuando los usuarios lo deseen o antes.
  • Economía: Completarse con el presupuesto asignado.
  • Integridad: Protección contra modificación y acceso.
  • Facilidad de reparación y verificación.

Abstracción y Encapsulación

Abstracción: Capacidad de centrarse en las características esenciales de las distintas partes de un sistema ignorando sus propiedades accidentales.

Encapsulación: Proceso de almacenar en un mismo compartimento los elementos de una abstracción que constituyen su estructura y su comportamiento.

Tipos de Datos Abstractos (TAD)

Permiten ampliar los tipos de datos definidos por el lenguaje de programación. Un tipo de dato definido por el programador se denomina TAD. Los TAD constan de tipo, funciones, axiomas e invariantes.

Programación Modular

Un programa modular está formado por un conjunto de módulos. Un módulo es la unidad básica de descomposición de un sistema software.

Modularidad: Propiedad que tiene un sistema que ha sido descompuesto en un conjunto de módulos cohesivos y débilmente acoplados.

  • Alta Cohesión: Un módulo con responsabilidades altamente relacionadas y que no hacen una gran cantidad de trabajo.
  • Bajo Acoplamiento: Se comunican mediante interfaces bien definidas. Un módulo debe comunicarse con el menor número de módulos posibles. Si se comunican, deben intercambiar la menor cantidad de información posible.

Criterios de Diseño Modular

  • Descomposición: Descomponer el problema del software en un pequeño número de subprogramas menos complejos, interconectados mediante una estructura sencilla y suficientemente independiente para permitir que el trabajo futuro pueda proseguir por separado cada uno de ellos.
  • Composición: Favorece la producción de elementos software que se pueden combinar libremente unos con otros para producir nuevos sistemas en entornos diferentes en el que fueron desarrollados inicialmente.
  • Comprensibilidad: Favorece la producción de software en el cual un lector humano puede entender cada módulo sin tener que conocer los otros.
  • Continuidad: Favorece la arquitectura software en la que un pequeño cambio en la especificación de un problema provoca solo cambios en un solo módulo o en un pequeño número de módulos.
  • Protección: Favorece arquitecturas software en las cuales el efecto de una situación anormal que se produzca dentro de un módulo durante la ejecución queda confinado a dicho módulo o se propaga a unos pocos módulos.

Principios de Diseño Modular

  • Ocultación de Información: El diseño de cada módulo debe seleccionar un subconjunto de propiedades de un módulo como información oficial para ponerla a disposición de los autores de módulos cliente. Consiste en ocultar los detalles de la implementación al código cliente (interfaz – implementación parte privada visible solo dentro del módulo).
  • Auto Documentación: Relacionado con los criterios de comprensibilidad y continuidad modular.
  • Acceso Uniforme: Todos los servicios ofrecidos por un módulo deben estar disponibles mediante una notación uniforme, que no considere si se han implementado mediante almacenamiento o cálculo.
  • Abierto-Cerrado: Un módulo está abierto si está disponible para ampliarlo, extender o modificar su funcionalidad. Cerrado si está disponible para su uso.
  • Elección Única: Siempre que un sistema software debe manejar una lista de variantes, uno y solo uno de los módulos del sistema debe conocer la lista exhaustiva.

Reutilización de Software

Beneficios esperados:

  • Consumir elementos reutilizables: Mejora la productividad, disminuye el esfuerzo del mantenimiento, aumenta la fiabilidad y eficiencia.
  • Producir: Si un elemento software se utilizará en muchos proyectos, es rentable invertir en mejorar su calidad.

Programación Orientada a Objetos (POO)

Un método de implementación en el que los programas se organizan como colecciones cooperativas de objetos, cada una de las cuales representan una instancia de alguna clase, y cuyas clases son todas miembros de una jerarquía de clases unidas mediante relaciones de herencia.

  • Programa OO: Colección estructurada de clases.
  • Clase: Implementación de un TAD.
  • Objeto: Una instancia de una clase.

Los objetos se comunican mediante mensajes.

Conceptos Clave

  • Objeto: Un paquete de software independiente formado por un conjunto de datos junto con los procedimientos que operan sobre estos datos. Pueden ser reales o abstractos.
  • Clase: Implementación total o parcial de un TAD. Es un tipo definido que determina la estructura de datos y las operaciones asociadas a ese tipo. Se le puede ver como una plantilla que describe objetos que van a tener la misma estructura y el mismo comportamiento. Módulo (concepto sintáctico) – Tipo (concepto semántico).
  • Instancia: Es una estructura constituida por los atributos descritos para la clase.
  • Instanciación: Creación de un objeto a partir de una clase.

Estructura de una Clase

  • Atributos: Determinan una estructura de almacenamiento para cada objeto de la clase.
  • Operaciones: Operaciones aplicables a los objetos. Único modo de acceder a los atributos.

Herencia

Se establece una estructura jerárquica en la que cada clase hereda atributos y métodos de las clases que están por encima de ella. La clase derivada (subclase) puede usar los procedimientos y los atributos de la superclase (clase padre).

Objetivo: Permitir el análisis por clases.

Ventajas:

  • Granularidad.
  • Reutilización de componentes (rápido prototipado).
  • Reutilización de software (mayor seguridad).

Comunicación entre Objetos

Los objetos se comunican entre sí mediante el envío de mensajes. El propósito de un mensaje es pedir al objeto que lo recibe que active el método que se le indica y que devuelva al objeto original el resultado de esa acción.

  • Los mensajes que recibe un objeto son los únicos conductos que conectan el objeto con el mundo exterior.
  • Los datos de un objeto están disponibles para ser manipulados solo por métodos del propio objeto.

Polimorfismo

Tener o asumir distinta forma. En el contexto de POO se refiere a la capacidad de los diferentes objetos para responder de distinta forma a la misma operación.

  • Permite enviar el mismo mensaje a objetos diferentes y que cada uno responda en la forma apropiada según el tipo de objeto que sea, ejecutando su método.
  • La asociación de un método con su nombre no se determina hasta el momento de su ejecución.
  • Requiere el empleo de clases abstractas: aislar en clases conceptos incompletos aunque coherentes y cohesivos. Los atributos y métodos de estas clases están disponibles para ser especializados vía herencia. Una clase abstracta no puede tener instancias.

Ventajas del Polimorfismo:

  • Da uniformidad a la sintaxis.
  • Disminuye el código a escribir.
  • Facilita el tratamiento de colecciones heterogéneas.

Desarrollo de Software Orientado a Objetos

  • Encontrar objetos relevantes.
  • Describir tipos de objetos.
  • Encontrar operaciones para los tipos de objetos.
  • Encontrar relaciones entre objetos.
  • Utilizar los tipos de objetos y las relaciones para estructurar el software.

Tipificación y Ligadura

  • Tipificación: Proceso de declarar cuál es el tipo de información que contiene una variable.
    • Tipificación fuerte o estática: En tiempo de compilación.
    • Tipificación débil: En tiempo de ejecución.
  • Ligadura: Proceso de asociar un atributo a un nombre o la llamada a una función con su código real.
    • Ligadura estática, temprana o real: En tiempo de compilación.
    • Ligadura dinámica, retardada o postergada: En tiempo de ejecución.

La POO permite el polimorfismo.

Modificadores de Acceso

  • Abstract: Una clase abstracta tiene al menos un método abstracto. Una clase abstracta no se instancia, sino que se utiliza como una clase base para la herencia.
  • Final: Se declara como la clase que termina una cadena de herencia. No se puede heredar de una clase final.
  • Public: Son accesibles desde otras clases, bien sean directamente o por herencia. Son accesibles dentro del mismo paquete en el que se han declarado. Para acceder desde otros paquetes primero tienen que ser importados.
  • []: Si no se especifica ningún tipo de modificadores, se entiende que cualquier objeto que se encuentre en el mismo paquete que esta clase podrá hacer uso de ella.

Modificadores de Atributos

  • Final: Constante.
  • Static: Atributo de clase.
  • Public: Accesible desde cualquier lugar en que sea accesible la clase.
  • Protected: Accesible por las subclases y clases del mismo paquete.
  • Private: Solo accesible por la propia clase.
  • Friendly: Accesible por las clases del mismo paquete.

Modificadores de Métodos

  • Final: Significa que el método no puede ser sobrecargado por las clases que heredan de esta.
  • Static: Significa que es un método de la clase.
  • Abstract: Solo en clases abstractas. No coincidir con final, static o private.

Diseño de Clases

  • Especificaciones de interfaces e implementación de clases y objetos.
  • Identificación de clases y objetos.
  • Identificación de las semánticas de clases y objetos.
  • Identificación de las relaciones de clases y objetos.

Ejemplo de código Java:

public class Persona {
  private String dni;
  private String nombre;
  private int edad;
  private String estado;

  public Persona(String dni, String nombre, int edad, String estado) {
    this.dni = dni;
    this.nombre = nombre;
    this.edad = edad;
    this.estado = estado;
  }

  // Getters y setters...

  public void cumpleaños() {
    edad++;
  }

  @Override
  public String toString(){
    return"Persona""dni"+dni", nombre"+nombre", edad"+edad", estado"+estado+'}';
  }
}

public class Departamento {
  // Atributos...

  // Constructor...

  // Métodos...

  @Override
  public String toString(){
    return"Departamento""id="+id", nombre="+nombre", localizacion"+localizacion+'}';
  }
}

public class Empleado extends Persona{
  // Atributos...

  // Constructor...

  // Métodos...

  @Override
  public String toString(){
    return super.toString()"
Empleado"
      "categoria"+categoria", sueldo"+sueldo
      ", departamento"+departamento"";
  }
}

public class PruebaEmpleados {
  public static void main(String[] args) {
    // Creamos un departamento
    Departamento informatica=new Departamento"1In""Informatic""Madri");
    // Creamos empleados
    Empleado emp1=new Empleado"1345567""Maurici",35"casad""Analist",1500,informatica);
    Empleado emp2=new Empleado"2344567""Ange",32"casad""Analist",1000,informatica);

    // Aplicar métodos
    System.out.println(emp2.toString());
    emp2.subeSueldo(100);
    System.out.println"Sueldo:"+emp2.getSueldo());
  }
}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.