JavaRush /Blog Java /Random-ES /Principios de programación orientada a objetos

Principios de programación orientada a objetos

Publicado en el grupo Random-ES
Java es un lenguaje orientado a objetos. Esto significa que necesita escribir programas Java utilizando un estilo orientado a objetos. Y este estilo se basa en el uso de objetos y clases en el programa.

Principios básicos de la programación orientada a objetos:

Principios de la programación orientada a objetos - 1Intentemos, con la ayuda de ejemplos, comprender qué son las clases y los objetos, así como cómo aplicar los principios básicos de la programación orientada a objetos en la práctica: abstracción, herencia, polimorfismo y encapsulación.

¿Qué es un objeto?

El mundo en el que vivimos está formado por objetos. Si miramos a nuestro alrededor, veremos que estamos rodeados de casas, árboles, coches, muebles, platos, ordenadores. Todos estos elementos son objetos y cada uno de ellos tiene un conjunto de características, comportamiento y propósito específicos. Estamos acostumbrados a los objetos y siempre los utilizamos para fines muy concretos. Por ejemplo, si necesitamos ir a trabajar utilizamos el coche, si queremos comer utilizamos platos y si necesitamos relajarnos necesitamos un sofá cómodo. Una persona está acostumbrada a pensar objetivamente para resolver problemas de la vida cotidiana. Ésta fue una de las razones para utilizar objetos en la programación, y este enfoque para crear programas se denominó orientado a objetos. Pongamos un ejemplo. Imagine que ha desarrollado un nuevo modelo de teléfono y desea iniciar su producción en masa. Como diseñador de un teléfono, sabes para qué sirve, cómo funcionará y de qué partes estará compuesto (carcasa, micrófono, altavoz, cables, botones, etc.). Sin embargo, sólo tú sabes cómo conectar estas piezas. Sin embargo, no tiene previsto producir teléfonos personalmente, para ello dispone de toda una plantilla de empleados. Para que no tenga que explicar cada vez cómo conectar las partes del teléfono y para que todos los teléfonos en producción resulten iguales, antes de comenzar a producirlos, deberá hacer un dibujo en forma de Descripción de la estructura del teléfono. En POO, dicha descripción, dibujo, diagrama o plantilla se denomina clase, a partir de la cual se crea un objeto cuando se ejecuta el programa. Una clase es una descripción de un objeto que aún no ha sido creado, como una plantilla general que consta de campos, métodos y un constructor, y un objeto es una instancia de una clase creada sobre la base de esta descripción.

abstracción de programación orientada a objetos

Pensemos ahora en cómo podemos pasar de un objeto del mundo real a un objeto en un programa, usando el teléfono como ejemplo. La historia de este medio de comunicación supera los 100 años y el teléfono moderno, a diferencia de su predecesor del siglo XIX, es un dispositivo mucho más complejo. Cuando utilizamos un teléfono, no pensamos en su estructura ni en los procesos que ocurren en su interior. Simplemente utilizamos las funciones proporcionadas por los desarrolladores del teléfono: botones o pantalla táctil para seleccionar un número y realizar llamadas. Una de las primeras interfaces telefónicas fue una perilla que se giraba para realizar una llamada. Por supuesto, esto no fue muy conveniente. Sin embargo, el mango cumplió su función correctamente. Si nos fijamos en el primer teléfono y el más moderno, podemos identificar inmediatamente los detalles más importantes que son importantes tanto para un dispositivo de finales del siglo XIX como para un teléfono inteligente ultramoderno. Esto es hacer una llamada (marcar un número) y recibir una llamada. Básicamente, esto es lo que hace que un teléfono sea un teléfono y no otra cosa. Ahora hemos aplicado el principio en programación orientada a objetos: resaltar las características y la información más importantes sobre un objeto. Este principio de la programación orientada a objetos se llama abstracción. La abstracción en programación orientada a objetos también se puede definir como una forma de representar elementos de un problema del mundo real como objetos en un programa. La abstracción siempre está asociada a la generalización de alguna información sobre las propiedades de los objetos u objetos, por lo que lo principal es separar la información significativa de la insignificante en el contexto del problema que se está resolviendo. En este caso, puede haber varios niveles de abstracción. Intentemos aplicar el principio de abstracción a nuestros teléfonos. Primero, resaltemos los tipos de teléfonos más comunes desde el principio hasta la actualidad. Por ejemplo, se pueden representar en forma del diagrama que se muestra en la Figura 1. Principios de la programación orientada a objetos - 2Ahora, con la ayuda de la abstracción, podemos resaltar información general en esta jerarquía de objetos: un tipo abstracto común de objetos: el teléfono, una característica general de el teléfono - el año de su creación y una interfaz común - todos los teléfonos son capaces de recibir y enviar llamadas. Así es como se ve en Java:
public abstract class AbstractPhone {
    private int year;

    public AbstractPhone(int year) {
        this.year = year;
    }
    public abstract void call(int outputNumber);
    public abstract void ring (int inputNumber);
}
Basándonos en esta clase abstracta, podremos crear nuevos tipos de teléfonos en el programa utilizando otros principios básicos de programación orientada a objetos de Java, que consideraremos a continuación.

Encapsulación

Con la ayuda de la abstracción, resaltamos lo que es común a todos los objetos. Sin embargo, cada modelo de teléfono es individual y algo diferente de los demás. ¿Cómo podemos trazar límites en el programa y designar esta individualidad? ¿Cómo podemos asegurarnos de que ninguno de los usuarios pueda romper nuestro teléfono de forma accidental o intencionada, o intentar convertir un modelo en otro? Para el mundo de los objetos reales, la respuesta es obvia: es necesario colocar todas las piezas en el cuerpo del teléfono. Después de todo, si no hacemos esto y dejamos afuera todo el interior del teléfono y los cables que lo conectan, seguramente aparecerá un experimentador curioso que querrá "mejorar" el funcionamiento de nuestro teléfono. Para evitar tal interferencia en el diseño y funcionamiento de un objeto, la programación orientada a objetos utiliza el principio de encapsulación , otro principio básico de la programación orientada a objetos, en el que los atributos y el comportamiento de un objeto se combinan en una clase, la implementación interna del objeto está oculta. el usuario, y se proporciona una interfaz abierta para trabajar con el objeto. El trabajo del programador es determinar qué atributos y métodos serán accesibles públicamente y cuáles son implementaciones internas del objeto y no deben modificarse.

Encapsulación y control de acceso

Digamos que durante la producción, en la parte posterior del teléfono se graba información al respecto: el año de fabricación o el logo de la empresa fabricante. Esta información caracteriza de manera bastante específica a este modelo: su estado. Podemos decir que el desarrollador del teléfono se encargó de la inmutabilidad de esta información; es poco probable que a alguien se le ocurra quitar el grabado. En el mundo Java, el estado de los objetos futuros se describe en una clase mediante campos y su comportamiento se describe mediante métodos. La capacidad de cambiar el estado y el comportamiento se lleva a cabo mediante modificadores de acceso a campos y métodos: private, protected, publicy default(acceso predeterminado). Por ejemplo, decidimos que el año de creación, el nombre del fabricante del teléfono y uno de los métodos pertenecen a la implementación interna de la clase y otros objetos del programa no pueden cambiarlos. Usando código, la clase se puede describir de la siguiente manera:
public class SomePhone {

    private int year;
    private String company;
    public SomePhone(int year, String company) {
        this.year = year;
        this.company = company;
    }
private void openConnection(){
    //findComutator
    //openNewConnection...
}
public void call() {
    openConnection();
    System.out.println("Estoy llamando a un número");
}

public void ring() {
    System.out.println("Дзынь-дзынь");
}

 }
Un modificador privatehace que los campos y métodos de una clase estén disponibles sólo dentro de esa clase. Esto significa que privateno se puede acceder a los campos desde el exterior ni privatese pueden llamar a los métodos. Ocultar el acceso a un método openConnectiontambién nos deja la oportunidad de cambiar libremente la implementación interna de este método, ya que se garantiza que este método no será utilizado por otros objetos y no interrumpirá su funcionamiento. Para trabajar con nuestro objeto, dejamos los métodos abiertos callusando ringel modificador public. Proporcionar métodos públicos para trabajar con un objeto también es parte del mecanismo de encapsulación, ya que si se deniega por completo el acceso a un objeto, éste se volverá inútil.

Herencia

Miremos nuevamente la tabla telefónica. Puedes ver que representa una jerarquía en la que el modelo ubicado debajo tiene todas las características de los modelos ubicados más arriba en la rama, más las suyas propias. Por ejemplo, un teléfono inteligente utiliza una red celular para comunicarse (tiene las propiedades de un teléfono celular), es inalámbrico y portátil (tiene las propiedades de un teléfono inalámbrico) y puede recibir y realizar llamadas (tiene las propiedades de un teléfono). En este caso, podemos hablar de herencia de propiedades de objetos. En programación, la herencia es el uso de clases existentes para definir otras nuevas. Veamos un ejemplo de creación de una clase de teléfono inteligente mediante herencia. Todos los teléfonos inalámbricos funcionan con baterías recargables, que tienen una vida útil determinada en horas. Entonces agreguemos esta propiedad a la clase de teléfonos inalámbricos:
public abstract class WirelessPhone extends AbstractPhone {

    private int hour;

    public WirelessPhone(int year, int hour) {
        super(year);
        this.hour = hour;
    }
    }
callLos teléfonos móviles heredan las propiedades de un teléfono inalámbrico, también agregamos una implementación de los métodos y a esta clase ring:
public class CellPhone extends WirelessPhone {
    public CellPhone(int year, int hour) {
        super(year, hour);
    }

    @Override
    public void call(int outputNumber) {
        System.out.println("Llamar a un número" + outputNumber);
    }

    @Override
    public void ring(int inputNumber) {
        System.out.println("Un suscriptor te está llamando" + inputNumber);
    }
}
Y, por último, la clase de teléfonos inteligentes, que, a diferencia de los teléfonos móviles clásicos, dispone de un sistema operativo completo. Puede agregar nuevos programas compatibles con este sistema operativo a su teléfono inteligente, ampliando así su funcionalidad. Usando código, la clase se puede describir de la siguiente manera:
public class Smartphone extends CellPhone {

    private String operationSystem;

    public Smartphone(int year, int hour, String operationSystem) {
        super(year, hour);
        this.operationSystem = operationSystem;
    }
public void install(String program){
    System.out.println("Instalando" + program + "Para" + operationSystem);
}

}
Como puede ver, Smartphonecreamos muy poco código nuevo para describir la clase, pero obtuvimos una nueva clase con nueva funcionalidad. El uso del principio de herencia de programación orientada a objetos puede reducir significativamente la cantidad de código y, por lo tanto, facilitar el trabajo del programador.

Polimorfismo

Si observamos todos los modelos de teléfonos, a pesar de las diferencias en la apariencia y el diseño de los modelos, podemos identificar un comportamiento común en ellos: todos pueden recibir y realizar llamadas y tienen un conjunto de botones de control bastante claro y simple. Aplicando uno de los principios básicos de la programación orientada a objetos, que ya conocemos, la abstracción en términos de programación, podemos decir que el objeto teléfono tiene una interfaz común. Por tanto, los usuarios de teléfonos pueden utilizar cómodamente diferentes modelos utilizando los mismos botones de control (mecánicos o táctiles), sin entrar en detalles técnicos del dispositivo. Por lo tanto, utiliza constantemente un teléfono móvil y puede realizar fácilmente una llamada desde su homólogo fijo. El principio en POO cuando un programa puede usar objetos con la misma interfaz sin información sobre la estructura interna del objeto se llama polimorfismo . Imaginemos que en nuestro programa necesitamos describir un usuario que puede usar cualquier modelo de teléfono para llamar a otro usuario. He aquí cómo hacerlo:
public class User {
    private String name;

    public User(String name) {
        this.name = name;
            }

    public void callAnotherUser(int number, AbstractPhone phone){
// aquí está el polimorfismo: ¡usando el teléfono de tipo abstracto AbstractPhone en el código!
        phone.call(number);
    }
}
 }
Ahora describamos los diferentes modelos de teléfono. Uno de los primeros modelos de teléfono:
public class ThomasEdisonPhone extends AbstractPhone {

public ThomasEdisonPhone(int year) {
    super(year);
}
    @Override
    public void call(int outputNumber) {
        System.out.println("Gira el mango");
        System.out.println("Dame el número de teléfono, señor");
    }

    @Override
    public void ring(int inputNumber) {
        System.out.println("Llamadas telefónicas");
    }
}
Teléfono fijo habitual:
public class Phone extends AbstractPhone {

    public Phone(int year) {
        super(year);
    }

    @Override
    public void call(int outputNumber) {
        System.out.println("Estoy llamando a un número" + outputNumber);
    }

    @Override
    public void ring(int inputNumber) {
        System.out.println("Llamadas telefónicas");
    }
}
Y finalmente, un videoteléfono genial:
public class VideoPhone extends AbstractPhone {

    public VideoPhone(int year) {
        super(year);
    }
    @Override
    public void call(int outputNumber) {
        System.out.println("Conecto un canal de video para el suscriptor" + outputNumber );
    }
    @Override
    public void ring(int inputNumber) {
        System.out.println("Tienes una videollamada entrante..." + inputNumber);
    }
  }
Creemos objetos en el método main()y probemos el método callAnotherUser:
AbstractPhone firstPhone = new ThomasEdisonPhone(1879);
AbstractPhone phone = new Phone(1984);
AbstractPhone videoPhone=new VideoPhone(2018);
User user = new User("andrey");
user.callAnotherUser(224466,firstPhone);
// Girar la perilla
// Dígame el número del suscriptor, señor
user.callAnotherUser(224466,phone);
//Número de llamada 224466
user.callAnotherUser(224466,videoPhone);
//Conecto el canal de video para el suscriptor 224466
Al llamar al mismo método en el objeto user, obtuvimos resultados diferentes. La selección de una implementación de método específica calldentro de un método callAnotherUserse realizó dinámicamente en función del tipo específico de objeto de llamada durante la ejecución del programa. Ésta es la principal ventaja del polimorfismo: la elección de la implementación durante la ejecución del programa. En los ejemplos de clases de teléfono anteriores, utilizamos la anulación de métodos, una técnica que cambia la implementación del método definida en la clase base sin cambiar la firma del método. Esto es esencialmente un reemplazo de método, y es el nuevo método definido en la subclase el que se llama cuando se ejecuta el programa. Normalmente, al anular un método, se utiliza la anotación @Override, que le indica al compilador que verifique las firmas de los métodos anulados y anulados. Como resultado , para garantizar que el estilo de su programa cumpla con el concepto de programación orientada a objetos y los principios de programación orientada a objetos java, siga estos consejos:
  • resaltar las principales características del objeto;
  • resaltar propiedades y comportamientos comunes y utilizar la herencia al crear objetos;
  • utilizar tipos abstractos para describir objetos;
  • Intente ocultar siempre los métodos y campos relacionados con la implementación interna de la clase.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION