Was sind die Verantwortlichkeiten des Hauptteils in der objektorientierten Programmierung?


10

Ich bin neu in der objektorientierten Programmierung und verstehe nicht, was der Hauptzweck ist.

Ja, ich habe gelesen, dass es der "Einstiegspunkt" des Programms ist, aber was ich nicht verstehe, ist, was in der Hauptsache sein sollte? Und was sind ihre Verantwortlichkeiten?

Es kann vorkommen, dass etwas, das in der Hauptsache geschrieben ist, in einem anderen Objekt gekapselt ist, aber wie oft sollten Sie diesen Ansatz verwenden?

Hier ist mein allererster Hauptteil, den ich in Java geschrieben habe. Es ist sehr einfach, aber es kann Sie dazu bringen, meine Zweifel besser zu verstehen. Ich habe eine abstrakte Klasse Tier, die um "Katze" und "Hund" erweitert wird. Ich habe die Hauptleitung verwendet, um ein Objekt zu erstellen und auch als "Schnittstelle" mit dem Benutzer. Wie Sie sehen, habe ich eine bedingte Anweisung verwendet, um den Benutzer zu "fragen", was er tun möchte.

Meine Frage ergab sich aus der Tatsache, dass die Schnittstelle in ein anderes Objekt eingekapselt werden konnte und diese Verantwortung nicht dem Hauptobjekt übertragen wurde.

    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
Die mainFunktion ist kein Konzept von OOP.
Andres F.

Antworten:


10

Zunächst einmal ist Ihr Beispiel kein objektorientiertes Programm. Es ist ein prozedurales Programm, das Daten in Objekten speichert, da dies das Werkzeug ist, das Ihre Sprache (Java?) Für strukturierte Daten bereitstellt.

Ein echtes objektorientiertes Programm besteht aus Objekten, die miteinander interagieren - es geht eher um Verhalten als um Daten (mir ist klar, dass dies eine kontroverse Aussage ist. Hier ist also ein Link, über den Sie mehrere Definitionen der Objektorientierung von Personen mit mehr Anmeldeinformationen sehen können als ich; beachte, dass Verhalten in den meisten von ihnen auftritt).

In einem echten objektorientierten Programm haben Sie gemäß der von mir verwendeten Definition unabhängige Objekte, die miteinander interagieren. Die mainFunktion besteht darin, die ursprünglichen Objekte zu erstellen und miteinander zu verbinden.

Stellen Sie sich als einfaches Beispiel eine Webanwendung vor, die auf einer Datenbank basiert. Diese Anwendung kann auf viele Arten in Objekte unterteilt werden. Hier ist jedoch eines davon: Ein NetworkingObjekt, das Verbindungen akzeptiert, die HTTP-Anforderung analysiert und an ein geeignetes ControllerObjekt sendet, das mit einem DatabaseObjekt interagiert und die Antwort erzeugt (wenn Sie möchten) ViewWenn Sie jedem Controller ein oder mehrere Objekte zuordnen möchten, können Sie dies tun. Sie können auch ein ThreadpoolObjekt hinzufügen , um separate Ausführungsströme bereitzustellen.

Die Rolle mainin dieser Anwendung könnte sein:

  1. Erstellen Sie das DatabaseObjekt
  2. Erstellen Sie alle ControllerObjekte und ordnen Sie sie dem DatabaseObjekt zu
  3. Erstellen Sie das NetworkObjekt und ordnen Sie alle ControllerObjekte zu.
  4. Starten Sie das Networklaufende Objekt (was auch das Erstellen Threadpoolund Verdrahten des Objekts mit dem umfassen kann Network).

Diese Einrichtungsschritte können explizit in angegeben mainoder von einem anderen Objekt ausgeführt werden. Zum Beispiel in einer typischen Feder Anwendung, alles , was die mainFunktion tut , ist der Anwendungskontext erstellen (ein einzelne Objekt). Dies löst die Erstellung und Verkabelung aller in der Konfiguration genannten Objekte für diesen Anwendungskontext aus.


1
In Newspeak finden Sie ein Beispiel für eine Sprache, die OO so ernst nimmt, dass so etwas wie eine mainMethode nicht einmal existieren kann.
Jörg W Mittag

1
Gute Antwort, aber wenn ich Sie wäre, hätte ich auch die Abhängigkeitsinjektion erwähnt.
Arseni Mourzenko

Ich verstehe, was Sie damit meinen, dass mein Code nicht objektorientiert ist. Ich habe es nicht bemerkt, aber tatsächlich haben die von mir erstellten Objekte kein Verhalten. Um es "OO" zu machen, könnte eine Idee darin bestehen, einige andere Objekte zu erstellen, die die bereits vorhandenen "verwenden". Wäre es jedoch besser, überhaupt kein Objekt ohne Methoden zu haben?
Elia

@ Elia - Nein, es wäre nicht besser. Es ist wertvoll, strukturierte Daten eingeben und benennen zu lassen (anstatt sie nur in a abzulegen Map). Java bietet jedoch nur eine Möglichkeit, dies zu tun (im Vergleich zu C ++, bei dem zwischen Strukturen und Klassen unterschieden wird). Definieren Sie also Klassen ohne Verhalten, da dies das Verständnis Ihres Programms erleichtert. Beachten Sie jedoch, dass Ihr Programm dadurch nicht "objektorientiert" wird.
kdgregory

1

Es hängt davon ab. Nehmen Sie es auf zwei Extreme:

  1. Platzieren Sie den gesamten Code zeilenweise in Ihrem main. Das wird kompiliert und läuft gut. Aber für einen Menschen ist der Code nicht verdaulich.
  2. Platzieren Sie einfach eine einzelne Funktion mainund rufen Sie sie auf doWhatNeedsToBeDoneund fahren Sie schließlich auf die gleiche Weise mit dieser Routine fort. Jetzt haben Sie eine sehr ordentliche, mainaber natürlich bekommen Sie nicht, was getan werden muss.

Die Wahrheit liegt also irgendwo dazwischen. Versuchen Sie, eine mainSeite zu erstellen , die zu einer Seite passt, damit jemand die wichtigsten Anweisungen erhält, die ausgeführt werden müssen. Die richtige Grenze zu finden ist einfach eine Frage der Erfahrung.

Das Obige ist eine allgemeine Regel und gilt sowohl für die OO- als auch für die funktionale Programmierung.


1

Die statische Hauptmethode existiert als Übergang von der nicht objektorientierten Welt zur objektorientierten Welt. Dies ist seit mindestens C ++ in den 80er Jahren so geschehen.

Statische Methoden sind im Wesentlichen nicht objektorientierte Methoden: Sie können prozedurale Methoden sein; Sie können funktionale Methoden sein. Der Begriff der statischen Methoden ist im Wesentlichen eine Flucht von OOP zu anderen Programmierparadigmen.

Java, C # und C ++ verwenden alle die statische Hauptleitung als Übergang von der traditionellen Hauptleitung im C-Stil in ihre jeweilige Programmiersprache, aus der Sie nun auswählen können, ob Sie Objekte nach Belieben verwenden möchten (oder nicht).

Diese Sprachen hätten ein primordiales Instanzobjekt anstelle eines statischen Hauptobjekts erfordern können, aber stattdessen den statischen Hauptansatz gewählt. Bei Verwendung einer Instanzansatzalternative mainwäre die Klasse eine Unterklasse der threadKlasse, und die Sprachlaufzeit würde eine anfängliche Objektinstanz der mainKlasse beschwören und dann ihre runInstanzmethode aufrufen , ähnlich wie zusätzliche Threads gestartet / erstellt werden.

Aber historisch gesehen wurde es stattdessen anders gemacht: Zum Teil folgen diese Sprachen nur dem Beispiel, und zum Teil, weil das Threading damals keine Priorität hatte und sie den einfacheren statischen Ansatz verwendeten.

Außerdem ist der statische Hauptansatz "einfacher", da Sie keine Unterklassen verwenden müssen, sodass triviale Lernprogramme wie " hello worldin gewissem Sinne einfacher" sind (sie verwenden jedoch das relativ Unerklärliche static, was für jemanden schwer zu erklären ist, wenn Sie es sind versuche zuerst OOP zu unterrichten.)


-1

Die Main () -Methode wird zum Ausführen des Programms verwendet

Verantwortung - Sobald Sie mit dem Ausführen Ihres Programms beginnen, ruft die Main () -Methode andere Methoden auf, um das Ausführen Ihres Programms zu starten.

Dies ist eine einfache Antwort, die mir hilft, die Verantwortung der Main () -Methode zu verstehen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.