Descomponiendo al JAVA... 🚨 (Parte 2)

Conceptos de OOP y Estructura de datos 👊

image: www.miltonmarketing.com


📦 Introducción a los objetos

"Un objeto en programación es una entidad que representa un elemento del mundo real o una entidad abstracta en el contexto del software. Un objeto cuenta con su estructura interna que combina variables, funciones y estructuras de datos. Los objetos en programación representan cosas del mundo real, así como conceptos abstractos con sus características y comportamientos específicos. Los elementos de un objeto se dividen en dos categorías principales: propiedades y métodos. Las propiedades, también conocidas como atributos, incluyen información sobre el objeto. Por ejemplo, si consideramos un objeto Automóvil, algunas de sus propiedades serán: el color, la marca, el modelo o el año de fabricación. Los métodos definen las operaciones que se pueden realizar con el objeto. Por ejemplo, para el objeto Automóvil, los métodos podrían ser acelerar, frenar o girar.

En Java, un objeto se crea a partir de una clase. Las clases y los objetos son los conceptos más importantes de la programación orientada a objetos. Una clase es una plantilla que define la estructura y las características comunes de todos los objetos de este tipo. Puedes crear múltiples objetos a partir de una sola clase; cada uno tendrá sus propios valores y podrá realizar las operaciones definidas por esta clase."

💥El  automóvil...

Suponga que desea conducir un automóvil. Primero debe encenderlo y presionar el acelerador. ¿Suena fácil, verdad? Pero ¿no es verdad que antes de conducir un automóvil tuvo (debe) alguien que haberlo fabricado? Solo tenemos el producto final: el automóvil ya construido.

Para construir un automóvil, alguien debe diseñarlo, es decir, realizar los planos, los dibujos. Lo que incluye el diseño del volante, las llantas, el pedal del acelerador, etc. Pero cuando conducimos el auto y por ejemplo presionamos el pedal del acelerador, solo sabemos que el automóvil va aumentar su velocidad; no conoces como funciona por dentro el pedal, no conocemos su mecanismo; simplemente presionamos el pedal y sentimos la adrenalina xD.

En la Programación Orientada a Objetos sucede algo parecido. Para construir un sistema nos valemos de "planos", es decir, clases. Las clases son como esas plantillas o planos que nos permite crear objetos. Y los métodos son los comportamientos que tendrá ese objeto, es decir, los métodos tendrá las instrucciones de código que indicará como debe comportase o que debe hacer dicho objeto, pero esas instrucciones están oculta del usuario final. Al igual que "el pedal del acelerador" oculta del chofer o conductor los mecánicos interno que hace que acelere el vehículo , los métodos hacen una función parecida al ocultar las instrucciones de código de los usuarios.

Lo más difícil para algunos, es pasar la idea de un objeto en la vida real al ámbito de la programación. Pero esa idea se puede disipar un poco cuando pensamos al objeto como una entidad o "un todo" de algo que a su vez puede contener sub-objetos. 

Usando el mismo ejemplo del vehículo, se puede decir que es un objeto, "un todo"; pero puede tener sub-objetos, como el motor, siempre y cuando quisiéramos desglosar el motor, porque el motor contiene a su vez sub-partes:


Bueno, nosotros no somos mecánicos, así que dejemos al motor quieto un momento.

En este punto entra el concepto de abstracción.

Tratando de aplicar este concepto - otra vez-  a la programación... supongamos que quisiéramos crear una app, una agenda para ser mas específicos. La agenda es un objeto, "un todo", los métodos son los comportamiento: agregar persona, eliminar persona, etc. Los atributos (también llamados propiedades) son las características: tamaño, color, etc. 

¿Y la clase? La clase es la plantilla ("el plano"), es decir, la clase es la que va a contener los métodos y los atributos. La clase se toma como base para fabricar el objeto (la agenda). Así, en futuro, si queremos crear agendas de distinto colores, podemos usar la misma plantilla o clase, solo que cambiamos algunos atributos como, por ejemplo, el color.

Nota 1: te recomiendo a investigar ejemplos de clases y objetos en java con la ayuda de IA.

💥Instanciación

Al igual que no podemos manejar un vehículo dibujado o que está solo en el plano, si no que más bien, necesita ser construido para que llegue ser un objeto tangible y así poder usarlo, de la misma manera, también necesitamos crear un objeto de la clase para que un programa pueda realizar las tareas definidas por los métodos de la clase. A esto se le conoce como instanciación, es decir, un objeto es una instancia de su clase.

💥Ocultamiento de información (Encapsulación)

"La encapsulación en Java es un mecanismo para agrupar variables (datos) y métodos (código) como una sola unidad. Es el proceso de ocultar información detallada y proteger los datos y el comportamiento del objeto. La encapsulación es uno de los cuatro conceptos importantes de la programación orientada a objetos. La encapsulación permite que los datos sean accesibles solo a través de los métodos definidos en la clase. Esto significa que los datos están protegidos de cambios no autorizados y se pueden validar antes de ser asignados a una variable."

Y aquí entra en juego el concepto de modificadores de acceso.

public class Coche {
    private String marca;
    private String modelo;
    private int año;

    public Coche(String marca, String modelo, int año) {
        this.marca = marca;
        this.modelo = modelo;
        this.año = año;
    }

    public String getMarca() {
        return marca;
    }

    public void setMarca(String marca) {
        this.marca = marca;
    }

    public String getModelo() {
        return modelo;
    }

    public void setModelo(String modelo) {
        this.modelo = modelo;
    }

    public int getAño() {
        return año;
    }

    public void setAño(int año) {
        this.año = año;
    }
}

En el ejemplo anterior, se define una clase Coche con tres variables privadas: marca, modelo y año. Luego, se definen los métodos get y set para cada variable. Los métodos get se utilizan para obtener el valor de una variable, mientras que los métodos set se utilizan para establecer el valor de una variable. Los métodos set también pueden incluir validaciones para asegurarse de que los datos sean válidos antes de asignarlos a una variable."

💥Herencia

"Mediante la herencia es posible crear con rapidez y de manera conveniente una nueva clase de objetos. La nueva clase (conocida como subclase) comienza con las características de una clase existente (conocida como superclase), con la posibilidad de personalizarlas y agregar características únicas propias. En nuestra analogía del auto, sin duda un objeto de la clase “convertible” es un objeto de la clase más general llamada “automóvil” pero, de manera más específica, el toldo puede ponerse o quitarse."

Un ejemplo: 

"Aquí hay un ejemplo de cómo se puede utilizar la herencia en Java para crear una clase Coche que hereda de una clase Vehículo:

public class Vehículo {
    private String marca;
    private String modelo;
    private int año;

    public Vehículo(String marca, String modelo, int año) {
        this.marca = marca;
        this.modelo = modelo;
        this.año = año;
    }

    public String getMarca() {
        return marca;
    }

    public void setMarca(String marca) {
        this.marca = marca;
    }

    public String getModelo() {
        return modelo;
    }

    public void setModelo(String modelo) {
        this.modelo = modelo;
    }

    public int getAño() {
        return año;
    }

    public void setAño(int año) {
        this.año = año;
    }
}

public class Coche extends Vehículo {
    private int numPuertas;

    public Coche(String marca, String modelo, int año, int numPuertas) {
        super(marca, modelo, año);
        this.numPuertas = numPuertas;
    }

    public int getNumPuertas() {
        return numPuertas;
    }

    public void setNumPuertas(int numPuertas) {
        this.numPuertas = numPuertas;
    }
}

En el ejemplo anterior, se define una clase Vehículo con tres variables privadas: marca, modelo y año. Luego, se define la clase Coche que hereda de la clase Vehículo y agrega una variable adicional numPuertas. La clase Coche también define un constructor que llama al constructor de la clase Vehículo utilizando la palabra clave super."

💥Interfaces

"Java también soporta las interfaces: colecciones de métodos relacionados que por lo general nos permiten indicar a los objetos qué hacer, pero no cómo hacerlo (en Java SE 8 veremos una excepción a esto). En la analogía del auto, una interfaz con “capacidades básicas de conducción” que consista de un volante de dirección, un pedal acelerador y un pedal del freno, permitiría a un conductor indicar al auto qué debe hacer. Una vez que sepa cómo usar esta interfaz para dar vuelta, acelerar y frenar, podrá conducir muchos tipos de autos, incluso aunque los fabricantes puedan implementar estos sistemas de manera diferente.

Una clase implementa cero o más interfaces, cada una de las cuales puede tener uno o más métodos, al igual que un auto implementa interfaces separadas para las funciones básicas de conducción, para el control del radio, el control de los sistemas de calefacción y aire acondicionado, etcétera. Así como los fabricantes de automóviles implementan las capacidades de manera diferente, las clases pueden implementar los métodos de una interfaz de manera diferente. Por ejemplo, un sistema de software puede incluir una interfaz de “respaldo” que ofrezca los métodos guardar y restaurar. Las clases pueden implementar esos métodos de manera distinta, dependiendo de los tipos de cosas que se vayan a respaldar, como programas, textos, archivos de audio, videos, etc., y los tipos de dispositivos en donde se vayan a almacenar estos elementos."

Nota 2: te animo que busque ejemplo de Interfaces en java y así puedas profundizar en el concepto.

💠Estructura de datos

Las estructuras de datos en Java son elementos fundamentales en la programación que permiten almacenar y organizar datos de una forma eficiente. Estas estructuras actúan como cimientos sobre los cuales se construyen aplicaciones y algoritmos. La elección de una determinada estructura de datos permite a los programadores gestionar datos de manera eficaz, así como optimizar la memoria y recursos del servidor o PC en la que es ejecutada. En Java, existen varios tipos de estructuras de datos, como arrays, listas, pilas, colas, árboles, entre otros. Cada tipo de estructura de datos tiene sus propias características y se utiliza para diferentes propósitos. Por ejemplo, los arrays se utilizan para almacenar una colección de elementos del mismo tipo, mientras que las listas se utilizan para almacenar una colección de elementos de diferentes tipos. "

💥Array en Java

"Un array en Java es una estructura de datos que nos permite almacenar una colección de elementos del mismo tipo. Los arrays se utilizan para almacenar datos de manera organizada y eficiente. El tamaño de los arrays se declara en un primer momento y no puede cambiar en tiempo de ejecución como puede producirse en otros lenguajes.

Aquí hay un ejemplo de cómo se puede declarar un array en Java:

int[] numeros = new int[5];

En el ejemplo anterior, se declara un array llamado numeros que puede almacenar 5 elementos de tipo int. Los elementos del array se inicializan automáticamente a 0.

Para asignar valores a un array numérico en Java, primero debes declarar el array y luego asignar valores a cada elemento del array. Aquí hay un ejemplo de cómo se puede hacer esto:

public class Main {
    public static void main(String[] args) {
        int[] numeros = new int[5];

        numeros[0] = 10;
        numeros[1] = 20;
        numeros[2] = 30;
        numeros[3] = 40;
        numeros[4] = 50;

        for (int i = 0; i < numeros.length; i++) {
            System.out.println(numeros[i]);
        }
    }
}

En el ejemplo anterior, se declara un array llamado numeros que puede almacenar 5 elementos de tipo int. Luego, se asignan valores a cada elemento del array utilizando la sintaxis numeros[i] = valor. Finalmente, se imprime cada elemento del array en la consola utilizando un bucle for. "

Nota 3: te recomiendo buscar más ejemplo de como usar y manipular los arrays  en Java con la ayuda de IA.

💥Array bidimensional en Java

"Aquí hay un ejemplo de cómo declarar y construir un arreglo bidimensional en Java:

int[][] arregloBidimensional = new int[3][3];

En este ejemplo, arregloBidimensional es un arreglo bidimensional de tamaño 3x3. Puede acceder a los elementos del arreglo utilizando dos índices, como se muestra a continuación:

arregloBidimensional[0][0] = 1;
arregloBidimensional[0][1] = 2;
arregloBidimensional[0][2] = 3;
arregloBidimensional[1][0] = 4;
arregloBidimensional[1][1] = 5;
arregloBidimensional[1][2] = 6;
arregloBidimensional[2][0] = 7;
arregloBidimensional[2][1] = 8;
arregloBidimensional[2][2] = 9;

En este ejemplo, se inicializa el arreglo bidimensional con los valores del 1 al 9. Tenga en cuenta que los índices de los arreglos bidimensionales comienzan en 0.

Para recorrer un arreglo bidimensional, puede utilizar dos bucles for anidados. El primer bucle for se utiliza para iterar sobre las filas del arreglo, mientras que el segundo bucle for se utiliza para iterar sobre las columnas del arreglo. Aquí hay un ejemplo:

for (int i = 0; i < arregloBidimensional.length; i++) {
    for (int j = 0; j < arregloBidimensional[i].length; j++) {
        System.out.print(arregloBidimensional[i][j] + " ");
    }
    System.out.println();
}

Este código imprimirá los valores del arreglo bidimensional en la consola.

Si desea obtener más información sobre los arreglos bidimensionales en Java, puede consultar la página web de dCodinGames que proporciona una explicación detallada y ejemplos adicionales."


💥List en Java

"En Java, una lista es una estructura de datos que permite almacenar y organizar elementos en una secuencia ordenada. Las listas son una de las estructuras de datos más utilizadas en Java y se utilizan para almacenar colecciones de elementos del mismo tipo. Las listas son similares a los arrays, pero tienen algunas ventajas adicionales, como la capacidad de agregar y eliminar elementos dinámicamente y la capacidad de cambiar el tamaño de la lista en tiempo de ejecución.

Java proporciona una interfaz List que define los métodos comunes que se pueden utilizar para trabajar con listas. Algunas de las clases que implementan la interfaz List son ArrayList, LinkedList y Vector.

Aquí hay un ejemplo de cómo se puede utilizar una lista en Java:

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        // Crear una lista de números enteros
        ArrayList<Integer> numeros = new ArrayList<Integer>();

        // Agregar elementos a la lista
        numeros.add(1);
        numeros.add(2);
        numeros.add(3);

        // Imprimir los elementos de la lista
        for (int i = 0; i < numeros.size(); i++) {
            System.out.println(numeros.get(i));
        }
    }
}

En el ejemplo anterior, se crea una lista de números enteros utilizando la clase ArrayList. Luego, se agregan algunos elementos a la lista y se imprimen en la consola utilizando un bucle for."

Nota 4: te animo a que profundice en el tema de las List  y su manipulación.

💥Packages en Java

"Los paquetes son el mecanismo que usa Java para facilitar la modularidad del código. Un paquete puede contener una o más definiciones de interfaces y clases, distribuyéndose habitualmente como un archivo. Para utilizar los elementos de un paquete es necesario importar este en el módulo de código en curso, usando para ello la sentencia import.

Si desea obtener más información sobre los paquetes en Java, puede consultar la página web de campusMVP que proporciona una explicación detallada y ejemplos adicionales."

Nota 5: te recomiendo buscar más información de como crear packages en Java y como impórtalo.

________________________________________________________________________

Fuentes consultadas

  • Cómo programar en Java de H.M. Deitel y P.J. Deitel de la editorial Prentice-Hall (su título original es JAVA How to program).
  • Microsoft Edge Copilot IA.


Comentarios

Entradas populares