Java: оптимизировать код - PullRequest
       2

Java: оптимизировать код

0 голосов
/ 20 января 2012

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

static int floor = 0, choice1, person = 0;

public static void main(String args[])
{

    floor = ((int) (Math.random() * 10 + 1));

    System.out.println("The elevator is now on floor " +floor);
    System.out.print("Which floor are you at now (0-10) where 0 = basement: ");
    choice1 = Keyboard.readInt();

    if(floor == choice1)
    {
        System.out.println("Enter the elevator");
    }

    else if(floor > choice1)
    {
        ElevatorDown();
    }

    else if(floor < choice1)
    {
        ElevatorUp();
    }

    System.out.println("To which floor would you want to go (0-10) where 0 = basement");
    choice1 = Keyboard.readInt();

    if(floor > choice1)
    {
        ElevatorDown();
    }

    else if(floor < choice1)
    {
        ElevatorUp();
    }

}

public static void ElevatorUp()
{
    System.out.println("The elevator is on it's way up...");

    for (person = choice1; choice1>=floor; floor++)

    System.out.println(floor);

    System.out.println("The elevator has arrived");
}

public static void ElevatorDown()
{
    System.out.println("The elevator is on it's way down...");
    for (person = choice1; choice1<=floor; floor--)

    System.out.println(floor);

    System.out.println("The elevator has arrived");
}

Ответы [ 5 ]

3 голосов
/ 20 января 2012

Попробуйте сделать свой код объектно-ориентированным .Моделируйте лифт как объект.Что может сделать лифт?Он может идти вверх и вниз, поэтому вам понадобится несколько методов для этого.Какими свойствами обладает лифт?У него есть текущий этаж, который будет переменной экземпляра.Вам также нужен конструктор для создания вашего лифта.

Убедитесь, что вы используете значимые имена переменных и правильно прокомментируйте свой код.

Вот код, который поможет вам:

public class Elevator {

    // the floor that the elevator is currently on
    private int currentFloor;

    /**
     * Creates an elevator at the specified floor.
     *
     * @param initialFloor the initial floor
     */
    public Elevator(int initialFloor) {
        this.currentFloor = initialFloor;
    }

    /**
     * @return the currentFloor
     */
    public int getCurrentFloor() {
        return currentFloor;
    }

    /**
     * Moves the elevator to the specified floor.
     *
     * @param floor the floor to go to.
     */
    public void goToFloor(int floor) {
        if (floor < currentFloor) {
            goDownToFloor(floor);
        } else if (floor > currentFloor) {
            goUpToFloor(floor);
        }
        System.out.println("The elevator has arrived");
    }

    /**
     * Moves the elevator up to the specified floor.
     *
     * @param floor the floor to go up to.
     */
    private void goUpToFloor(int floor) {
        System.out.println("The elevator is on its way up...");

        //TODO: put loop to go up to the floor here
    }

    /**
     * Moves the elevator down to the specified floor
     *
     * @param floor the floor to go down to.
     */
    private void goDownToFloor(int floor) {
        System.out.println("The elevator is on its way down...");

        //TODO: put loop to go down to the floor here        
    }
}

Теперь вам нужен метод main, который создает лифт, читает пользовательский ввод и управляет им.Вы можете создать для этого новый класс или добавить его к классу Elevator, указанному выше.

public static void main(String[] args) throws Exception {

    //create an elevator at a random floor
    Elevator elevator = new Elevator(new Random().nextInt(11));

    int elevatorFloor = elevator.getCurrentFloor();
    System.out.println("The elevator is now on floor " + elevatorFloor);

    System.out.print("Which floor are you at now? (0-10) where 0 = basement: ");
    int personFloor = Keyboard.readInt();
    if(personFloor == elevatorFloor) {
        System.out.println("Enter the elevator");
    }
    else {
        elevator.goToFloor(personFloor);
    }

    System.out.println("To which floor would you want to go (0-10) where 0 = basement");
    int destinationFloor = Keyboard.readInt();
    elevator.goToFloor(destinationFloor);
}

Сравните этот подход с текущим.Он лучше моделирует проблему с точки зрения объектов и операций, которые вы можете над ними выполнять.Также меньше дублирования кода.

2 голосов
/ 20 января 2012
  • Используйте IDE, например NetBeans или Eclipse, и позвольте ему форматировать ваш код.

  • Исправьте все предупреждения, о которых сообщает IDE.

  • Добавить JavaDoc.

  • Редактировать: Сделать ваш код частью класса.

  • Редактировать: Следовать Соглашениям об именах Java

1 голос
/ 20 января 2012
for (person = choice1; choice1>=floor; floor++)

System.out.println(floor);

Это совершенно законно, но это довольно запутанно. человек не имеет ничего общего с циклом for.

for (; floor <= choice1; floor++) {
    System.out.println(floor);
}

или

while (floor <= choice1) {
    System.out.println(floor);
    floor++;
}

Гораздо проще понять. Если человек фактически где-то используется, назначьте choice1 перед циклом, в противном случае удалите person.

Когда вы измените это и добавите улучшения, упомянутые другими людьми, ваш код будет выглядеть довольно хорошо.

1 голос
/ 20 января 2012

Поздравляю с вашей программой!

Может быть, вы хотите, чтобы ваша программа была немного более похожа на ООП.

Например, извлеките лифт в свой собственный класс и т. Д. *

1 голос
/ 20 января 2012

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

еще одна вещь, которую я бы исключил, это разделы кода, такие как:

if(floor > choice1)
{
    ElevatorDown();
}

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

Все секции вывода (System.out.println ...) могут быть извлечены в виде некоторой процедуры вывода, на мой взгляд, этобыло бы лучше

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