Sollte die Hauptmethode nur aus Objekterstellungen und Methodenaufrufen bestehen?

12

Ein Freund von mir sagte mir, dass die beste Vorgehensweise darin besteht, dass Klassen enthaltende mainMethoden benannt werden sollten Mainund nur mainMethoden enthalten. Außerdem mainsollte die Methode nur Eingaben analysieren, andere Objekte erstellen und andere Methoden aufrufen. Die MainKlasse und die mainMethode sollten nichts anderes tun. Grundsätzlich sollte das, was eine Klasse enthält main, wie folgt aussehen:

public class Main
{
    public static void main(String[] args)
    {
        //parse inputs
        //create other objects
        //call methods
    }
}

Ist es die beste Praxis?

Benutzer
quelle
6
Was kann es noch tun?
Pubby

Antworten:

11

Der Punkt, den Ihr Freund macht, ist, dass eine Anwendung nur von der Hauptmethode gebootet werden sollte und nicht mehr. Indem Sie die Hauptmethode in einer eigenen Klasse haben, verstärken Sie diese Tatsache einfach, indem Sie sie unabhängig von jeglicher Anwendungslogik halten. Die Hauptmethode würde darin bestehen, alle Eingaben zu analysieren und die Anwendung mit diesen und möglicherweise anderen Eingaben zu initialisieren.

public static void main(String[] args){
    new Foo().start(args[0]);
}

Die Idee ist, dass Sie die Hauptmethode nicht benötigen, um zu initialisieren Foo. Auf diese Weise können Sie problemlos initialisieren und Fooin einem anderen Kontext beginnen, möglicherweise mit unterschiedlicher Semantik.

public Foo initSomewhereElse(String arg){
    Foo f = new Foo();
    f.start(arg);
    return f;
}
Jeremy Heiler
quelle
7

Die main () -Methode ist ein hässlicher Rückfall in die prozedurale Programmierung und bietet den Einstiegspunkt in die Anwendung. In verschiedenen Programmiersprachen wird versucht, es zu kapseln, aber seine Natur macht es schwierig (es muss öffentlich und statisch sein, aber es sollte NIEMALS von irgendetwas anderem im Programm aufgerufen werden, was sehr widersprüchlich ist). WPF war erfolgreich (indem es main () tief in den Eingeweiden des WPF-Anwendungsprojekts versteckte und konfigurierbare "Hooks" für die benutzerdefinierte Verarbeitung bereitstellte), ebenso wie Java (ähnlich wie bei Android-Apps), aber WinForms und die meisten anderen Arten von Mit Apps beschäftigen Sie sich immer noch mit main ().

Daher sagen die meisten Experten, dass der LOC der main () - Funktion so niedrig wie möglich sein sollte. Es gibt einen Ansatz (den ich für etwas übertrieben halte), bei dem die main () - Funktion eine Zeile hat:

public class Program
{
   private Program(string[] args)
   {
      //parse args and perform basic program setup
   }

   //Reduce the ugliness to the absolute minimum
   public static void main(string[] args)
   {
      new Program(args).Run();  
   }

   private void Run()
   {
      //kick off the driving O-O code for the app; i.e. Application.Run()
   }    
}

Das ist ein bisschen viel, aber ich stimme dem Grundprinzip zu; main () sollte so wenig wie möglich sein, um Ihre objektorientierte, ereignisgesteuerte Anwendung in einen "Bereit" -Zustand zu versetzen.

KeithS
quelle
Ich stimme dir nicht zu. Es kann nützlich sein, mainaus anderen Kontexten aufzurufen, z. B. aus der Rekursion.
DeadMG
4
Persönlich, wenn Sie Ihre Hauptmethode wiederholen, sollten Sie stattdessen eine andere Methode aufrufen und diese wiederholen. Nur in den einfachsten Kontexten (Konsolen-App mit ungefährer Komplexität / Schwierigkeit auf Hausaufgabenebene) wäre es akzeptabel, main () aus Ihrem Programm heraus aufzurufen, und ich würde das eine triviale Situation nennen.
KeithS
1

In Sprachen, in denen Funktionen unterstützt werden, mainhandelt es sich nur um eine reguläre Funktion. Sie können also nichts anderes damit tun, als das, was Sie gesagt haben. Und dann gibt es idiotische Sprachen, die Funktionen zugunsten eines Objekts aufgeben , was bedeutet, dass Sie jedes Mal, wenn Sie eine Funktion wünschen, diese in eine unnötige Klasse einschließen müssen .

Nun, genug Streifzüge. Der Punkt, den ich versuche, ist, dass Maines sich nicht wirklich um eine Klasse handelt, sondern um eine Funktion. Sie sollten also nichts anderes tun, als Eingaben zu analysieren, andere Objekte zu erstellen und andere Methoden aufzurufen, da dies alles ist, was eine Funktion tun kann.

Pubby
quelle