2013-04-24 16 views
5

Szukam stworzyć aplikację testową, która może sprawdzić różne informacje o locie od operatora linii lotniczej Mam problemy z pojęciem klas i metod i które należy utworzyć. Mój obecny proces myślowy wygląda następująco: Dane są pobierane ze strony internetowej, ze względu na rozmiar danych, chcę tylko raz pobrać dane. Mój obecny myślenie jest:Które klasy Metody chcesz utworzyć?

Klasa

BritishAirwaysFlightData() 

Konstruktor

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

Metody

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 

Mam nadzieję, że masz ogólne pojęcie o tym, co staram się realizować, ale nie jestem pewien, czy to właściwa droga. Zasadniczo utworzę obiekt z klasy, konstruktor automatycznie pobierze dane i zapisze w odpowiedniej macierzy obiektów.

programu głównego będzie stworzony, aby umożliwić użytkownikowi kwerendy informacje o locie itp

Byłoby skutecznie kwerendy tego obiektu z programu głównego, aby znaleźć konkretne informacje na temat lotów, dat itp

byłoby to być najlepszym sposobem na wdrożenie tego rodzaju funkcjonalności mając na uwadze, że nie chcę mieć bezpośredniego dostępu do danych i mam ograniczoną przepustowość, więc muszę wdrożyć jakąś lokalną wersję buforowaną?

Jestem bardziej zainteresowany faktycznym składem klasy/konstruktora/metod w przeciwieństwie do rzeczywistej funkcjonalności każdej metody i parametrów wywołania.

Nadzieja to sens, wszelkie wskazówki będą mile widziane, a także wszelkie strony referencyjne z dużą ilością przykładów ze świata rzeczywistego, takich jak ten, który mógłby poprawić moją wstępną analizę problemów,

Dzięki,

+0

Utworzę klasę "Entity", która będzie reprezentować każdy lot, a następnie klasę "Service", która pobierze dane i zwróci listę twoich jednostek lotu. Następnie możesz przechowywać je lokalnie, może używając ORM jak Hibernate do DB lub po prostu konwertując do JSON lub XML i przechowując plik lokalnie. – CodeChimp

+1

Posiadanie klasy o nazwie po zbiorze danych jest niepoprawne. "FlightData" jest rozsądnym wyborem. "FlightData.Airline" to rozsądne zagnieżdżone wyliczenie. (Naturalnie "BritishAirways" jest członkiem zestawu enum.) "FlightData.Źródło "lub" FlightDataSource "(wyliczanie jako dane wejściowe) jest rozsądną klasą dostępu do danych. – alphazero

+0

Możesz podzielić pracę. Masz jeden proces, który okresowo pobiera dane ze strony internetowej i przekształca je w swój własny lokalny magazyn danych, a następnie łączy procesy klienta i odczyt z tego lokalnego magazynu danych. Twój klient nie musi się wtedy martwić o pobieranie z obcego systemu. I utrzymujesz pamięć podręczną danych po ponownym uruchomieniu procesu JVM. – Charlie

Odpowiedz

3

metod, które kontur wydaje się bardziej odpowiedni do bycia na usłudze .

Chodzi o to, że chcesz oddzielić swoje obawy.

Jedną z obaw jest modelowanie danych. Oznacza to utworzenie kontenera dla danych za pomocą metod, które mają sens w manipulowaniu danymi. Możesz utworzyć podstawową klasę FlightData i podklasę BritishAirwaysFlightData, jeśli ma to sens (jeśli dane nie zmieniają się z linii lotniczej na linię lotniczą, potrzebujesz tylko ogólnego obiektu). Patrząc na swoje metody, może być sens mieć również klasę dla Airport i Flight.

Kolejnym problemem jest uzyskiwanie danych. Prawdopodobnie potrzebujesz klasy, która nie robi nic innego, jak interakcję ze źródłem danych. Te klasy są zwykle nazywane obiektami dostępu do danych (DAO).

Usługa jest kolejną klasą, która będzie używać klasy dostępu do danych i klasy modelu danych do wykonania jednostki pracy.

Pomyśl o metodzie getSourceAirports, którą przyjmuję jako "uzyskaj wszystkie lotniska, z których rozpoczyna się lot". Jeśli masz model danych o nazwie Flight, możesz wyobrazić sobie, że ta klasa będzie miała pola departureAirport i arrivalAirport (a także inne). Aby zdobyć źródła Porty lotnicze, zapytałbyś swoje źródło danych o wszystkie unikatowe lotniska odlotów znalezione w tabeli lotów (odpowiadające klasie lotniczej).

2

Sposób, w jaki sugerujesz, działa, ale nie polecam go, skaluje się słabo. Zgadzam się z koncepcją jednorazowego pobierania danych, ale to nie znaczy, że nie można wdrożyć bogatego modelu domeny i mieć odpowiedniej warstwowej architektury.

Na początek chciałbym zaproponować, że masz ogólną klasę dla FlightData:

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

który zawiera informacje na temat lotu dla konkretnego operatora (BA w swoim przykładzie). Następnie można utworzyć usług i DAO warstwę oddzielenia obawy aplikacji:

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

Oto kolejne pytanie, które rozwija warstwowych architektur:

DAO and Service layer design

+0

I + 1'ed, ponieważ zgadzam się z komentarzem do modelu domeny. Jednak wiele osób w branży twierdzi, że DAO to teraz anty-wzór, ponieważ nie przynosi nic wielkiego. – CodeChimp

+0

Byłbym skłonny zgodzić się w większości aplikacji opartych na db, staje się coraz bardziej konieczne. Myślę, że w takich sytuacjach bardzo przydatne jest usunięcie mechanizmu pobierania z logiki biznesowej. – StuPointerException

1

zmaga się z koncepcją zajęciach naturalna część uczenia się paradygmatu zorientowanego obiektowo. Jeśli naprawdę jesteś na poziomie wprowadzającym, nie martwiłbym się jeszcze o klasy ORM, Hibernate lub Entity/Service.

Aby pomóc w opracowaniu mapy rodzajów zajęć, które chcesz utworzyć, pomyśl o projekcie. Wymień rodzaje rzeczy, które są zaangażowane w twój projekt, np. loty, operatorzy lotów, godziny lotów. Opracowanie listy rzeczy jest naprawdę najlepszym, najważniejszym pierwszym krokiem w projektowaniu klasy, ponieważ uzyskanie dokładnej i wyczerpującej listy pozwoli ci napisać najbardziej przydatne i skalowalne klasy.

Kiedy już znajdziesz listę rzeczy, zastanów się dobrze, jak zorganizowane są rzeczy. Które rzeczy są niezależne i zależne, np. czasy lotów są zależne od lotów. Zależne rzeczy, np. czasy lotów, są zazwyczaj właściwościami lub polami zajęć. Niezależne rzeczy, np. loty, są często klasami. Rozwijanie relacji między rzeczami w projekcie jest naprawdę bardzo ważnym krokiem w projektowaniu klasy. Poprawienie tego sprawia, że ​​wszystko jest o wiele łatwiejsze.

Jak widać, rzeczowniki w projekcie (rzeczy) są klasami i polami klas lub właściwościami. Następnie wyobraź sobie, co chcesz zrobić w swoim projekcie. Czasowniki, np. createScheduleList, są twoimi metodami i są zapisywane w klasach, na których działają (lub są zapisane jako metody statyczne, jeśli nie zależą od pól lub właściwości konkretnej rzeczy (lub obiektu)).

Jest to bardzo noobowa rada, ale nie mogę wystarczająco mocno podkreślić, jak ważne jest, aby rozpocząć od dobrego fundamentu projektu klasowego. Dobre, dobrze zorganizowane zajęcia sprawiają, że realizacja całego projektu jest znacznie prostsza.

Powiązane problemy