¿Cuáles son las responsabilidades de los principales en la programación orientada a objetos?


10

Soy nuevo en la programación orientada a objetos y no entiendo cuál es el propósito de main.

Sí, leí que es el "punto de entrada" del programa, pero lo que no entiendo es ¿qué debería ser lo principal? ¿Y cuáles son sus responsabilidades?

Puede suceder que algo escrito en el main pueda encapsularse en otro objeto, pero ¿cuánto debe usar este enfoque?

Aquí está mi primer main que escribí en Java, es muy simple pero puede hacerte entender mejor mis dudas. Tengo una clase abstracta Animal que se extiende por "Cat" y "Dog". Usé el principal para crear algún objeto y también como una "interfaz" con el usuario, de hecho, como puede ver, usé algunas instrucciones condicionales para "preguntarle al usuario" qué quiere hacer.

Mi pregunta surgió del hecho de que la interfaz podría encapsularse en otro objeto y no dar esa responsabilidad al principal.

    public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    System.out.println("What type of animal do you want to create? \n dog cat");
    String type = input.nextLine();
    if ( Objects.equals(type, "dog")){
        System.out.println("Enter the animal's age: ");
        int age = input.nextInt(); // Scans the next token of the input as an int.
        System.out.println("Enter the animal's name: ");
        String name = input.next();
        Dog first = new Dog(name, age);
    }
    else if ( Objects.equals(type, "cat")) {
        System.out.println("Enter the animal's age: ");
        int age = input.nextInt(); // Scans the next token of the input as an int.
        System.out.println("Enter the animal's name: ");
        String name = input.next();
        Cat first = new Cat(name, age);
    }

    else{
        System.out.println("Error: the specified type does not exist.");
    }
    System.out.println("The number of animals is:" + numberOfAnimals);
}

2
La mainfunción no es un concepto de OOP.
Andres F.

Respuestas:


10

En primer lugar, su ejemplo no es un programa orientado a objetos. Es un programa de procedimientos que almacena datos en objetos, porque esa es la herramienta que su lenguaje (¿Java?) Proporciona para datos estructurados.

Un verdadero programa orientado a objetos consiste en objetos que interactúan entre sí: se trata de comportamiento en lugar de datos (me doy cuenta de que es una declaración controvertida, así que aquí hay un enlace donde puede ver múltiples definiciones de orientación a objetos de personas con más credenciales que yo; tenga en cuenta que el comportamiento aparece en la mayoría de ellos).

En un verdadero programa orientado a objetos, de acuerdo con la definición que uso, tienes objetos independientes que interactúan entre sí. El papel de la mainfunción es crear los objetos iniciales y unirlos.

Como un ejemplo simple, considere una aplicación web que se construye sobre una base de datos. Esta aplicación podría dividirse en objetos de muchas maneras, pero aquí hay uno de ellos: un Networkingobjeto que acepta conexiones, analiza la solicitud HTTP y se envía a un Controllerobjeto apropiado , que interactúa con un Databaseobjeto y produce la respuesta (si lo desea para asociar uno o más Viewobjetos con cada controlador, siéntase libre de hacerlo). También puede agregar un Threadpoolobjeto para proporcionar secuencias de ejecución separadas.

El papel de mainen esta aplicación podría ser:

  1. Crea el Databaseobjeto
  2. Cree todos los Controllerobjetos y asócielos con el Databaseobjeto.
  3. Cree el Networkobjeto y asocie todos los Controllerobjetos con él.
  4. Comience a Networkejecutar el objeto (lo que también podría implicar crearlo Threadpooly conectarlo a él Network).

Estos pasos de configuración podrían especificarse explícitamente maino podrían ser manejados por algún otro objeto. Por ejemplo, en una aplicación Spring típica, todo lo que hace la mainfunción es crear el contexto de la aplicación (un solo objeto). Esto desencadena la creación y el cableado de todos los objetos mencionados en la configuración para ese contexto de aplicación.


1
Vea Newspeak para ver un ejemplo de un lenguaje que toma OO tan en serio que algo como un mainmétodo ni siquiera puede existir.
Jörg W Mittag

1
Buena respuesta, pero si fuera usted, también habría mencionado la inyección de dependencia.
Arseni Mourzenko

Veo lo que quieres decir con que mi código no está orientado a objetos. No me di cuenta, pero de hecho, los objetos que creé no tienen ningún comportamiento. Para hacerlo "más OO", una idea podría ser crear otros objetos que "utilicen" los que ya tengo, sin embargo, ¿sería mejor no tener ningún objeto sin métodos?
Elia

@Elia - No, no sería mejor. Es valioso tener los datos estructurados tipificados y nombrados (en lugar de simplemente arrojarlos a Map). Pero Java solo proporciona una forma de hacerlo (frente a C ++, que diferencia entre estructuras y clases). Así que defina clases sin comportamiento, porque eso hace que su programa sea más fácil de entender, pero reconozca que hacerlo no hace que su programa esté "orientado a objetos".
kdgregory

1

Bueno, eso depende. Llévalo a dos extremos:

  1. Coloque todo el código línea por línea en su main. Eso se compilará y funcionará bien. Pero para un humano, el código no será digerible.
  2. Simplemente coloque una sola función mainy llámela doWhatNeedsToBeDoney, finalmente, continúe en esta rutina de la misma manera. Ahora tienes una muy buena mainpero, por supuesto, no obtienes lo que hay que hacer.

Entonces, la verdad está en algún punto intermedio. Intente crear una mainque se ajuste a una página, para que alguien pueda obtener cuáles son las instrucciones principales que deben realizarse. Conseguir el borde correcto es simplemente una cuestión de experiencia.

Lo anterior es una regla general y se aplica tanto a OO como a la programación funcional.


1

El método principal estático existe como una transición del mundo no orientado a objetos al mundo orientado a objetos. Se ha hecho de esta manera desde al menos C ++ en los años 80.

Los métodos estáticos son esencialmente métodos no orientados a objetos: pueden ser métodos de procedimiento; Pueden ser métodos funcionales. La noción de métodos estáticos es esencialmente un escape de OOP a otros paradigmas de programación.

Java, C # y C ++ usan el principal estático como una transición del principal tradicional de estilo C a su respectivo lenguaje de programación, desde el cual ahora puede elegir usar objetos (o no) a voluntad.

Estos lenguajes podrían haber requerido un objeto de instancia primordial en lugar de un principal estático, pero en su lugar han elegido el enfoque principal estático. Usando una alternativa de enfoque de instancia, la mainclase sería una subclase de la threadclase, y el tiempo de ejecución del lenguaje evocaría una instancia de objeto inicial de la mainclase y luego invocaría su runmétodo de instancia, de la misma manera que se lanzan / crean hilos adicionales.

Pero históricamente se ha hecho de otra manera: en parte, estos lenguajes simplemente están siguiendo su ejemplo, y en parte, porque el enhebrado no era una prioridad en aquellos días, por lo que utilizaron el enfoque estático más simple.

Además, el enfoque principal estático es "más simple", ya que no tiene que usar subclases, por lo que los programas de tutoriales triviales como hello worldson más simples en algún sentido (sin embargo, usan el relativamente inexplicable static, que es difícil de explicar a alguien cuando está tratando de enseñar primero OOP.)


-1

El método Main () se usa para ejecutar el programa

Responsabilidad: una vez que comienza a ejecutar su programa, el Método Main () llama a otros métodos para comenzar a ejecutar su programa.

Esta es una respuesta simple que me ayuda a comprender cuál es la responsabilidad del método Main ().

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.