Quelles sont les responsabilités du principal en programmation orientée objet?


10

Je suis nouveau dans la programmation orientée objet et je ne comprends pas quel est le but du principal.

Oui, j'ai lu que c'est le "point d'entrée" du programme mais ce que je ne comprends pas, c'est ce qui devrait être au fond? Et quelles sont ses responsabilités?

Il peut arriver qu'un élément écrit dans le principal puisse être encapsulé dans un autre objet, mais dans quelle mesure devez-vous utiliser cette approche?

Voici mon tout premier principal que j'ai écrit en Java, c'est très simple mais cela peut vous faire mieux comprendre mon doute. J'ai une classe abstraite Animal qui est complétée par "Chat" et "Chien". J'ai utilisé le principal pour créer un objet et aussi comme une "interface" avec l'utilisateur, en effet comme vous pouvez le voir, j'ai utilisé des instructions conditionnelles pour "demander à l'utilisateur" ce qu'il veut faire.

Ma question venait du fait que l'interface pouvait être encapsulée dans un autre objet et ne pas confier cette responsabilité au 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 mainfonction n'est pas un concept de POO.
Andres F.

Réponses:


10

Tout d'abord, votre exemple n'est pas un programme orienté objet. C'est un programme procédural qui arrive à stocker des données dans des objets, car c'est l'outil que votre langage (Java?) Fournit pour les données structurées.

Un vrai programme orienté objet se compose d'objets qui interagissent les uns avec les autres - il s'agit de comportement plutôt que de données (je me rends compte que c'est une déclaration controversée, alors voici un lien où vous pouvez voir plusieurs définitions de l'orientation d'objet de personnes avec plus d'informations d'identification que moi; notez que le comportement apparaît dans la plupart d’entre eux).

Dans un vrai programme orienté objet, selon la définition que j'utilise, vous avez des objets indépendants interagissant les uns avec les autres. Le rôle de la mainfonction est de créer les objets initiaux et de les câbler ensemble.

À titre d'exemple simple, considérons une application Web construite au-dessus d'une base de données. Cette application peut être divisée en objets de plusieurs façons, mais en voici une: un Networkingobjet qui accepte les connexions, analyse la demande HTTP et envoie un Controllerobjet approprié , qui interagit avec un Databaseobjet et produit la réponse (si vous le souhaitez) pour associer un ou plusieurs Viewobjets à chaque contrôleur, n'hésitez pas à le faire). Vous pouvez également ajouter un Threadpoolobjet pour fournir des flux d'exécution distincts.

Le rôle de maindans cette application pourrait être de:

  1. Créer l' Databaseobjet
  2. Créez tous les Controllerobjets et associez-les à l' Databaseobjet
  3. Créez l' Networkobjet et associez-lui tous les Controllerobjets.
  4. Démarrez l' Networkobjet en cours d'exécution (ce qui pourrait également impliquer la création Threadpoolet le câblage dans le Network).

Ces étapes de configuration peuvent être explicitement spécifiées dans mainou être gérées par un autre objet. Par exemple, dans une application Spring typique, la mainfonction ne fait que créer le contexte de l'application (un seul objet). Cela déclenche la création et le câblage de tous les objets mentionnés dans la configuration pour ce contexte d'application.


1
Voir Newspeak pour un exemple de langage qui prend OO si au sérieux que quelque chose comme une mainméthode ne peut même pas exister.
Jörg W Mittag

1
Bonne réponse, mais si j'étais vous, j'aurais aussi mentionné l'injection de dépendance.
Arseni Mourzenko

Je vois ce que vous entendez par le fait que mon code n'est pas orienté objet. Je ne l'ai pas remarqué, mais en fait, les objets que j'ai créés n'ont aucun comportement. Afin de rendre "plus OO", une idée pourrait être de créer d'autres objets qui "utilisent" ceux que j'ai déjà, mais serait-il préférable de ne pas avoir d'objet sans méthodes?
Elia

@Elia - Non, ce ne serait pas mieux. Il est utile de dactylographier et de nommer les données structurées (au lieu de simplement les vider dans a Map). Mais Java ne fournit qu'une seule façon de le faire (par rapport à C ++, qui différencie les structures et les classes). Définissez donc des classes sans comportement, car cela rend votre programme plus facile à comprendre, mais reconnaissez que cela ne rend pas votre programme "orienté objet".
kdgregory

1

En fait ça dépend. Amenez-le à deux extrêmes:

  1. Placez tout le code ligne par ligne dans votre main. Cela se compilera et fonctionnera bien. Mais pour un humain, le code ne sera pas digeste.
  2. Il suffit de placer une seule fonction mainet de l'appeler doWhatNeedsToBeDoneet de continuer éventuellement dans cette routine de la même manière. Maintenant, vous avez un très bon, mainmais bien sûr, vous n'obtenez pas ce qui doit être fait.

Donc, la vérité se situe quelque part entre les deux. Essayez de créer une mainpage qui correspond à une page, afin que quelqu'un puisse obtenir les instructions principales à exécuter. Obtenir la bonne frontière est simplement une question d'expérience.

Ce qui précède est une règle générale et s'applique à l'OO ainsi qu'à la programmation fonctionnelle.


1

La méthode principale statique existe en tant que transition du monde non orienté objet vers le monde orienté objet. Cela a été fait de cette façon depuis au moins C ++ dans les années 80.

Les méthodes statiques sont essentiellement des méthodes non orientées objet: elles peuvent être des méthodes procédurales; ce peuvent être des méthodes fonctionnelles. La notion de méthodes statiques est essentiellement une échappatoire de la POO à d'autres paradigmes de programmation.

Java, C # et C ++ utilisent tous le main statique comme une transition du principal de style C traditionnel vers leur langage de programmation respectif, à partir duquel vous pouvez maintenant choisir d'utiliser des objets (ou non) à volonté.

Ces langages auraient pu nécessiter un objet d'instance primordial au lieu d'un principal statique, mais ont plutôt choisi l'approche principale statique. En utilisant une alternative d'approche d'instance, la mainclasse serait une sous-classe de la threadclasse et le runtime de langage maininvoquerait une instance d'objet initiale de la classe, puis invoquerait sa runméthode d'instance, de la même manière que les threads supplémentaires sont lancés / créés.

Mais historiquement, cela a été fait dans l'autre sens à la place: en partie, ces langages ne font que suivre, et en partie, car le filetage n'était pas une priorité à l'époque, ils ont donc utilisé l'approche statique plus simple.

De plus, l'approche principale statique est "plus simple" dans la mesure où vous n'avez pas à utiliser de sous-classe, donc les programmes de tutoriel triviaux comme hello worldsont plus simples dans un certain sens (pourtant ils utilisent le relativement inexplicable static, qui est difficile à expliquer à quelqu'un lorsque vous êtes essayer d'abord d'enseigner la POO.)


-1

La méthode Main () est utilisée pour exécuter le programme

Responsabilité - Une fois que vous commencez à exécuter votre programme, la méthode Main () appelle d'autres méthodes pour commencer à exécuter votre programme.

Ceci est une réponse simple qui m'aide à comprendre quelle est la responsabilité de la méthode Main ().

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.