【问题标题】:Java: Optimize codeJava:优化代码
【发布时间】:2012-01-20 18:31:19
【问题描述】:

我已经在这个电梯程序上工作了很长一段时间,终于完成了它并使它工作,我为自己感到非常自豪,但我想看看如何优化我的代码,这样我就可以为未来学习。通过优化我的意思是让代码看起来更好,也许是通过使用更少的代码行。

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

【问题讨论】:

  • 优化什么?速度、内存使用量、可读性……?
  • 基本上只是为了减少代码行数,让它看起来更好更合适。如果您正在关注这种优化。
  • 不应该发到codereview.stackexchange.com吗?
  • 验证用户输入。
  • 更少的代码行并不意味着更好的代码。正确缩进你的代码,学习 Java 命名约定并遵守它们,总是在你的 if/for/while 块中使用花括号。添加 Javadoc。每行只声明一个变量。在if 之后添加一个空格。不要滥用静态方法,使用局部变量而不是全局变量。

标签: java optimization if-statement


【解决方案1】:

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

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

这里有一些代码可以帮助你:

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】:
    • 使用像 NetBeans 或 Eclipse 这样的 IDE 并让它格式化您的代码。

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

    • 添加 JavaDoc。

    • 编辑:使您的代码成为类的一部分。

    • 编辑:关注Java Naming Conventions

    【讨论】:

    • 谢谢,但这就是我现在正在做的事情。我正在使用 Eclipse,我已经修复了所有警告。
    • 看起来不像 :) 没有自尊的 IDF 会这样格式化你的代码。
    • 好吧,我并没有真正让 Eclipse 格式化我的编码,我只是在使用 Eclipse :)
    【解决方案3】:

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

    我要消除的另一件事是 doble 代码部分,例如:

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

    这些部分必须被提取,所以它只写一次。双代码段通常是code smell 的指标。

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

    【讨论】:

      【解决方案4】:

      恭喜你的节目!

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

      例如将电梯提取到它自己的类等...

      【讨论】:

      • 相反,让我给您一些提示,以便您完成工作:) 哎呀。刚刚看到上面已经有解决方案了。
      【解决方案5】:
      for (person = choice1; choice1>=floor; floor++)
      
      System.out.println(floor);
      

      这是完全合法的,但它相当混乱。 person 与 for 循环无关。

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

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

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

      当您更改此设置并添加其他人提到的改进时,您的代码会看起来相当不错。

      【讨论】:

        猜你喜欢
        • 2010-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多