POO (Program. orientada a objetos) | Programación

 Indice:

  •  Conceptos
  • Objetos 
  • Caracteristicas
  • Ventajas y desventajas
  • Tipos
  • Lenguajes que soportan POO y sus ejemplos en código

Es un paradigma de programación que se basa en el uso de objetos y clases para modelar conceptos y problemas del mundo real. En la POO, un objeto es una entidad que contiene datos y métodos que actúan sobre dichos datos. Conjunto de objetos que se comunican entre sí, cada uno con su propia información y acciones capaces de realizar. Por ejemplo, una clase “Animal” podría tener atributos como edad o tamaño y métodos como comer o dormir. Este enfoque se basa en varios conceptos fundamentales que permiten una mejor organización y reutilización del código. 

Qué es la Programación Orientada a Objetos? Qué es la Programación Orientada a Objetos? 

Muchos de los objetos prediseñados de los lenguajes de programación actuales permiten la agrupación en bibliotecas o librerías, sin embargo, muchos de estos lenguajes permiten al usuario la creación de sus propias bibliotecas.

Algunas características clave de la programación orientada a objetos son herencia, cohesión, abstracción, polimorfismo, acoplamiento y encapsulamiento.

Su uso se popularizó a principios de la década de 1990. En la actualidad, existe una gran variedad de lenguajes de programación que soportan la orientación a objetos, estando la mayoría de éstos basados en el concepto de clases e instancias

Introducción

Los objetos son entidades que tienen un determinado estado, comportamiento e identidad:

  • La identidad es una propiedad de un objeto que lo diferencia del resto; dicho con otras palabras, es su identificador (concepto análogo al de identificador de una variable o una constante).
  • Los métodos y campos están estrechamente relacionados por la propiedad de conjunto. Esta propiedad destaca que una clase requiere de métodos para poder tratar los campos con los que cuenta.

La programación orientada a objetos difiere de la programación estructurada tradicional, en la que los datos y los procedimientos están separados y sin relación, ya que lo único que se busca es el procesamiento de unos datos de entrada para obtener otros de salida. La programación estructurada prima el concepto de procedimientos o funciones sobre el de estructuras (se emplean principalmente funciones que procesan datos). La programación orientada a objetos, en cambio, primero se definen los objetos o estructuras para posteriormente solicitar la ejecución de sus métodos. 

Origen

Los conceptos de la POO tienen origen en Simula 67, un lenguaje diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard, del Centro de Cómputo Noruego en Oslo. En este centro se trabajaba en simulaciones de naves, que fueron confundidas por la explosión combinatoria de cómo las diversas cualidades de diferentes naves podían afectar unas a las otras. La idea surgió al agrupar los diversos tipos de naves en diversas clases de objetos, siendo responsable cada clase de objetos de definir sus "propios" datos y comportamientos. Fueron refinados más tarde en Smalltalk, desarrollado en Simula en Xerox PARC (cuya primera versión fue escrita sobre Basic) pero diseñado para ser un sistema completamente dinámico en el cual los objetos se podrían crear y modificar "sobre la marcha" (en tiempo de ejecución) en lugar de tener un sistema basado en programas estáticos.

La POO se fue convirtiendo en el estilo de programación dominante a mediados de los años 1980, en gran parte debido a la influencia de C++, una extensión del lenguaje de programación C. Su dominación fue consolidada gracias al auge de las interfaces gráficas de usuario, para las cuales la POO está particularmente bien adaptada. En este caso, se habla también de programación dirigida por eventos.

Las características de orientación a objetos fueron agregadas a muchos lenguajes existentes durante ese tiempo, incluyendo AdaBASICLisp más Pascal, entre otros. La adición de estas características a los lenguajes que no fueron diseñados inicialmente para ellas condujo a menudo a problemas de compatibilidad y en la capacidad de mantenimiento del código. Los lenguajes orientados a objetos "puros", por su parte, carecían de las características de las cuales muchos programadores habían venido a depender. Para saltar este obstáculo, se hicieron muchas tentativas para crear nuevos lenguajes basados en métodos orientados a objetos, pero permitiendo algunas características imperativas de maneras "seguras". El lenguaje de programación Eiffel de Bertrand Meyer fue un temprano y moderadamente acertado lenguaje con esos objetivos, pero ahora ha sido esencialmente reemplazado por Java, en gran parte debido a la aparición de Internet y a la implementación de la máquina virtual Java en la mayoría de navegadores webPHP en su versión 5 se ha modificado; soporta una orientación completa a objetos, cumpliendo todas las características propias de la orientación a objetos.

Conceptos fundamentales

La POO es una forma de programar que trata de encontrar una solución a estos problemas. Introduce nuevos conceptos, que superan y amplían conceptos antiguos ya conocidos. Entre ellos destacan los siguientes:

Clase
Una clase es una especie de "plantilla" en la que se definen los atributos y métodos predeterminados de un tipo de objeto. Esta plantilla se crea para poder crear objetos fácilmente. Al método de crear nuevos objetos mediante la lectura y recuperación de los atributos y métodos de una clase se le conoce como instanciación.
Herencia
Por ejemplo, herencia de la clase C a la clase D, es la facilidad mediante la cual la clase D hereda en ella cada uno de los atributos y operaciones de C, como si esos atributos y operaciones hubiesen sido definidos por la misma D. Por lo tanto, puede usar los mismos métodos y variables registrados como "públicos" (public) en C. Los componentes registrados como "privados" (private) también se heredan pero se mantienen escondidos al programador y solo pueden ser accedidos a través de otros métodos públicos. Para poder acceder a un atributo u operación de una clase en cualquiera de sus subclases pero mantenerla oculta para otras clases es necesario registrar los componentes como "protegidos" (protected), de esta manera serán visibles en C y en D pero no en otras clases.
Objeto
Instancia de una clase. Entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad (métodos), los mismos que consecuentemente reaccionan a eventos. Se corresponden con los objetos reales del mundo que nos rodea, o con objetos internos del sistema (del programa).
Método
Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema.
Evento
Es un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. También se puede definir como evento la reacción que puede desencadenar un objeto; es decir, la acción que genera.
Atributos
Características que tiene la clase.
Mensaje
Una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó.
Propiedad o atributo
Contenedor de un tipo de dato asociado a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto y esto se define como sus características predeterminadas, y cuyo valor puede ser alterado por la ejecución de algún método.
Estado interno
Es una variable que se declara privada, que puede ser únicamente accedida y alterada por un método del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos). No es visible al programador que maneja una instancia de la clase.
Miembros de un objeto
Atributos, identidad, relaciones y métodos.
Identificación de un objeto
Un objeto se representa por medio de una tabla o entidad que esté compuesta por sus atributos y funciones correspondientes.

En comparación con un lenguaje imperativo, una "variable" no es más que un contenedor interno del atributo del objeto o de un estado interno, así como la "función" es un procedimiento interno del método del objeto.

Objetos en POO

 En la Programación Orientada a Objetos (POO), un objeto es una unidad que combina datos y funciones que operan sobre esos datos. Los objetos son instancias de clases, que actúan como plantillas o moldes para crear objetos con características y comportamientos específicos.

Características de los Objetos en POO:

  1. Atributos: Son las propiedades o datos que describen el estado del objeto. Por ejemplo, en un objeto Coche, los atributos podrían ser marcamodelocolor, etc.
  2. Métodos: Son las funciones o procedimientos que definen el comportamiento del objeto. En el caso del objeto Coche, un método podría ser acelerar() o frenar().

Ejemplo:

Imagina un objeto Coche:

  • Atributosmarcamodelocoloraño.
  • Métodosarrancar()detener()acelerar()frenar().

Ventajas de Usar Objetos:

  • Encapsulamiento: Los datos y métodos están encapsulados dentro del objeto, lo que mejora la modularidad y la protección de datos.
  • Reutilización: Las clases pueden ser reutilizadas para crear múltiples objetos con las mismas características y comportamientos.

Ventajas de la POO

  • Modularidad: La POO permite dividir un programa en partes más pequeñas y manejables, facilitando el desarrollo y mantenimiento.
  • Reutilización de código: Gracias a la herencia y a la creación de clases, se puede reutilizar código existente, lo que ahorra tiempo y esfuerzo.
  • Facilidad de mantenimiento: Los cambios en una clase pueden reflejarse en todos los objetos que la utilizan, lo que simplifica el mantenimiento del software.

 Desventajas de POO

    Complejidad: La POO puede introducir una mayor complejidad en el diseño y la implementación de software. La creación de clases y objetos, así como la gestión de relaciones entre ellos, puede ser complicada, especialmente en sistemas grandes y complejos
  1. .
  2. Sobrecarga de Recursos: Los programas orientados a objetos pueden consumir más recursos en comparación con otros paradigmas de programación. Esto se debe a la necesidad de crear y gestionar múltiples objetos, lo que puede afectar el rendimiento, especialmente en aplicaciones que requieren alta eficiencia.
  3. Curva de Aprendizaje: Para los programadores que están acostumbrados a paradigmas más simples, como la programación estructurada, la transición a la POO puede ser desafiante. Comprender conceptos como herencia, polimorfismo y encapsulamiento requiere tiempo y práctica
  4. .
  5. Rigidez: La POO puede ser rígida en su estructura. Una vez que se establece una jerarquía de clases, realizar cambios puede ser complicado y requerir una reestructuración significativa del código.
  6. Exceso de Abstracción: A veces, la POO puede llevar a un exceso de abstracción, donde los desarrolladores crean clases y objetos innecesarios, complicando el diseño en lugar de simplificarlo. Esto puede resultar en un código más difícil de entender y mantener.

Tipos

Para realizar programación orientada a objetos existen 3 corrientes principales:1011

  • Basada en clases.- Es la más ampliamente usada por los lenguajes de programación orientada a objetos. Por ejemplo es usada por Java, C++ y C#. Se basa en crear una estructura molde llamada clase donde se especifican los campos y métodos que tendrán nuestros objetos. Cada vez que necesitamos un objeto creamos una instancia (o copia del objeto) usando la clase como molde.
  • Basada en prototipos.- Es soportado en Javascript o Ruby. No hay clases, solo hay objetos. El mecanismo para la reutilización está dado por la clonación de objetos. Se crean directamente los objetos y cuando se quiere generar otro con la misma estructura se usa clonación. Una vez clonado si queremos podemos agregar los campos y métodos necesarios. Un objeto prototípico es un objeto que se utiliza como una plantilla a partir de la cual se obtiene el conjunto inicial de propiedades de un objeto. Cualquier objeto puede ser utilizado como el prototipo de otro objeto, permitiendo al segundo objeto compartir las propiedades del primero.
  • Basada en estructuras.- Soportado por Go, Rust, Nim y algunos otros lenguajes compilados. Este enfoque está basado en la construcción de tipos definidos por el usuario (struct type), llamados estructuras con sus respectivas propiedades o atributos y se le añade una variable de tipo puntero a las funciones o métodos de esa estructura. Tiene soporte de métodos públicos y privados, así como Genéricos. También tiene soporte para interfaces; pilar de apoyo para polimorfismo y herencia.

Lenguajes orientados a  objetos

  • java: Uno de los lenguajes más utilizados para aplicaciones empresariales y móviles.
  • C++: Una extensión de C que incluye características de POO.
  • Python: Conocido por su simplicidad y versatilidad, es muy popular en desarrollo web y científico.
  • C#: Utilizado principalmente en el desarrollo de aplicaciones para Windows y videojuegos con Unity.
  • Ruby: Conocido por su sintaxis elegante y utilizado en desarrollo web con Ruby on Rails.
  • PHP: Muy utilizado en desarrollo web, especialmente en el backend.
  • Objective-C: Utilizado principalmente para el desarrollo de aplicaciones para iOS y macOS.
  • Swift: El sucesor de Objective-C para el desarrollo en iOS y macOS.
  • Visual Basic .NET: Utilizado en aplicaciones empresariales y de escritorio.
  • Perl: Utilizado en administración de sistemas y desarrollo web.
  • Estos lenguajes permiten aprovechar las ventajas de la POO, como la reutilización de código, la modularidad y la facilidad de mantenimiento.

    Ejemplos de código de lenguajes

    JavaScript

    JavaScript utiliza un modelo basado en prototipos para la POO, pero también admite clases desde ECMAScript 6.


    class Persona {
        constructor(nombre, edad) {
            this.nombre = nombre;
            this.edad = edad;
        }
    
        saludar() {
            console.log(`Hola, mi nombre es ${this.nombre} y tengo ${this.edad} años.`);
        }
    }
    
    const persona1 = new Persona("Juan", 30);
    persona1.saludar();
    

    Python

    Python es conocido por su simplicidad y su fuerte soporte para la POO.

    class Persona:
        def __init__(self, nombre, edad):
            self.nombre = nombre
            self.edad = edad
    
        def saludar(self):
            print(f"Hola, mi nombre es {self.nombre} y tengo {self.edad} años.")
    
    persona1 = Persona("Juan", 30)
    persona1.saludar()
    

    Swift

    Swift es el lenguaje principal para el desarrollo de aplicaciones iOS y macOS, y soporta POO de manera robusta.


    class Persona {
        var nombre: String
        var edad: Int
    
        init(nombre: String, edad: Int) {
            self.nombre = nombre
            self.edad = edad
        }
    
        func saludar() {
            print("Hola, mi nombre es \(nombre) y tengo \(edad) años.")
        }
    }
    
    let persona1 = Persona(nombre: "Juan", edad: 30)
    persona1.saludar()
    

    C++

    C++ es un lenguaje potente que permite una implementación eficiente de la POO.

    #include <iostream>
    using namespace std;
    
    class Persona {
    public:
        string nombre;
        int edad;
    
        Persona(string n, int e) : nombre(n), edad(e) {}
    
        void saludar() {
            cout << "Hola, mi nombre es " << nombre << " y tengo " << edad << " años." << endl;
        }
    };
    
    int main() {
        Persona persona1("Juan", 30);
        persona1.saludar();
        return 0;
    }

Ejemplos de Código escrito por IA .revise antes de usar el código.

Críticas:

El paradigma POO ha sido criticado por varias razones, incluyendo no cumplir con las metas de reusabilidad y modularidad, y por sobreenfatizar un aspecto de diseño y modelación de software (datos/objetos) a expensas de otros aspectos importantes (computación/algoritmos).

Programación Orientada a Objetos (POO) en ámbitos de programación

se aplica en una amplia variedad de ámbitos y especialidades dentro de la programación, cada uno beneficiándose de sus principios de modularidad, reutilización y mantenimiento. Aquí te dejo algunos ejemplos de cómo se utiliza en diferentes áreas:

Desarrollo de Software

  • Aplicaciones de Escritorio: Lenguajes como Java, C++ y Python utilizan POO para crear aplicaciones robustas y escalables.
  • Desarrollo Web: Frameworks como Django (Python) y Ruby on Rails (Ruby) se basan en POO para estructurar aplicaciones web de manera eficiente.

Videojuegos

  • Motores de Juego: Unity (C#) y Unreal Engine (C++) utilizan POO para manejar objetos del juego como personajes, enemigos y elementos del entorno, facilitando la creación y gestión de mundos virtuales complejos.

Inteligencia Artificial

  • Modelos de IA: En Python, bibliotecas como TensorFlow y PyTorch utilizan POO para definir y entrenar modelos de aprendizaje automático, permitiendo una organización clara y modular de los componentes del modelo.

Sistemas Embebidos

  • Dispositivos IoT: Lenguajes como C++ se utilizan en la programación de microcontroladores y otros dispositivos embebidos, aprovechando la POO para gestionar sensores, actuadores y comunicaciones de manera eficiente.

Desarrollo de Aplicaciones Móviles

  • iOS y Android: Swift (iOS) y Kotlin (Android) son lenguajes orientados a objetos que permiten a los desarrolladores crear aplicaciones móviles con interfaces de usuario intuitivas y funcionalidades complejas.

Ciencia de Datos

  • Análisis de Datos: En R y Python, la POO se utiliza para estructurar y manipular grandes conjuntos de datos, facilitando el análisis y la visualización de datos de manera eficiente.

Ventajas de la POO en estos Ámbitos:

  • Modularidad: Facilita la división del código en módulos independientes.
  • Reutilización: Permite reutilizar clases y objetos en diferentes partes del programa.
  • Mantenimiento: Hace que el código sea más fácil de mantener y actualizar.

Comentarios