Хобрук: Ваш путь к мастерству в программировании

Проектирование класса для системы бронирования поездов

Я новичок в объектно-ориентированном дизайне и все еще в процессе его изучения. Я разработал класс для системы бронирования поездов, но не знаю, как смоделировать основной класс бронирования.

Вот так выглядит мой дизайн:

public class Station {
    private int stationID;
    private String stationName;

    // Getters and Setters
}

public class Train {
    private int trainID;
    private String trainName;
    private Map<Station, Double> trainStationsWithFares;

    public Train(int ID, String trainName, Station[] stations) {
    // Initialize ID and name and create a hashmap with all stations and
    // zero fare initially for all stations.
    ....
    trainStationsWithFares = new HashMap<Station, Double>();
    for(Station s : stations) trainStationsWithFares.put(s, new Double(0.0));
    }

    // Getters and Setters (including methods to add new stations with fares and
    // update fares of existing stations
}

public class Passenger {
    private String Name;
    private int id;
    private int age;
    private static final enum { Male, Female } gender; 
}

public class TicketDetails {
    private Train t;
    private Station from;
    private Station to;
    private Passenger passenger;

    // Getters and Setters
}

public class TrainTicket {
    private int ID;
    private TicketDetails ticketDetails;
    private Double fare;

    public TrainTicket(TicketDetails ticketDetails)
        throws InvalidTrainException, InvalidFromStationException,
            InvalidToStationException {
        ...
        calculateFare();
    }

    // Calculates fare based on Train and from and to Stations and taxes, etc.
    private void calculateFare() {
        this.fare = ...
    }
}

// Assuming card payment only for online reservation system for simplicity.
// Design can be modified and enhanced suitably.
public class PaymentDetails {
    private String cardNumber;
    private String cardExpirationMonth;
    private String cardExpirationYear;
    private String cardCVV;

    // Getters and Setters
}


Мой вопрос: должен ли мой класс бронирования выглядеть так? Если да, то как методы этого класса будут получать доступ к объектам других классов, таких как TrainTicket, PaymentDetails и т. д.?

public abstract class ReservationSystem {

    // Purchase train ticket by providing ticket details and payment details.
    public abstract TrainTicket purchaseTicket(TicketDetails ticketDetails,
        PaymentDetails paymentDetails);    

    // Cancel existing train ticket by providing ticket reference and payment details
    // for cancellation charges.
    public abstract boolean cancelTicket(TrainTicket tt, PaymentDetails details);

    // Modify existing train ticket by providing existing ticket reference,new ticket
    // details and payment details for any additional charge or modify charges.
    public abstract TrainTicket modifyTicket(TrainTicket existingTicket,
        TicketDetails newTicketDetails, PaymentDetails paymentDetails) {
    }
}


Или это должно выглядеть так:

public class ReservationSystem{
    private Map<trainId, Train> trains;   
    private Ticketdetails ticketdetails;
    private PaymentDetails paymentDetails;
    private TrainTicket tt;

    public vector<Train> getTrain(TicketDetails ticketdetails);
    public TrainTicket purchaseTicket(TicketDetails ticketDetails,
        PaymentDetails paymentDetails);    
    public boolean cancelTicket(TrainTicket tt, PaymentDetails details);
    public TrainTicket modifyTicket(TrainTicket existingTicket,
        TicketDetails newTicketDetails, PaymentDetails paymentDetails);
}


Я хочу знать, как основной класс Reservation должен получать доступ к методам и членам других классов.

Заранее спасибо.

14.02.2012


Ответы:


1

В первом подходе класс ReservationSystem является абстрактным, т. е. не может быть создан, но должен быть подклассом для доступа к методам. Если у вас только один вид системы бронирования, то нет смысла создавать для него абстрактный класс. Кроме этого, я не вижу никакой разницы между двумя вариантами, которые вы указали для класса ReservationSystem.

Переходя ко второму вопросу,

Я хочу знать, как основной класс Reservation должен получать доступ к методам и членам других классов.

Классы Train, Station и TrainTicket должны предоставлять общедоступные средства доступа (геттеры и сеттеры) и методы для доступа к своим данным. Поскольку вы не указали, используете ли вы базу данных для хранения информации о бронировании (например, забронированных билетов и т. д.), вам нужно будет сохранить информацию о бронировании в самом классе ReservationSystem, т. е. должна быть структура данных, такая как Map, для хранения забронированные билеты (наиболее вероятным ключом будет Ticket.Id), отмененные билеты и так далее. Вызов bookTicket() добавит билет в Map, а cancelTicket() удалит билет из Map.

Кроме того, ReservationSystem также необходимо вести список действительных поездов и станций, связанных с каждым экземпляром. Все взаимодействие с системой осуществляется через экземпляр класса ReservationSystem.

23.02.2012

2
  • Дамп кода без объяснений не очень полезен, особенно когда речь идет о дизайне. 10.09.2017
  • Также обратите внимание, что вопрос был не о дизайне графического интерфейса. Классы GUI не должны загрязнять объекты предметной области. 10.09.2017
  • Новые материалы

    Что такое структура данных?
    Структура данных хранит и извлекает данные. Все, что обеспечивает эти две функции, является структурой данных . Период. Вы можете пропустить оставшуюся часть статьи, если ответ..

    мои январские чтения по программированию
    Эрик Эллиот Программирование приложения JavaScript Эл Свейгарт «Автоматизируйте скучные вещи с помощью Python» Прогрессивное веб-приложение Google..

    Создание ассоциаций секвелизации с помощью инструмента командной строки Sequelize
    Sequelize - популярный, простой в использовании инструмент объектно-реляционного сопоставления (ORM) JavaScript, который работает с базами данных SQL. Довольно просто начать новый проект с..

    Искусственный интеллект в юридической отрасли - пример прогнозирования судебных решений с помощью глубокого обучения
    На протяжении всей истории люди полагались на суды, присяжных, королей и королев в отправлении правосудия. Сегодня способность судов обеспечивать справедливое и быстрое правосудие для своих..

    Введение в машинное обучение для обнаружения аномалий (часть 1)
    Тщательно созданный, тщательно спроектированный ресурс для специалистов по данным. Часть 1 Главы 03 из Руководства по машинному обучению для обнаружения аномалий Внимание! Прежде чем вы..

    Начало работы с Pulumi в Digital Ocean
    Цифровой океан (ДО) — отличная альтернатива многим другим поставщикам облачных услуг. DO предоставляет простой и понятный пользовательский интерфейс, упрощающий управление инфраструктурой и..

    #Day68 из #100days_of_coding
    Вчера был мой 68-й день кодинга. я решил один вопрос Проблема: Разбить двоичную строку на подстроки с равным количеством нулей и единиц Дана двоичная строка str длины N . Задача состоит..