2012-01-20 15 views
0

私はこのエレベータープログラムをかなりの期間使用していましたが、最終的にそれを完成させ、機能させました。私は自分自身を誇りに思っていますが、私は未来のために学ぶことができます。最適化することで、コードの見栄えを良くすることができます。Java:コードを最適化する

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

何を最適化しますか?速度、メモリ使用量、可読性、...? –

+0

基本的にコードの行を少なくして、よりよく見えるようにします。あなたがフォローしているなら、そのような最適化。 – Lukas

+0

2番目のif-elseステートメントで 'floor == choice1'の条件が不足していると思いますか? – dogbane

答えて

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

このアプローチを現在のものと比較してください。それはあなたがそれらで実行することができるオブジェクトと操作の面でより良い問題をモデル化します。コードの重複も少なくなります。

2
  • のNetBeansやEclipseのようなIDEを使用し、それはあなたのコードをフォーマットしてみましょう。

  • IDEが通知する警告を修正します。

  • JavaDocを追加します。

  • 編集:コードの一部をクラスにします。

  • 編集:あなたがそばにTichodromaは、あなたのコード内で例外処理を必要と言及しているすべての良い点に...あなたのコード内でたくさん行うことができますJava Naming Conventions

+0

ありがとう、しかし、それは私が現在行っていることです。 私はEclipseを使用しており、すべての警告を修正しました。 – Lukas

+1

そのようには見えません:)自己尊重IDFはあなたのコードをそのようにフォーマットしません。 –

+0

まあ、私は実際にEclipseのフォーマットを自分のコーディングにしていない、私は単にEclipseを使用しています:) – Lukas

1

に従ってください。

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

これらのセクションでは、一度だけので、その書かextracedする必要があります:私は排除する

別の事のようなDOBLEコードセクションです。ダブルコードのセクションは通常、code smellのインジケータです。

すべての出力セクションは(System.out.printlnは...)私の意見では、それはあなたのプログラムのための

1

おめでとう良いだろう、出力ルーチンの一種で展開できます、!

多分あなたはあなたのプログラムをより多くのOOPのようにしたいと思うかもしれません。例えば

は、など、それ自身のクラスにエレベーターを抽出...

+0

これを行う方法の例を教えてください。 – Lukas

+0

代わりに私はあなたに仕事をするためにいくつかのヒントを教えてください:) おっと。すでに上記の解決策があるのを見ただけです。 – dbalakirev

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

理解する方がはるかに簡単です。人が実際にどこかで使用されている場合は、ループの前にchoice1を割り当てます。それ以外の場合は人を削除します。

これを変更し、他の人が述べた改善を加えると、あなたのコードはかなり見栄えがよくなります。