Разогнавшись Заявку


Я ищу, чтобы получить некоторые советы о Ли или не я строю/структурирование мое заявление правильно. Программа имеет несколько ключевых компонентов:

  • Расчет штрафа основываясь на том, как быстро за предела, ехал водитель
  • Создать прекрасный адрес письмо водителю
  • Обновление файла регистрационные данные водителя и штраф

Так что, как говорится, у меня есть следующие классы:

  • DriverDetails
  • DriverManager
  • Fine
  • FineCalculator
  • FineType

Вот идея:

Когда я хочу позаниматься штрафа:

  1. FineCalculator объект создается
  2. Установлено ограничение скорости
  3. Скорость автомобиля определяется, а затем calculateFine() метод называется
  4. В calculateFine() метод будет возвращать Fine объект, который представляет собой объект данных, который содержит сумму, и строку (результат), точки, если таковые имеются, а FineType

Это одна сторона приложения.

Другая часть должна быть выполнена после того, как штраф был сгенерирован. Пользователь будет вводить водителя детали, DriverDetails объект будет создан, для пользователей, чтобы затем создать любые формы документации он будет использовать DriverManager объект, который примет DriverDetails объект, когда построен.

В FineCalculator класс:

public class FineCalculator {

    private int speedlimit;

    private int carspeed;


    public FineCalculator(int speedlimit, int carspeed) {

        this.speedlimit = speedlimit;
        this.carspeed = carspeed;
    }


    public Fine calculateFine() {

        Fine fine = new Fine();

        int milesover = carspeed - speedlimit;

        if(milesover < 1) { 

            fine.result = "The user was not going above the speed limit, no actions will be taken.";
        }

        else if(milesover < 5) {

            fine.result = "No fine issued, no points gained but a warning will be issued to the driver.";
            fine.finetype = FineType.WARNING;
        }

        else if(milesover > 4 && milesover < 10) {

            fine.result = "A fine of £50.00 will be issued to the driver. 0 points gained.";
            fine.amount = 50.00;
            fine.finetype = FineType.FIFTY;


        }

        else if(milesover > 9 && milesover < 15) {

            fine.result = "A fine of £100.00 will be issued to the driver. 0 points gained.";
            fine.amount = 100.00;
            fine.finetype = FineType.ONE_HUNDRED;

        }

        else if(milesover > 14 && milesover < 20) {

            fine.result = "A fine of £150.00 will be issued to the driver. 3 points gained.";
            fine.amount = 150.00;
            fine.points = 3;
            fine.finetype = FineType.THREE_POINTS_ONE_FITY;
        }

        else if(milesover > 19) {

            fine.result = "A fine of 1000.00 will be issued to the driver, and they will be disqualified.";
            fine.finetype = FineType.DISQUALIFIED;
        }

        return fine;

    }
}

В Fine класс:

public class Fine {

    public Double amount;
    public String result;
    public int points;
    public FineType finetype;

}

В DriverDetails класс:

public class DriverDetails {

    public String firstname, surname, address, city, postcode;
    public int drivernumber;

}

В DriverManager класс:

public class DriverManager {

    private DriverDetails driverdetails;
    private Fine fine;

    public DriverManager(DriverDetails driverdetails, Fine fine) {

        this.driverdetails = driverdetails;
        this.fine = fine;
    }

    public void generateFineLetter() {


    }

    public void updateDriverDetailsWithFine() {


    }
}

И, наконец, простое перечисление классов:

public enum FineType  {

    WARNING, FIFTY, ONE_HUNDRED, THREE_POINTS_ONE_FITY, DISQUALIFIED

}

Мое самое большое беспокойство является тот факт, что я не использую геттеры/сеттеры внутри DriverDetails и Fine данные классы. Я имею в виду, он не чувствует, как геттеры и сеттеры совершенно необходимы. Я ошибаюсь? Я знаю, что я делаю совсем против инкапсуляции, но в этом случае это плохо? Может у меня есть какие-либо советы, как улучшить или если я структурированию это не так?



336
6
задан 15 апреля 2018 в 03:04 Источник Поделиться
Комментарии
2 ответа

Это вопрос о том, сколько проект выйдет то, что описано здесь. Например, вы собираетесь упорствовать сведения о драйвере и другие данные? если вы собираетесь использовать базу данных, то вы, вероятно, хотите использовать объект-отношения-отображения (ORM), и они склонны ожидать компонентов Java для работы. возможно, вы хотите разработать веб-API, который будет отправлять или получать такие данные в формате JSON? в JSON парсеров/генераторов также предпочитают объекты, которые следуют стандарту Java фасоли.

очень простой, маленький, один-человек проекты это, вероятно, ОК, чтобы пропустить шаблонный код геттеров/сеттеров. это просто, что обычно проекты, как правило, расти и расширяться во времени.

еще один момент, который можно и нужно решать сейчас-калькулятор: это неправильно для меня, чтобы создать экземпляры всего сделать тонкого расчета. если проводить аналогию с калькулятором Windows, это как открывать новое окно каждый раз, когда вы хотите сделать новый расчет. калькулятор без гражданства: она принимает аргументы и возвращает результат. он не несет в себе никакого состояния между расчеты. Так что я хотел бы сделать calculateFine() метод статического и она принимает два аргумента.

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

Я бы сделал эти значения свойств перечислимого:

public enum FineType
{
NONE("The user was not going above the speed limit, no actions will be taken.", 0, 0),
WARNING("No fine issued, no points gained but a warning will be issued to the driver.", 0, 0),
FIFTY("A fine of £50.00 will be issued to the driver. 0 points gained.", 50.00, 0),
// and so on

private String description;
private int fine;
private int points;

FineType(String description, int fine, int points) {
this.description = description;
this.fine = fine;
this.points = points;
}

public String getDescription() { return description; }
public String getFime() { return fine; }
public String getPoints() { return p[oints; }
}

теперь вы можете иметь Fine взять тип в конструкторе и заполнить свойства сам по себе. это делает процесс калькулятор яснее:

public static Fine calculateFine(int speedlimit, int carspeed) {

int milesover = carspeed - speedlimit;

if(milesover < 1) {
return new Fine(FineType.NONE);
}
else if(milesover < 5) {
return new Fine(FineType.WARNING);
}
...

1
ответ дан 15 апреля 2018 в 07:04 Источник Поделиться

Проблема с вашим дизайном заключается в том, что у вас есть различные поля, которые в определенной степени представляют собой одно и то же свойство, что приводит к взаимозависимости государств, что делает код хрупкими и запутанными. Я говорю о классе Fine и FineType. Например, класс Fine содержит поле amount, но он также содержит поле finetypeобе организации представляют информацию о размере штрафа. Так можно создать неправильный Fine объекта путем присвоения полей amount и finetype противоречивые ценности, например amount = 50 и finetype = FineType.ONE_HUNDRED. То же самое касается количества набранных очков.

Так как Поля amount и points уже содержат всю необходимую информацию относительно мелкий размер и количество баллов, вопрос почему вы на самом деле нужно перечислимый. 3 из 5 перечислимых значений, а именно FIFTY, ONE_HUNDRED и THREE_POINTS_ONE_FITYтолько представлять информацию, которая уже хранится в Fine.amount и Fine.points, это означает, что эти значения перечисления, практически бесполезно. Поэтому возникает вопрос, что enum-это на самом деле, должны представлять. Давайте посмотрим на двух других значений WARNING и DISQUALIFIED. Дисквалификация-это дополнительные меры, которые принимаются на штраф, а предупреждение оформляется на месте штраф, так как не совсем "типа" нормально, но на самом деле не имеют ничего общего с мелким напрямую.

Так как представляешь предупреждение? Что, вероятно, зависит от того, что вы хотите сделать с предупреждением. Это любые состояния, связанные с ним, как Fine объект, который содержит размер штрафа и количество набранных очков? Если так, это может быть класс (и File и Warning может быть подклассами общий суперкласс). Но судя по коду образца, это не похоже, так что, возможно, было бы достаточно, если файл, который содержит драйвер регистрации подробности и способ хранения предупреждением, без предупреждения, будучи представлен в виде объекта, например List дат, в которые предупреждают водителя.

Аналогичным образом, дисквалификация не имеет прямого отношения к мелким, так как предупреждения, он может просто быть сохранены в файл с учетными данными водителя отдельно от штрафов.

Наконец, о поле result в классе Fine. Это не должно быть поле, потому что его содержание зависит только от других полей. Вместо этого, я хотел бы написать метод, который создает String на основе значений amount и pointsнапример, такой:

public String getMessage() {
return String.format("A fine of £%1$.2f will be issued to the driver. %2$d points gained.", amount, points);
}

В зависимости от того, что вы хотите сделать с классом, вы могли бы также рассмотреть возможность переопределения toString() для создания этого String.

0
ответ дан 15 апреля 2018 в 11:04 Источник Поделиться