Java:优化代码

时间:2012-01-20 09:35:37

标签: java optimization if-statement

我一直在研究这个电梯程序已经有一段时间了,最​​后完成它并使其工作,我为自己感到骄傲,但我想知道如何优化我的代码以便我能够学习未来。通过优化我的意思,使代码看起来更好,可能使用更少的代码行。

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 个答案:

答案 0 :(得分:3)

尝试使您的代码面向对象。将电梯建模为物体。电梯能做什么?它可以上下,所以你需要几种方法来做到这一点。电梯有哪些属性?它有一个当前楼层,它将是一个实例变量。您还需要一个构造函数来创建您的电梯。

确保使用有意义的变量名并适当地评论您的代码。

以下是一些可以帮助您的代码:

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);
}

将此方法与您当前的方法进行比较。它可以根据您可以对它们执行的对象和操作来更好地模拟问题。代码重复也较少。

答案 1 :(得分:2)

  • 使用像NetBeans或Eclipse这样的IDE,让它格式化您的代码。

  • 修复IDE告诉您的所有警告。

  • 添加JavaDoc。

  • 修改:让您的代码成为课程的一部分。

  • 修改:关注Java Naming Conventions

答案 2 :(得分:1)

你可以在你的代码中做很多...除了Tichodroma所提到的所有优点之外,你需要在代码中处理异常处理。

我要消除的另一件事是像:

这样的代码部分
if(floor > choice1)
{
    ElevatorDown();
}

这些部分必须被引用,所以它只写了一次。双重代码部分通常是code smell的指标。

所有输出部分(System.out.println ...)都可以在一种输出例程中引出,在我看来会更好

答案 3 :(得分:1)

祝贺你的计划!

也许你想让你的程序更像OOP。

例如,将Elevator提取到它自己的类等...

答案 4 :(得分:1)

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++;
}

更容易理解。如果person实际上在某个地方使用,则在循环之前指定choice1,否则删除person。

当你改变这个并添加其他人提到的改进时,你的代码看起来会很好。