Empty

Programación Orientada a Objetos



Conceptos clave

  • Abstracción
  • Clase
  • Atributo
  • Método
  • Objeto
  • Instancia
  • Diagramas de
    clases
  • Mensaje
  • Constructor
  • Destructor
  • Evento
  • Sobreescritura
  • Clase Abstracta
  • Interfaz
  • Métodos de acceso
  • Modificadores de acceso
  • Modularidad
  • Encapsulamiento
  • Herencia
  • Polimorfismo
  • Atributos estáticos
  • Métodos estáticos
  • Clases estáticas
  • Hilos

  • Abstracción

    La abstracción es un proceso de interpretación y diseño que implica reconocer y enfocarse en las características importantes de una situación u objeto, y filtrar o ignorar todas las particularidades no esenciales.
    • Dejar a un lado los detalles de un objeto y definir las características específicas de éste, aquellas que lo distingan de los demás tipos de objetos.
    • Hay que centrarse en lo que es y lo que hace un objeto, antes de decidir cómo debería ser implementado.
    • Se hace énfasis en el qué hace más que en el cómo lo hace

    Photo

    Ejemplo: Imaginemos que queremos aplicar la abstracción a las aves:

    Objeto: Pajaro

    Caracteristicas:
    • Pico
    • Alas
    • Patas
    • Plumas
    Funcionalidades:
    • Volar
    • Picar
    • Aterrizar

    Clase
    La clase es un modelo o prototipo que define las variables y métodos comunes a todos los objetos de cierta clase. También se puede mencionar que una clase es una plantilla genérica para un conjunto de objetos de similares características. Una clase define el estado y el comportamiento que todos los objetos creados a partir de esa clase tendrán.

    Ejemplo:



    Ejemplo desarrollado en Java:



    Ejemplo desarrollado en C++:



    Ejemplo desarrollado en Python:




    Atributo

    Es una característica de un objeto, que ayuda a definir su estructura y permite diferenciarlo de otros objetos. Se define con un identificador y un tipo, el cual indica los valores que puede almacenar. El conjunto de valores de los campos definen el estado del objeto.



    Métodos
    Los métodos son los comportamientos o conductas de un objeto y permite identificar la forma en que actúa respecto a su entorno o respecto a otros objetos. Además, representa una operación o función que un objeto realiza. El conjunto de los métodos de un objeto determinan el comportamiento general del objeto.




    Objeto

    Los objetos de software, al igual que los objetos del mundo real, también tienen características y comportamientos. Un objeto de software mantiene sus características en uno o más atributos e implementa su comportamiento con métodos.

    • Es una entidad real o abstracta, con un papel definido en el dominio del problema.
    • Un objeto es una instancia de una clase, que tiene: identidad, estado(atributos) y comportamiento(metodos).
    Para el ejemplo anterior de la Clase UniversityStudent (Estudiante universitario), la creacion de objetos se haria de la siguiente forma:




    Instancia

    Es la particularización, realización específica u ocurrencia de una determinada clase, entidad o prototipo. Una instancia de una clase es un objeto.

    Ejemplo:


    Si se tiene la anterior clase Animal, se podría crear una instancia de esa clase como un objeto.


    En este caso, una instancia de la clase Animal es la creación de un nuevo objeto (perro) de nombre "Zeus" y raza "labrador". También se puede definir una instancia de una clase dentro de otra clase como el siguiente ejemplo .


    Como se puede observar, la clase Estudiante tiene una instancia de la clase Nota como atributo (evaluación).



    Diagramas de clases

    Cuando se está planteando el diseño y el modelo de los objetos mediante la abstracción, existe una forma de plasmar esos prototipos a través de un diagrama de clases. Formalmente, se describe como un tipo de diagrama de estructura estática que representa la estructura de un sistema mostrando las clases, sus atributos, operaciones (o métodos), y las relaciones entre los objetos.


    En los diagramas de clase, se tienen notaciones que son comunes dentro del lenguaje de modelado unificado (UML). Por ejemplo, la herencia se dibuja mediante un triángulo donde su eje superior apunta a la clase padre. La visibilidad de los atributos que tiene la clases se denota con un + (público), - (protegido), # (protegido). La relación que tiene un objeto con otro se representa dependiendo de su categoría, una relación de asociación es una línea sencilla que une las dos clases vinculadas, una relación de agregación (existe una instancia de un objeto en una clase) se describe mediante un rombo vacío y una relación de composición(la existencia de una clase depende absolutamente de otra) se representa con un rombo relleno.

    Para este ejemplo concretamente, la clase Empleado y la clase Cliente heredan de la clase Persona. Todos los atributos de las clases son privados, como se detalla en la clase Persona con el signo negativo antes de nombre y edad. Además, existe una relación de composición entre la clase Empleado y la clase Empresa, es decir, si un objeto Empresa deja de existir, la clase Empleado también va a dejar de existir.



    Mensaje

    Un mensaje es una comunicación dirigida desde un objeto A ordenando a otro objeto B que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó.
    Los mensaje son los que permiten la comunicacion entre objetos.
    Ejemplo:






    Constructor

    Cuando se crea un objeto es necesario inicializar sus variables con valores coherentes. Esto se hace por medio de un constructor que tiene las siguientes características: Se llama igual que la clase. Retorna una instancia de una clase Pueden existir varios, pero siguiendo las reglas de la sobrecarga de funciones. De entre los que existan, tan sólo uno se ejecutará al crear un objeto de la clase.

    Photo             Photo
    Constructor en Python y Constructor en PHP




    Destructor

    Es un método de una clase cuyo fin es eliminar un objeto de una clase.

    Photo             Photo
    Constructor en C++ y su respectivo destructor en C++




    Evento

    Los eventos son todas las acciones que el usuario inicia al dar clic sobre un botón, presionar una tecla, etc. Cada vez que se produce un evento se crea un objeto.

    Photo             Photo
    Una ventana con un botón y el resultado de darle clic al botón




    Sobreescritura

    Consiste en sobreescribir métodos heredados de una clase padre.

    Photo             Photo            

    Photo
    Ejemplo de la clase Animal (Clase padre) y las clases perro y oveja (Clases hijas) sobreescribiendo el método "hacerSonido heredado"
    Hecho en Python3



    Clase Abstracta

    Este tipo de clases nos permiten crear "métodos generales", que recrean un comportamiento común, pero sin especificar cómo lo hacen. A nivel de código tiene por particularidad que algunos de sus métodos no tienen “cuerpo de declaración“.

    • Una clase que declara la existencia de métodos pero no la implementación de dichos métodos (o sea, las llaves { } y las sentencias entre ellas), se considera una clase abstracta.
    • Una clase es declarada abstracta cuando no es posible crear instancias de ella.
    • Una clase debe ser declarada abstracta si posee al menos un método declarada abstracto.
    • Un método abstracto es aquel que no posee implementación.

    Photo
    Clases abstractas vs Interfaces



    Interfaz

    Es un conjunto de métodos abstractos y de constantes cuya funcionalidad es la de determinar el funcionamiento de una clase, es decir, funciona como un molde o como una plantilla. También es una descripción de las acciones que un objeto puede hacer. En programación orientada a objetos una interfaz X describe todas las funciones que un objeto debe tener para poder ser un X.

    • Una interface es una variante de una clase abstracta con la condición de que todos sus métodos deben ser abstractos. Si la interface va a tener atributos, éstos deben llevar las palabras reservadas static final y con un valor inicial ya que funcionan como constantes por lo que, por convención, su nombre va en mayúsculas.
    • Una clase implementa una o más interfaces (separadas con comas ",") con la palabra reservada implements.
    • La principal diferencia entre interface y abstract es que una interface proporciona un mecanismo de encapsulación de los protocolos de los métodos sin forzar al usuario a utilizar la herencia.
    Ejemplo:



    Un ejemplo de uso de una interfaz se presenta en la siguiente imagen a través de un diagrama de clases, donde las clases InstrumentoMusical y Sirena implementan de la interfaz Sonoro que cuenta con la declaración del método sonar(volumen: int).


    Métodos de acceso

    Son los métodos o funciones que permiten obtener o modificar los atributos de un objeto. Además, estos métodos tienen la limitación de proveer información acerca del estado de un objeto específicamente sus propiedades.

    Photo

    En el ejemplo anterior se pueden visualizar dos métodos de acceso de la clase CuentaBancaria. El método getNumeroCuenta() retorna el atributo numeroCuenta y no tiene ninguna otra especialidad. El método setNumeroCuenta(String numeroCuenta) actualiza el atributo numeroCuenta de acuerdo al valor pasado por parámetro.

    Modificadores de acceso

    Son palabras claves de los lenguajes de programación orientado a objetos para configurar la accesibilidad a las clases, métodos o propiedades.

    Photo

    Modularidad

    La modularidad es la propiedad que permite dividir una aplicación en partes más pequeñas ( llamadas módulos ), cada una de las cuales debe ser tan independiente como sea posible de la aplicación en sí y de las restantes partes.


    En el lenguaje de programación Java y en algunos entornos de desarrollo integrado (IDE), la modularidad radica en la separación de todos los posibles paquetes de código. La siguiente imagen muestra la división que se hace a partir de una aplicación base o un servicio general, que se divide en diferentes módulos con un propósito especial y finalmente un subdivición en pequeños paquetes de código que integran las clases.



    Encapsulamiento

    • Es la propiedad que permite asegurar que la información de un objeto está oculta del mundo exterior.
    • El encapsulamiento consiste en agrupar en una Clase las características(atributos) con un acceso privado y los comportamientos (métodos) con un acceso público.
    • Acceder o modificar los miembros de una clase a través de sus métodos.
    Photo

    Ejemplo:
    Cuando no hay encapsulamiento se pueden presentar problemas:


    Podemos ver que cuando no hay encapsulamiento los atributos pueden tomar valores inconsistentes, lo cual seria fatal para cualquier sistema.

    Aplicando el encapsulamiento tenemos:



    Con el resultado anterior vemos que el encapsulamiento nos ayuda a proteger la integridad de los datos y nos asegura que los atributos de nuestra clase solo podran ser accedidos a traves de los metodos definidos en dicha clase.

    Ejemplo de encapsulamiento en C++:



    Ejemplo de encapsulamiento en Python:



    Herencia

    Es una propiedad que permite crear clases a partir de otras ya existentes, obteniendo características (métodos y atributos) similares a los ya existentes.En otras palabras la nueva clase (subclase o clase derivada) puede utilizar la misma implementación de su superclase (clase base) o especificar una nueva implementación.
    • Es la relación entre una clase general y otra clase mas especifica.
    • Es un mecanismo que nos permite crear clases derivadas a partir de clases base.
    • Nos permite compartir automáticamente métodos y datos entre clases, subclases y objetos. Por ejemplo: Si declaramos una clase párrafo derivada de un clase texto todos los métodos y variables asociadas con la clase texto son automáticamente heredados por la subclase párrafo.



    Herencia simple: Es cuando una clase hereda de sólo una clase base.

    La clase B hereda de la clase A.

    Ejemplo:

    La clases Circle, Line y Triangle heredan todos los atributos y métodos de la clase Shape.


    Herencia múltiple: Es cuando una clase hereda de dos o más clases base.

    La clase C hereda tanto de la clase A como de la clase B.


    Ejemplo:

    En este ejemplo, las clases Passenger y Employee heredan de la clase Human y las clases FlyingPlane y GroundPlane heredan de la clase Plane.
    h5>

    Polimorfismo

    Son comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre; al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando.

    El método hablar puede ser sobreescrito por cualquier entidad (humano, perro, pato, gato).
    Ejemplo:

    Ambas clases deben sobreescribir el método getArea() puesto que se calculan de diferentes maneras en cada caso.



    Tipos de polimorfismo:
    • Polimorfismo Ad Hoc
    • Polimorfismo paramétrico
    • Polimorfismo de subtipos

    Polimorfismo Ad Hoc: Se refiere a funciones que cambian su comportamiento dependiendo del tipo de argumentos que reciben (sobrecarga de métodos o funciones).
    La sobrecarga de métodos hace referencia a varios métodos con el mismo nombre pero con diferentes firmas.

    Ejemplo:



    En el lenguaje de programación ABAP4 también se permite la sobrecarga de métodos como un tipo de polimorfismo.


    En el ejemplo anterior tenemos la clase Empleado y se desea realizar la sobrecarga del método modificarNombre. Este tipo de polimorfismo se implementa como se muestra en la siguiente imagen, el método recibe un parámetro i_nombre para una funcionalidad específica y como segunda medida, el método recibe dos parámetros i_nombre y i_apellido para otro procedimiento en particular.



    Polimorfismo paramétrico: El polimorfismo paramétrico permite que las funciones y las clases puedan escribirse de forma genérica, de tal manera que pueda manipular los datos de la misma manera sin importar el tipo.Ejemplos:
    • C++ - Templates
    • Java - Generics
    Polimorfismo de subtipos: Es una forma de polimorfismo en la cual los subtipos de un tipo pueden sustituir el comportamiento de las funciones del supertipo con su propia implementación.


    Atributos estáticos

    Son atributos inherentes a la clase en sí y no a una instancia de esta.

    Ejemplo de la clase estudiante con el atributo estático numero_estudiantes.

    Este atributo, como se puede observar, incrementa su valor en 1 cada vez que se crea una instancia de esta clase, este atributo, como ya se mencionó, pertenece a la clase y no al objeto, así que el número de estudiantes será de la clase Estudiante y no del objeto instanciado de esta.

    Ejemplo del uso de atributos estáticos

    Como se ve en el ejemplo, se instanciaron 3 objetos de la clase estudiante al consultar este atributo se debe accedes desde la clase estudiante y no desde la instancia de esta.

    Métodos estáticos

    Son métodos inherentes a la clase en sí y no a una instancia de esta.

    Ejemplo del método estático ordenarAlfabeticamente que retorna una lista ordenada lexicográficamente.




    Clases estáticas



    Ejemplos de clases estáticas en java y el acceso a ellas.