5

クラスとメソッドの概念と、どのクラスを作成するかで苦労している航空会社からのさまざまなフライト情報を確認できるテスト アプリケーションを作成しようとしています。私の現在の思考プロセスは次のとおりです。データは Web サイトからダウンロードされます。データのサイズが大きいため、データを 1 回だけダウンロードしたいと考えています。私の現在の考えは次のとおりです。

クラス

BritishAirwaysFlightData()

コンストラクタ

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

メソッド

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

うまくいけば、私が実装しようとしていることの一般的なアイデアが得られると思いますが、それが正しい方法かどうかはわかりません. 基本的に、クラスからオブジェクトを作成すると、コンストラクターがデータを自動ダウンロードして、何らかの適切なオブジェクト配列に格納します。

ユーザーがフライト情報などを照会できるようにするメインプログラムが作成されます。

メインプログラムからこのオブジェクトを効果的にクエリして、フライト、日付などに関する特定の情報を見つけます。

これは、データに直接アクセスしたくなく、帯域幅が制限されているため、何らかのローカルキャッシュバージョンを実装する必要があることを念頭に置いて、このタイプの機能を実装する最良の方法でしょうか?

各メソッドと呼び出しパラメーターの実際の機能とは対照的に、クラス/コンストラクター/メソッドの実際の構成にもっと関心があります。

これが理にかなっていることを願っています。ポインタは大歓迎です。また、問題の初期分析を改善できる、このような実世界の例がたくさんある参照サイトも大歓迎です。

ありがとう、

4

3 に答える 3

3

あなたが概説した方法は、サービスを利用する方により適しているようです。

アイデアはこれです:あなたはあなたの懸念を分離したいです.

懸念事項の 1 つは、データのモデル化です。つまり、データの操作に適したメソッドを使用して、データのコンテナーを作成するということです。意味がある場合は、基本クラスFlightDataとサブクラスを作成できますBritishAirwaysFlightData(データが航空会社ごとに変わらない場合は、汎用オブジェクトが必要なだけです)。Airportメソッドを見ると、 andのクラスも持つことが理にかなっているかもしれませんFlight

もう 1 つの懸念事項は、データの取得です。したがって、データのソースと対話するだけのクラスが必要になるでしょう。これらのクラスは通常、データ アクセス オブジェクト (DAO) と呼ばれます。

サービスは、データ アクセス クラスとデータ モデル クラスを一緒に使用して作業単位を実行するもう 1 つのクラスです。

メソッドについて考えてgetSourceAirportsみましょう。これは、「フライトの出発地であるすべての空港を取得する」ことを意味すると仮定します。と呼ばれるデータ モデルがある場合、このクラスにはおよびフィールド (および他のフィールド) があるとFlight想像できます。ソースの Airports を取得するには、Flight テーブル (Flight クラスに対応) で見つかったすべての一意の DepartureAirports をデータソースにクエリします。 departureAirportarrivalAirport

于 2013-04-24T13:01:37.473 に答える
2

あなたが提案している方法は機能しますが、お勧めしません。スケーリングが不十分です。データを 1 回ダウンロードするという概念には同意しますが、それは、豊富なドメイン モデルを実装できず、適切な階層型アーキテクチャを持つことができないという意味ではありません。

まず、FlightData の一般的なクラスを用意することをお勧めします。

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

特定のオペレーター(例ではBA)のフライトに関する情報が含まれています。次に、サービスと DAO レイヤーを作成して、アプリケーションの懸念を分離できます。

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

階層化されたアーキテクチャについて詳しく説明する別の質問を次に示します。

DAO とサービス層の設計

于 2013-04-24T13:03:58.807 に答える
1

クラスの概念と格闘することは、オブジェクト指向のパラダイムを学ぶ上で当然のことです。あなたが本当に入門レベルであれば、ORM、Hibernate、Entity / Service クラスについてはまだ心配しません。

作成するクラスの種類のロードマップを作成するために、プロジェクトについて慎重に検討してください。あなたのデザインに関係するものの種類を列挙してください。フライト、フライトオペレーター、フライト時間。正確で包括的なリストを取得することで、最も有用でスケーラブルなクラスを作成できるようになるため、リストを作成することは、クラス設計における最良かつ最も重要な最初のステップです。

物事のリストを作成したら、物事をどのように整理するかを慎重に検討してください。どれが独立しており、どれが依存しているか。飛行時間はフライトによって異なります。依存するもの、例えば。飛行時間は、通常、クラスのプロパティまたはフィールドです。独立したもの、例えば。フライトは、多くの場合クラスです。プロジェクト内のもの間の関係を構築することは、クラス設計において非常に重要なステップです。それを正しく行うと、物事がずっと簡単になります。

これまで見てきたように、プロジェクト (もの) の名詞は、クラスとクラス フィールドまたはプロパティです。次に、プロジェクトで何をしたいかを想像してください。動詞、例えば。createScheduleList はメソッドであり、操作対象のクラスに書き込まれます (特定のもの (またはオブジェクト) のフィールドまたはプロパティに依存しない場合は、静的メソッドとして書き込まれます)。

確かに、これは非常に初歩的なアドバイスですが、クラス設計の優れた基礎から始めることがいかに重要であるかを強調することはできません。適切に編成されたクラスは、プロジェクト全体の実装をはるかに簡単にします。

于 2013-04-24T13:19:53.200 に答える