2013-04-24 20 views
5

Ich bin auf der Suche nach einer Testanwendung, die verschiedene Fluginformationen von einem Airline-Anbieter überprüfen kann Ich kämpfe mit dem Konzept der Klassen und Methoden und welche zu erstellen. Mein aktueller Denkprozess ist wie folgt: Die Daten werden von einer Website heruntergeladen, aufgrund der Größe der Daten möchte ich nur einmal die Daten herunterladen. Mein aktuelles Denken ist:Welche Klassen Methoden zu erstellen?

Klasse

BritishAirwaysFlightData() 

Constructor

BritishAirwaysFlightData // Used to download the BA Flight database and store in the object (Assumging his is only small i.e. 500kb) 

Methoden

getStartDate(String source_airport, String dest_airport) // Takes source and destination airport and return date when flights start 
getEndDate(String source_airport, String dest_airport) // Takes source and destination airport and return date when flights finish 
getDestAirports(String source_airport)     // Takes source airport name and returns a list of destinations 
getSourceAirports(String dest_airport)     // Takes source airport name and returns a list of sources 
getNumofDestinations()         // Returns total number of destinations 

Hoffentlich erhalten Sie die allgemeine Vorstellung von dem, was ich zu implementieren bin versucht, aber ich bin mir nicht sicher, ob es der richtige Weg ist. Ich würde im Grunde ein Objekt aus der Klasse erstellen, der Konstruktor würde dann die Daten automatisch herunterladen und in einem geeigneten Objektarray speichern.

würde ein Hauptprogramm erstellt werden, damit ein Benutzer Fluginfos usw.

Es würde diese Aufgabe effektiv Abfrage aus dem Hauptprogramm abfragen spezifische Informationen über Flüge, Termine etc.

würden es finden Wie kann ich diese Art von Funktionalität am besten implementieren? Ich möchte nicht direkt auf die Daten zugreifen und habe eine eingeschränkte Bandbreite. Implementieren Sie daher eine Art lokal gespeicherte Version.

Ich bin mehr mit dem tatsächlichen Make-up der Klasse/Konstruktor/Methoden im Gegensatz zu der tatsächlichen Funktionalität der einzelnen Methoden und Aufruf Parameter betroffen.

Hoffnung das macht Sinn, alle Hinweise sehr geschätzt werden würde und auch keine Referenzseiten mit vielen realen Welt Beispiele wie diese, die meine erste Analyse der Probleme verbessern könnten,

Danke,

+0

Ich würde eine "Entity" -Klasse erstellen, um jeden Flug darzustellen, dann eine "Service" -Klasse, um die Daten herunterzuladen und eine Liste Ihrer Flugeinheiten zurückzugeben. Dann können Sie diese lokal speichern, vielleicht mit einem ORM wie Hibernate zu einer DB oder einfach zu JSON oder XML konvertieren und die Datei lokal speichern. – CodeChimp

+1

Eine nach dem Datensatz benannte Klasse ist falsch. 'FlightData' ist eine sinnvolle Wahl. 'FlightData.Airline' ist eine sinnvolle verschachtelte Enumeration. (Natürlich ist 'BritishAirways' ein Mitglied des Enum-Sets.) 'FlightData.Source 'oder' FlightDataSource '(die Enumeration als Eingabe verwenden) ist eine sinnvolle Datenzugriffsklasse. – alphazero

+0

Sie könnten die Arbeit aufteilen. Haben Sie einen Prozess, der regelmäßig die Daten von der Website herunterlädt und sie in Ihren eigenen lokalen Datenspeicher umwandelt, dann lassen sich Ihre Client-Prozesse mit diesem lokalen Datenspeicher verbinden und von diesem lesen. Ihr Client muss sich dann nicht um das Herunterladen aus dem fremden System kümmern. Und Sie verwalten einen Cache der Daten, wenn Ihr JVM-Prozess neu gestartet wird. – Charlie

Antwort

3

Die Methoden, die Sie Umriss scheinen besser geeignet zu sein auf einen Service.

Die Idee ist folgende: Sie wollen Ihre Anliegen trennen.

Ein Problem ist die Modellierung der Daten. Das bedeutet, dass Sie einen Container für Ihre Daten mit Methoden erstellen, die für die Manipulation der Daten sinnvoll sind. Sie können eine Basisklasse FlightData und eine Unterklasse BritishAirwaysFlightData erstellen, wenn es sinnvoll ist (wenn sich die Daten nicht von Fluggesellschaft zu Fluggesellschaft ändern, dann brauchen Sie nur ein generisches Objekt). Betrachtet man die Methoden, kann es sinnvoll sein, auch eine Klasse für Airport und Flight zu haben.

Eine andere Sorge ist, Ihre Daten zu bekommen. Wahrscheinlich möchten Sie also eine Klasse, die nichts anderes tut, als mit der Quelle der Daten zu interagieren. Diese Klassen werden normalerweise als Data Access Objects (DAOs) bezeichnet.

Der Dienst ist eine weitere Klasse, die die Datenzugriffsklasse und die Datenmodellklasse zusammen verwendet, um eine Arbeitseinheit auszuführen.

Also denken Sie über die Methode getSourceAirports nach, die ich annehmen werde bedeutet "alle Flughäfen, von denen ein Flug stammt". Wenn Sie ein Datenmodell mit der Bezeichnung Flight haben, können Sie sich vorstellen, dass diese Klasse die Felder departureAirport und arrivalAirport (und andere) enthalten würde. Um die Quell-Flughäfen zu erhalten, würden Sie Ihre Datenquelle nach allen eindeutigen departureAirports abfragen, die in der Flight-Tabelle (entsprechend der Klasse Flight) gefunden werden.

2

Die Art, wie Sie vorschlagen, würde funktionieren, aber ich würde es nicht empfehlen, es skaliert schlecht. Ich stimme dem Konzept zu, die Daten einmal herunterzuladen, aber das bedeutet nicht, dass Sie kein reiches Domänenmodell implementieren können und über eine richtige mehrstufige Architektur verfügen.

Als Start würde ich vorschlagen, dass Sie eine allgemeine Klasse für Flight haben:

public class FlightData { 
    private FlightOperator operator; 
    ... 
} 

, die die Informationen auf dem Flug für einen bestimmten Operator (BA in Ihrem Beispiel) enthält. Anschließend können Sie einen Dienst und DAO Schicht erstellen, um die Bedenken der Anwendung zu trennen:

public interface FlightDataService { 
    public FlightData find(FlightOperator operartor); 
    public List<FlightData> find(List<FlightOperator> operartors); 
    ... 
} 

Hier ist eine andere Frage, die auf geschichteten Architekturen führt aus:

DAO and Service layer design

+0

I + 1'ed, weil ich dem Kommentar zum Domain-Modell zustimme. Viele Leute in der Industrie sagen jedoch, dass DAO jetzt ein Anti-Pattern ist, da es nicht viel auf den Tisch bringt. – CodeChimp

+0

Ich würde in den meisten db-basierten Anwendungen zustimmen, es wird mehr und mehr un-notwendig. Ich denke, in Situationen wie diesen ist es immer noch sehr nützlich, den Abrufmechanismus aus der Geschäftslogik zu entfernen. – StuPointerException

1

mit dem Konzept der Klassen Struggling ist ein natürlicher Teil des Lernens des objektorientierten Paradigmas. Wenn Sie wirklich auf einer Einführungsebene sind, dann würde ich mich noch nicht um ORM- oder Hibernate- oder Entity/Service-Klassen kümmern.

Um eine Roadmap der Arten von Klassen zu erstellen, die Sie erstellen möchten, denken Sie sorgfältig über Ihr Projekt nach. Zählen Sie die Art von Dingen auf, die an Ihrem Entwurf beteiligt sind, z. Flüge, Flugbetreiber, Flugzeiten. Das Entwickeln einer Liste von Dingen ist wirklich der beste und wichtigste erste Schritt im Klassen-Design, denn durch eine genaue und umfassende Liste können Sie die nützlichsten und skalierbarsten Klassen erstellen.

Sobald Sie eine Liste von Dingen haben, denken Sie sorgfältig darüber nach, wie die Dinge organisiert sind. Welche Dinge alleine stehen und welche abhängig sind, z. Flugzeiten sind abhängig von Flügen. Abhängige Dinge, z. Flugzeiten, sind in der Regel Eigenschaften oder Felder von Klassen. Unabhängige Dinge, z. Flüge, sind oft Klassen. Die Entwicklung der Beziehungen zwischen den Dingen in Ihrem Projekt ist ein wirklich wichtiger Schritt im Klassen-Design. Wenn Sie es richtig machen, wird es für Sie viel einfacher.

Wie Sie gesehen haben, sind die Substantive in Ihrem Projekt (Dinge) Klassen und Klassenfelder oder Eigenschaften. Dann stell dir vor, was dein Projekt machen soll. Die Verben, z. createScheduleList, sind Ihre Methoden und sie werden in die Klassen geschrieben, auf denen sie arbeiten (oder als statische Methoden geschrieben sind, wenn sie nicht von den Feldern oder Eigenschaften einer bestimmten Sache (oder eines Objekts) abhängen).

Dies ist sehr noobish Rat, um sicher zu sein, aber ich kann nicht stark genug betonen, wie wichtig es ist, mit einer guten Grundlage des Klassenentwurfs zu beginnen. Gute, gut organisierte Klassen machen die Umsetzung Ihres gesamten Projekts viel einfacher.

Verwandte Themen