Frage

Als ich anfing zu programmieren, schrieb ich alles in Main. Aber wie ich gelernt habe, versuchte ich in meinem so wenig wie möglich zu tun main() Methoden.

Aber wohin beschließen Sie, der anderen Klasse/Methode die Verantwortung zu geben, das Programm zu übernehmen? main()? Wie machst du das?

Ich habe viele Möglichkeiten gesehen, es zu tun:

class Main
{
  public static void main(String[] args)
  {
    new Main();
  }
}

Und einige mögen:

class Main {

   public static void main(String[] args) {

    GetOpt.parse(args);

    // Decide what to do based on the arguments passed
    Database.initialize();
    MyAwesomeLogicManager.initialize();
    // And main waits for all others to end or shutdown signal to kill all threads.
  }
}

Was sollte und sollte nicht in der Lage sein in main()? Oder gibt es keine silbernen Kugeln?

Danke für die Zeit!

War es hilfreich?

Lösung

Meiner Meinung nach sollte das "Haupt" eines beträchtlichen Projekts rund 3 Funktionsaufrufe enthalten:

  • Aufrufen einer Initialisierungsfunktion, die alle erforderlichen Einstellungen, Einstellungen usw. für die Anwendung festlegt.
  • Starten Sie den Haupt "Controller" der Anwendung
  • Warten auf die Beendigung des Hauptcontrollers und dann eine Beendigung, die alles aufgeräumt, was in "Haupt" gereinigt werden muss (obwohl der Controller bereits den größten Teil der Reinigung erfüllt hat).

Jede beträchtliche Anwendung wird in Funktionen der Funktionalität unterteilt, normalerweise mit einer gewissen Hierarchie. Der Hauptcontroller verfügt möglicherweise über mehrere Kindercontroller für bestimmte Funktionen.

Wenn Sie dies auf diese Weise tun, ist es viel einfacher, spezifische Funktionen zu lokalisieren, und die Trennung von Konzern ist besser.

Wie andere Antworten gesagt haben, gibt es natürlich keine Silberkugel in der Softwareentwicklung. Für ein kurzes Projekt könnte ich alles in das Main setzen, nur um die Dinge schnell auf und ab zu bringen. Ich denke, auch von der Sprache hängt - einige Optionen können einfacher sein als andere in bestimmten Sprachen.

Andere Tipps

Code in der Hauptfunktion:

  • Kann nicht einheitlich getestet werden.
  • Kann keine Abhängigkeiten durch Injektion erhalten.
  • Kann nicht von anderen Anwendungen wiederverwendet werden, ähnlich wie die erste, die Sie schreiben.

Daher Code in der Hauptfunktion:

  • Muss so einfach sein, dass Sie nur mit Funktions-/Systemtests zufrieden sind.
  • Muss dafür verantwortlich sein, den Ball zu rollen, um die Abhängigkeiten zu setzen, die von allen anderen Code verwendet werden (was bedeutet, Hauptdaten wie ein Uber-Faktor, der Ihre Anwendung erstellt).
  • Sollte nur Dinge tun, die speziell für die Art und Weise, wie Ihre App eingerichtet ist (dh nichts, welcher Testcode oder die Demo -Version genauso tun müssen).

In der Praxis bedeutet dies, dass echte Apps nicht viel in Main haben. Spielzeug-Apps und One-Shot-Programme haben möglicherweise eine Menge in den Bereichen Main, da Sie sie sowieso nicht planen, sie zu testen oder wiederzuverwenden.

Tatsächlich ist ein Teil dessen, was ich oben sage, C ++-spezifisch. Java Hauptmethoden können natürlich durch Testcode oder Varianten -Apps aufgerufen werden. Sie nehmen jedoch immer noch keine Objekte als Parameter, nur als Befehlszeilenargumente, so dass das Ausmaß, in dem sie untersucht werden können oder sich in Bezug auf die Wiederverwendung gut verhalten können, recht niedrig ist. Ich denke, Sie könnten Klassennamen übergeben, damit sie den Rest der App instanziieren und verwenden können.

Bearbeiten: Jemand hat die Tags "C ++, Java" aus dieser Frage entfernt. Also: Was ich oben sage, ist C ++ und Javaspezifisch. Andere Sprachen können Main auf eine Weise behandeln, die weniger besonders ist. In diesem Fall kann es keinen besonderen Grund für Sie geben, es speziell zu behandeln.

Was auch immer Ihr Boot schwimmt, wie sie sagen. :) Sie sollten sich wirklich darauf konzentrieren, den Code einfach, einfach zu lesen und effizient zu machen, indem Sie alle Tools verwenden, die Sie benötigen, um dies zu erreichen. Wenn es garantiert, dass es viel Code in den Main steckt - tun Sie dies. Wenn Sie das Gefühl haben, dass Objekte die Dinge organisierter machen würden, gehen Sie so.

Eine einzelne Instanz von machen class Main und dann die Instanzmethode aufrufen Main() Was die ganze Arbeit macht, ist genauso gut wie alles direkt in der Hauptmethode zu schreiben.

Ich würde sagen, dass es nicht das ist, was in Ihrer Hauptfunktion ist, sondern was nicht. Abhängig von der Komplexität Ihres Projekts möchten Sie es in funktionale Abschnitte wie "Datenbankfunktionen", "Anzeigefunktionen", "High Tea With the Vicar" usw. unterteilen.

Es geht um die Lesbarkeit von Code. Kann jemand anderes, der Ihr Programm noch nie gesehen hat, und zunächst eine gute verallgemeinerte Vorstellung davon, was es tut?

Kann dann leicht sehen, wohin man ein wenig tiefer in den Mechanismus graben soll?

Ist jeder funktionale Abschnitt, den Sie nur einen logischen Prozesseblock ausführen? Es muss nicht nur eines tun, aber es sollte nicht tun alles Plus das Spülbecken.

Brechen Sie Ihren Code so auf, dass er von einer externen Quelle aufrechterhalten kann.

Denn der Himmel weiß, wenn es genau darauf ankommt, ist es umso besser =)

Als direkte Antwort auf Ihre Frage würde ich die Funktionsaufrufe an die Hauptkomponenten in Main, das Setup, den Prozess und das Finish einsetzen, damit jeder, der es betrachtet, einen kurzen Überblick darüber erhält, wie das Programm funktioniert. Sie können dann weiter nach unten bohren, falls sie es brauchen müssen.

Schauen Sie, der Inhalt und die Form der "Haupt" -Methode sind sehr sprach- und umweltabhängig. In Java kann jede Klasse eine haben public static void main() Methode, es ist also völlig möglich, mehr als eine zu haben.

Aber jetzt überlegen wir uns darüber über das Parnas 'Gesetz der Modularisierung: "Jedes Modul verbirgt ein Geheimnis, und dieses Geheimnis kann sich ändern." Das "Geheimnis" des Moduls, das zunächst bezeichnet wird, sind die Details der Vernetzung des Prozesses mit dem Betriebssystem: Dinge wie das Erhalten der Argumente und den Umgang mit unregelmäßigen Kündigungen. In Python führt dies zu so etwas:

def main(args=None):
    #argument processing
    #construct instances of your top level objects
    #do stuff

if __name__ == "__main__":
   try:
      main(Sys.Argv)
   except: # everything
      # clean up as much as you can
   else:
      # normal cleanup, no exceptions

Der Punkt hier ist, dass Sie alles aus der Umgebung erhalten, die Sie können, und rufen Sie dann die Haupt- () -Funktion auf. Sie fangen alle unbekannten Ausnahmen und machen etwas Intelligentes mit ihnen, bevor das Programm stirbt.

Ich denke, die Hauptmethode sollte erklären, was das Programm beim Starten tut. Daher kann es initialzing -Methoden aufrufen, aber die Logik sollte in Methoden extrahiert werden.

In Ihrem Beispiel würde ich keine Main () -Methode erstellen, sondern in die ursprüngliche.

Das Design Ihres Programms entscheidet über die Form Ihres "Haupts".

Eine "Regel" zu haben, die besagt, wie Ihre Hauptfunktion sein sollte, ist - imho - einen Nicht -Sense.

Denken Sie daran, dass wenn jemand eine Vorstellung davon bekommen möchte, wie Ihr Programm funktioniert, der erste Ort, an dem er wahrscheinlich nachsehen wird (zumindest würde ich es tun). Ich denke also nicht, dass es eine gute Idee ist, so wenig wie möglich hinein zu stecken. Aber ich würde sagen, so wenig wie notwendig ist, um die Funktionsweise Ihres Programms zu sehen, wie Ihr Programm funktioniert.

Ich denke, Ihre größte Sorge bei der Implementierung einer Hauptfunktion sollte die Lesbarkeit sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top