• ,

task29.task2909 Рефакторинг (12) (Решена)

Всем здравствуйте. Просто беда с задачей, уже мозги сломал. может кто сможет помочь:

Рефакторинг (12)

12.1. Объединение условных операторов.

12.1.1. Добавь внутренний метод, сообщающий, могут ли быть перевезены пассажиры

boolean canPassengersBeTransferred() в класс Car. Метод должен возвращать true, если

водитель доступен isDriverAvailable и есть топливо fuel.

12.1.2. Перепиши метод getNumberOfPassengersCanBeTransferred(), объединив условные

операторы (используй метод canPassengersBeTransferred()).

12.2. Объединение дублирующихся фрагментов в условных операторах. Перепиши метод

startMoving(), чтобы в нем не было повторяющихся вызовов функций.

12.3. Замена магического числа символьной константой. Замени магические числа в методе

getMaxSpeed() на константные переменные метода: MAX_TRUCK_SPEED,

MAX_SEDAN_SPEED и MAX_CABRIOLET_SPEED.

12.4. Замена условного оператора полиморфизмом.

12.4.1. Переопредели метод getMaxSpeed() в подклассах, избавившись от условного оператора.

12.4.2. Метод getMaxSpeed() в классе Car сделай абстрактным.

public abstract class Car {
    static public final int TRUCK = 0;
    static public final int SEDAN = 1;
    static public final int CABRIOLET = 2;

    double fuel;

    public double summerFuelConsumption;
    public double winterFuelConsumption;
    public double winterWarmingUp;

    private int type;

    private boolean driverAvailable;
    private int numberOfPassengers;

    protected Car(int type, int numberOfPassengers) {
        this.type = type;
        this.numberOfPassengers = numberOfPassengers;
    }

    public static Car create(int type, int numberOfPassengers){
        switch (type){
            case TRUCK:
                return new Truck(numberOfPassengers);
            case SEDAN:
                return new Sedan(numberOfPassengers);
            default:
                return new Cabriolet(numberOfPassengers);
        }
    }

    public void fill(double numberOfLiters) throws Exception{
        if (numberOfLiters < 0) {
            throw new Exception();
        }
        fuel += numberOfLiters;
    }

    public boolean isSummer(Date date , Date summerStart, Date summerEnd){
        return !(date.before(summerStart) || date.after(summerEnd));
    }

    public double getWinterConsumption(int length){
        return length * winterFuelConsumption + winterWarmingUp;
    }

    public double getSummerConsumption(int length){
        return length * summerFuelConsumption;
    }

    private boolean canPassengersBeTransferred(){
        return isDriverAvailable() && fuel > 0;
    }

    public double getTripConsumption(Date date, int length, Date SummerStart, Date SummerEnd) {
        if (!isSummer(date, SummerStart, SummerEnd)) {
            return getWinterConsumption(length);
        } else {
            return getSummerConsumption(length);
        }
    }

    public int getNumberOfPassengersCanBeTransferred() {
        if (!canPassengersBeTransferred())
            return 0;

        return numberOfPassengers;
    }

    public boolean isDriverAvailable() {
        return driverAvailable;
    }

    public void setDriverAvailable(boolean driverAvailable) {
        this.driverAvailable = driverAvailable;
    }

    public void startMoving() {
        if (numberOfPassengers > 0) {
            fastenPassengersBelts();
        }

        fastenDriverBelt();
    }

    public void fastenPassengersBelts() {
    }

    public void fastenDriverBelt() {
    }

    protected abstract int getMaxSpeed();
}


public class Truck extends Car{

    public Truck(int numberOfPassengers) {
        super(TRUCK, numberOfPassengers);
    }

    @Override
    public int getMaxSpeed() {
        final int MAX_TRUCK_SPEED = 80;
        return MAX_TRUCK_SPEED;
    }
}


public class Sedan extends Car{

    public Sedan(int numberOfPassengers) {
        super(SEDAN, numberOfPassengers);
    }

    @Override
    public int getMaxSpeed() {
        final int MAX_SEDAN_SPEED = 120;
        return MAX_SEDAN_SPEED;
    }
}


public class Cabriolet extends Car{

    public Cabriolet(int numberOfPassengers) {
        super(CABRIOLET, numberOfPassengers);
    }

    @Override
    public int getMaxSpeed() {
        final int MAX_CABRIOLET_SPEED = 90;
        return MAX_CABRIOLET_SPEED;
    }
}


Валидатор выдаёт:


Может есть идеи? Заранее благодарен.

19 комментариев

Alvisid
Беда с этой задачей. Вообще мыслей нет.
Alvisid
Подбросьте хоть какую идею, что делать. А то вообще печаль.
AlexSir
  • AlexSir
  • 0
  • Комментарий отредактирован 2017-03-15 09:59:16 пользователем AlexSir
class Truck:
1. вынеси константу из метода, помести в класс
2. с импортами возможно: используй в конструкторе Car.TRUCK, а не TRUCK
и для остальных классов тоже
Alvisid
Добрый день. К сожалению, ни то ни другое не помогает.
Alvisid
Ничего не помогает. Плиз ткните в ошибку, или хотя бы намекните. Или глюк какой-то с валидатором?
AlexSir
выложи обновленные классы
Alvisid
Доброго вечера. Класс Car без изменений. Делать переменные не статиками либо паблик результата не дали. Валидатор выдаёт по старому.

public class Truck extends Car{
    private final static int MAX_TRUCK_SPEED = 80;

    public Truck(int numberOfPassengers) {
        super(TRUCK, numberOfPassengers);
    }

    @Override
    public int getMaxSpeed() {
        return MAX_TRUCK_SPEED;
    }
}


public class Cabriolet extends Car{
    private final static int MAX_CABRIOLET_SPEED = 90;

    public Cabriolet(int numberOfPassengers) {
        super(CABRIOLET, numberOfPassengers);
    }

    @Override
    public int getMaxSpeed() {
        return MAX_CABRIOLET_SPEED;
    }
}


public class Sedan extends Car{
    private final static int MAX_SEDAN_SPEED = 120;

    public Sedan(int numberOfPassengers) {
        super(SEDAN, numberOfPassengers);
    }

    @Override
    public int getMaxSpeed() {
        return MAX_SEDAN_SPEED;
    }
}
AlexSir
private final static int MAX_SEDAN_SPEED = 80; замени на
final int MAX_SEDAN_SPEED = 80,
и у меня тоже написано
super(Car.SEDAN, numberOfPassengers)
Почему не помню, и
Добрый день. Я конечно не сильно разбираюсь в данном вопросе, но ведь классы Truck, Sedan и Cabriolet являются наследниками класса Car, а соответственно наследуют все его не приватные поля и методы. А так как они их не переопределяют, то и обращаться могут к ним напрямую, как к своим собственным. Или я не прав?
Ты прав
Alvisid
К сожалению не помогло:
package com.javarush.task.task29.task2909.car;

/**
 * 
 */
public class Truck extends Car{
    final static int MAX_TRUCK_SPEED = 80;

    public Truck(int numberOfPassengers) {
        super(TRUCK, numberOfPassengers);
    }

    @Override
    public int getMaxSpeed() {
        return MAX_TRUCK_SPEED;
    }
}


package com.javarush.task.task29.task2909.car;

/**
 *
 */
public class Cabriolet extends Car{
    final static int MAX_CABRIOLET_SPEED = 90;

    public Cabriolet(int numberOfPassengers) {
        super(CABRIOLET, numberOfPassengers);
    }

    @Override
    public int getMaxSpeed() {
        return MAX_CABRIOLET_SPEED;
    }
}


package com.javarush.task.task29.task2909.car;

/**
 *
 */
public class Sedan extends Car{
    final static int MAX_SEDAN_SPEED = 120;

    public Sedan(int numberOfPassengers) {
        super(SEDAN, numberOfPassengers);
    }

    @Override
    public int getMaxSpeed() {
        return MAX_SEDAN_SPEED;
    }
}
AlexSir
public class Sedan extends Car {
    final int MAX_SEDAN_SPEED = 120;

    public Sedan(int numberOfPassengers) {
        super(Car.SEDAN, numberOfPassengers);
    }

    @Override
    public int getMaxSpeed() {
        return MAX_SEDAN_SPEED;
    }
}
Alvisid
Спасибо за помощь. Проблема была в другом месте. Комментарий внизу.
zzzz
Валидатор просит использовать константную переменную метода.

public Sedan(int numberOfPassengers) {
    super(Car.SEDAN, numberOfPassengers);
}
@Override
public int getMaxSpeed() {
    final int MAX_SEDAN_SPEED = 120;
    return MAX_SEDAN_SPEED;
}


Обратите внимание на
Car.SEDAN
вы выкладываете код, но не выкладываете импорты, нам не видно импортите ли вы константы класса Car.
Alvisid
  • Alvisid
  • 0
  • Комментарий отредактирован 2017-03-22 09:18:23 пользователем Alvisid
Добрый день. Я конечно не сильно разбираюсь в данном вопросе, но ведь классы Truck, Sedan и Cabriolet являются наследниками класса Car, а соответственно наследуют все его не приватные поля и методы. А так как они их не переопределяют, то и обращаться могут к ним напрямую, как к своим собственным. Или я не прав?

P.S. Да и загвоздка, собственно, не в конструкторе.

P.P.S. Хотя кто его валидатор поймёт.
zzzz
  • zzzz
  • 0
  • Комментарий отредактирован 2017-03-22 12:45:12 пользователем zzzz
Или я не прав?
— прав.
Но
P.P.S. Хотя кто его валидатор поймёт.
В этом-то вся и беда. У меня прошло именно Car.SEDAN
Да и во многих задачах более быстрые/легкие решения не проходят только потому, что тесты у авторов заточены под их конкретную реализацию, а мы должны ее угадать ))
Alvisid
К сожалению и с Car.SEDAN, Car.CABRIOLET и Car.TRUCK картина не меняется.
MrArmani
все костанты скоростей должны быть в классе Car.
Alvisid
Тоже не помогаетю
Alvisid
  • Alvisid
  • 0
  • Комментарий отредактирован 2017-03-23 21:54:39 пользователем Alvisid
Всем спасибо за помощь вопрос закрыт. Загвоздка была в классе Car. В приведенном в самом начале коде надо было сделать одно изменение. Надо было у метода
<code>protected abstract int getMaxSpeed()</code>
изменить модификатор доступа на public. Не знаю это моя ошибка или причуда валидатора, но IDE не ругалась и всё было в порядке. Буду благодарен за разъяснение. И что вообще такое константная переменная метода?
TheTOXIN
ВНИМАНИЕ!!!
Если по магическим причинам не проходит задачу. Проверти кодировку и формат сепараторов во всех файлах задачи.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.