我一直在研究这个电梯程序已经有一段时间了,最后完成它并使其工作,我为自己感到骄傲,但我想知道如何优化我的代码以便我能够学习未来。通过优化我的意思,使代码看起来更好,可能使用更少的代码行。
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");
}
答案 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。
修改:让您的代码成为课程的一部分。
答案 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。
当你改变这个并添加其他人提到的改进时,你的代码看起来会很好。