2016-07-22 24 views
2

So mache ich derzeit ein Flugzeug Reservierungssystem für ein Sommerprojekt mit Java frisch zu halten. Bei jedem Reservierungssystem benötigt es viele Klassen und Methoden. Momentan arbeite ich am Import der Flotte.Kodierung Stil und Organisation

Meine Hauptmethode ist wie die chronologische Anleitung zu meinem Programm zu handeln.

public static void main(String[] args){ 
    //start here 
    //accept passenger credentials 
    //place passenger in seat on plane 
} 

Meine Frage ist ein Formatierungsproblem. Wenn ich versuche, mein Flugzeug für meine Flotte zu "machen". Es geht ein bisschen so.

//... 
Airplane Boeing737 = new Airplane(seats[], nameOfAircraft); 

Dies wird alle Werte, die ich brauche, um mein Flugzeug zu bauen, offensichtlich gibt es mehr Variablen für den Flugzeugbauer.

Mein Gedanke ist, eine Methode in der Klasse Flugzeug zu machen, die das für mich tun wird. aber um dies zu tun, muss ich einen leeren Konstruktor für die andere Klasse (die mit meiner Hauptmethode) aufrufen, um sie zu sehen. Ich fühle mich wie eine schreckliche Form aus irgendeinem Grund. Gibt es einen besseren Weg, dies zu tun?

Ein weiterer Gedanke, wie ich poste, ist, den Konstruktor zu ändern, um keine Argumente zu akzeptieren und das alles darin zu tun. Ich habe das Gefühl, dass ich das tun sollte, aber ich bin mir nicht 100% sicher, dass das die richtige Wahl wäre. Ich denke, meine allgemeine Frage wäre, was in solchen Situationen am besten wäre.

+0

warum Sie bieten keine Setter für Sitze und nameofAircraft? – hellrocker

+2

Ich empfehle dringend, an dieser Stelle etwas über IS-A und HAS-A Tests zu lesen. Aircraft hat AirPlane, AirPlane hat Sitze oder Boeing737 ist ein AirPlane etc ... – HRgiger

+0

Ich bekomme nicht ganz Ihren vorletzten Absatz. Warum müssten Sie einen Konstruktor ohne Argumente für die Klasse bereitstellen, die 'main()' enthält? – Thomas

Antwort

4

Verwenden Erbauer, wird diese ermöglichen es Ihnen:

  • dynamische Art des Bauens Ereignisse
  • wartbaren Code (können Sie mehr params hinzufügen, wenn Sie möchten)
  • bewahren Integrität der Objekte, wenn
  • erstellt

Joshua Bloch in Effective Java Kapitel 1 Punkt 2 heißt es:

Glücklicherweise gibt es eine dritte Alternative, die die Sicherheit des teleskopischenKonstruktormusters mit der Lesbarkeit des JavaBeans-Musters kombiniert. Es ist eine Form des Builder-Musters.Anstatt das gewünschte Objekt direkt zu erstellen, ruft der Client einen Konstruktor (oder eine statische Factory) mit allen erforderlichen Parametern auf und ruft ein Builder-Objekt ab.

Ändern seinem Beispiel:

//Builder Pattern 
public class Airplane { 
    private final int[] seats; 
    private final String name; 
    private final int maxSpeed; 
    private final int maxPassengers; 

    public static class Builder { 
     // Required parameters 
     private final int[] seats; 
     private final String name; 

     // Optional parameters - initialized to default values 
     private int maxSpeed = 1000; 
     private int maxPassengers = 150; 

     public Builder(int[] seats, String name) { 
      this.seats = seats; 
      this.name = name; 
     } 

     public Builder maxSpeed(int val) { 
      maxSpeed = val; 
      return this; 
     } 

     public Builder maxPassengers(int val) { 
      maxPassengers = val; 
      return this; 
     } 

     public Airplane build() { 
      return new Airplane(this); 
     } 
    } 

    private Airplane(Builder builder) { 
     seats = builder.seats; 
     name = builder.name; 
     maxSpeed = builder.maxSpeed; 
     maxPassengers = builder.maxPassengers; 
    } 
} 

Dann können Sie verschiedene Flugzeuge erstellen

public static void main(String[] args) { 
    // only mandatory params 
    Airplane boeing747 = new Airplane.Builder(new int[] {1,0,1}, "boeing747").build(); 
    // just one param 
    Airplane boeing646 = new Airplane.Builder(new int[] {1,1,1}, "boeing646").maxPassengers(250).build(); 
    // all params 
    Airplane fighter = new Airplane.Builder(new int[] {1,0,0}, "fighter_1").maxPassengers(3).maxSpeed(1600).build(); 
} 
+0

das ist toll, also wenn ich das richtig verstehe. Die Builder-Klasse macht die Variablen aus der Klasse selbst. Zum Beispiel, vor dem Flugzeug habe ich Flight und Flightpath und ich kann das verwenden, um den gesamten Flug zu bauen, anstatt unten zu beginnen z. Passagier -> Sitz -> Flugzeug -> Flug -> Airline etc etc – gemini88mill

+1

@ gemini88mill ja sicher, einfach definieren Sie den Generator akzeptieren die Parameter, die Sie brauchen, keine Sorge, wenn es Ihre eigenen Objekte oder primitive sind. –

2

Vergessen Sie die Hauptmethode für jetzt, Sie wissen nicht, ob es ein Befehlszeilenprogramm, Desktop-App mit einer Benutzeroberfläche, Web-Service oder was ist. Sie wissen nicht, ob es eigenständig oder in einem Framework oder Anwendungsserver gehostet wird.

Ich würde vorschlagen, mit Komponententests zu beginnen und den Entwurf Ihres Domänenmodells/Geschäftslogik mit TDD zu steuern.

Sie wollen nichts wie Boeing737 so hart codiert sehen. Es wird seine Eingabe von einer anderen Quelle erhalten, z.B. eingegeben, XML-Datei, vorhandene Datenbank, irgendein anderes System.

Sie werden dann Instanzen von Flugzeug dynamisch erstellen. Sie übergeben so etwas wie ein DTO von der Benutzeroberfläche oder dem DB- oder XML-Parser an den Konstruktor. Es gibt andere Möglichkeiten, zum Beispiel Fabrikmuster nachzuschlagen, aber sie neigen dazu, IMHO überbeansprucht zu werden.

Sie scheinen auf eine Art und Weise zu starten, die mit nichts übereinstimmt, was jemand in der realen Welt tut. Es ist schwer, einen besseren Rat zu geben.

+1

Das ist super aufschlussreich danke. Die Hauptidee besteht darin, Klassen, Methoden und Taktiken besser zu verstehen, um neue und interessante Wege zu finden. Sie haben richtig die endgültige Idee für meinen Code wäre, dass das Programm Informationen von einer externen Quelle erhalten würde Es wäre sinnvoll, Flugzeugmodelle fest codiert zu haben. Ich bin super neu zu Unit-Tests, gibt es ein gutes Tutorial, auf das Sie mich verweisen können? – gemini88mill