web-dev-qa-db-fra.com

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

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

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 dans la principale? Et quelles sont ses responsabilités?

Il peut arriver que quelque chose écrit dans la principale puisse être encapsulé dans un autre objet, mais combien devriez-vous utiliser cette approche?

Voici ma première principale que j'ai écrite en Java, c'est très simple, mais cela peut vous faire comprendre mon doute mieux. J'ai un animal de classe abstrait qui est prolongé par "chat" et "chien". J'ai utilisé le principal pour créer un objet et aussi comme une "interface" avec l'utilisateur, comme vous pouvez le constater, j'ai utilisé une instruction conditionnelle pour "demander à l'utilisateur" ce qu'il veut faire.

Ma question se pose du fait que l'interface pourrait être encapsulée dans un autre objet et ne pas donner cette responsabilité à la principale.

    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);
}
10
Elia

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

Un vrai programme orienté objet consiste en des objets qui interagissent entre eux - c'est environ comportement plutôt que Data (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 objet d'objet à partir de personnes avec plus de références que moi; Notez que le comportement apparaît dans la plupart d'entre eux).

Dans un véritable 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 fonction main est de créer les objets initiaux et de les câbler ensemble.

À titre d'exemple simple, envisagez une application Web qui est construite sur une base de données. Cette application pourrait être divisée en objets de plusieurs manières, mais voici l'un d'entre eux: un objet Networking qui accepte les connexions, analyse la requête HTTP et les dépêches à un objet Controller approprié, qui interagit avec Un objet Database et produit la réponse (si vous souhaitez associer un ou plusieurs objets View avec chaque contrôleur, n'hésitez pas à le faire). Vous pouvez également ajouter un objet Threadpool pour fournir des flux d'exécution séparés.

Le rôle de main dans cette application pourrait être de:

  1. Créer l'objet Database
  2. Créez tous les objets Controller et associez-les à l'objet Database
  3. Créez l'objet Network et associez tous les objets Controller avec celui-ci.
  4. Démarrez l'objet Network en cours d'exécution (qui pourrait également impliquer la création de la Threadpool et le câblant dans le Network).

Ces étapes de configuration pourraient être explicitement spécifiées dans main ou pourraient être traitées par un autre objet. Par exemple, dans une application de ressort typique, tout ce que la fonction main est crée 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.

10
kdgregory

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

  1. Placez toutes les lignes de code par ligne dans votre main. Cela compilera et courira bien. Mais pour un humain, le code ne sera pas digestible.
  2. Il suffit de placer une seule fonction dans main et appelez-le doWhatNeedsToBeDone et continuez de continuer dans cette routine de la même manière. Maintenant, vous avez un très soigné main mais bien sûr, vous n'obtenez pas ce qui doit être fait.

Donc, la vérité est quelque part entre les deux. Essayez de créer un main qui correspond à une page, alors que quelqu'un puisse obtenir ce que les principales instructions doivent être effectuées. Obtenir la frontière droite est simplement une question d'expérience.

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

1
qwerty_so

La méthode principale statique existe comme une 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 des méthodes essentiellement non orientées objet: elles peuvent être des méthodes de procédure; Ils peuvent être des méthodes fonctionnelles. La notion de méthodes statiques est essentiellement une évasion de OOP à d'autres paradigmes de programmation.

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

Ces langues auraient besoin d'un objet d'instance primordial au lieu d'une principale statique, mais ont choisi l'approche principale statique. Utilisation d'une alternative d'approche d'instance, la classe main serait une sous-classe de la classe thread, et l'exécution de la langue susciterait une instance d'objet initiale de la classe main puis invoquerait son run méthode d'instance, tant la manière dont les threads supplémentaires sont lancés/créés.

Mais il a toujours été fait dans l'autre sens à la place: en partie, ces langues sont simplement en costume et, en partie, parce que le filetage n'était pas une priorité à ces jours, ils ont donc utilisé l'approche statique plus simple.

En outre, l'approche principale statique est "plus simple" en ce que vous n'avez pas à utiliser le sous-classement, donc des programmes de tutoriels triviaux comme hello world Sont plus simples en quelque sorte (mais ils utilisent encore le relativement inexplicable static, qui est difficile à expliquer à quelqu'un lorsque vous essayez de d'abord enseigner OOP.)

1
Erik Eidt