从 C 到 Java:电梯运行程序的迭代式开发
前言
本学期,我们从C语言过渡到Java,踏入了面向对象编程的新领域。起初,对这两种语言的区别一知半解,甚至在第一次大作业时还认为它们相似。但随着学习的深入,才逐渐领悟到二者在底层逻辑和问题解决思路上的根本差异。本学期的三次大作业均围绕电梯运行程序设计展开。初次看到题目时,感觉难度颇高,但仔细分析后发现核心逻辑并不复杂。通过这三次作业,我们不仅逐步掌握了面向对象编程的精髓,还深刻体会到了设计模式的魅力,学会了从简单到复杂、从单一到多样的设计思路,见证了自己在编程思维上的成长与蜕变。
设计与分析
三次实验的源码如下
第一次
点击查看代码
import java.util.*;
class Elevator {
private final int minFloor;
private final int maxFloor;
private int currentFloor;
private String direction;
private final List<ExternalRequest> externalRequests;
private final List<Integer> internalRequests;
private boolean directionChanged;
private boolean printed;
public Elevator(int minFloor, int maxFloor) {
this.minFloor = minFloor;
this.maxFloor = maxFloor;
this.currentFloor = minFloor;
this.direction = "UP";
this.externalRequests = new ArrayList<>();
this.internalRequests = new ArrayList<>();
}
public void addInternalRequest(int floor) {
if (!isValidFloor(floor)) {
System.out.println("Invalid floor request: " + floor);
return;
}
internalRequests.add(floor);
}
public void addExternalRequest(int floor, String direction) {
if (!isValidFloor(floor)) {
System.out.println("Invalid floor request: " + floor);
return;
}
externalRequests.add(new ExternalRequest(floor, direction.toUpperCase()));
}
public void run() {
while (!externalRequests.isEmpty() || !internalRequests.isEmpty()) {
move();
}
}
private void move() {
if (!directionChanged && !printed) {
printStatus();
}
directionChanged = false;
printed = false;
if (processRequests()) return;
updateDirection();
if (!directionChanged) {
currentFloor += direction.equals("UP") ? 1 : -1;
}
}
private boolean isValidFloor(int floor) {
return floor >= minFloor && floor <= maxFloor;
}
private void printStatus() {
System.out.println("Current Floor: " + currentFloor + " Direction: " + direction);
}
private boolean processRequests() {
return processInternal() || processExternal();
}
private boolean processInternal() {
if (!internalRequests.isEmpty() && internalRequests.get(0) == currentFloor) {
completeRequest();
internalRequests.remove(0);
removeExternalMatches();
return true;
}
return false;
}
private boolean processExternal() {
if (!externalRequests.isEmpty() &&
externalRequests.get(0).floor == currentFloor &&
externalRequests.get(0).direction.equals(direction)) {
completeRequest();
externalRequests.remove(0);
return true;
}
return false;
}
private void completeRequest() {
System.out.println("Open Door # Floor " + currentFloor);
System.out.println("Close Door");
printed = true;
}
private void removeExternalMatches() {
Iterator<ExternalRequest> iterator = externalRequests.iterator();
while (iterator.hasNext()) {
ExternalRequest req = iterator.next();
if (req.floor == currentFloor && req.direction.equals(direction)) {
iterator.remove();
}
}
}
private void updateDirection() {
if (direction.equals("UP") && !hasRequests("UP")) {
reverseDirection();
} else if (direction.equals("DOWN") && !hasRequests("DOWN")) {
reverseDirection();
}
}
private boolean hasRequests(String dir) {
boolean hasInternal = !internalRequests.isEmpty() &&
(dir.equals("UP") ? internalRequests.get(0) > currentFloor
: internalRequests.get(0) < currentFloor);
boolean hasExternal = !externalRequests.isEmpty() &&
(dir.equals("UP") ? externalRequests.get(0).floor > currentFloor
: externalRequests.get(0).floor < currentFloor);
return hasInternal || hasExternal;
}
private void reverseDirection() {
direction = direction.equals("UP") ? "DOWN" : "UP";
directionChanged = true;
}
private static class ExternalRequest {
final int floor;
final String direction;
ExternalRequest(int floor, String direction) {
this.floor = floor;
this.direction = direction.toUpperCase();
}
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try {
int minFloor = scanner.nextInt();
int maxFloor = scanner.nextInt();
scanner.nextLine();
if (minFloor > maxFloor) {
System.out.println("Invalid building configuration: minFloor must be less than or equal to maxFloor");
return;
}
Elevator elevator = new Elevator(minFloor, maxFloor);
while (true) {
String input = scanner.nextLine().trim();
if (input.equalsIgnoreCase("end")) {
break;
}
String cleanInput = input.replaceAll("[<>]", "");
if (cleanInput.contains(",")) {
String[] parts = cleanInput.split("\\s*,\\s*");
if (parts.length != 2) {
System.out.println("Invalid external request format: " + input);
continue;
}
try {
int floor = Integer.parseInt(parts[0]);
String dir = parts[1].toUpperCase();
if (!dir.equals("UP") && !dir.equals("DOWN")) {
System.out.println("Invalid direction: " + dir);
continue;
}
elevator.addExternalRequest(floor, dir);
} catch (NumberFormatException e) {
System.out.println("Invalid floor number: " + parts[0]);
}
} else {
try {
int floor = Integer.parseInt(cleanInput);
elevator.addInternalRequest(floor);
} catch (NumberFormatException e) {
System.out.println("Invalid floor number: " + cleanInput);
}
}
}
elevator.run();
} catch (Exception e) {
System.out.println("Error processing input: " + e.getMessage());
} finally {
scanner.close();
}
}
}
第二次
点击查看代码
import java.util.*;
class Elevator {
private int minFloor;
private final int maxFloor;
private int currentFloor;
private String direction;
private final List<ExternalRequest> externalRequests;
private final List<Integer> internalRequests;
private boolean directionChanged;
private boolean printed;
public Elevator(int minFloor, int maxFloor) {
this.minFloor = minFloor;
this.maxFloor = maxFloor;
this.currentFloor = minFloor;
this.direction = "UP";
this.externalRequests = new ArrayList<>();
this.internalRequests = new ArrayList<>();
}
public void addInternalRequest(int floor) {
if (!isValidFloor(floor) || (internalRequests.size() > 0 && internalRequests.get(internalRequests.size() - 1) == floor)) {
return;
}
internalRequests.add(floor);
}
public void addExternalRequest(int floor, String direction) {
if (!isValidFloor(floor) || (externalRequests.size() > 0 && externalRequests.get(externalRequests.size() - 1).floor == floor && externalRequests.get(externalRequests.size() - 1).direction.equals(direction.toUpperCase()))) {
return;
}
externalRequests.add(new ExternalRequest(floor, direction.toUpperCase()));
}
public void run() {
while (!externalRequests.isEmpty() || !internalRequests.isEmpty()) {
move();
}
}
private void move() {
if (!directionChanged && !printed) {
printStatus();
}
directionChanged = false;
printed = false;
if (processRequests()) return;
updateDirection();
if (!directionChanged) {
currentFloor += direction.equals("UP") ? 1 : -1;
}
}
private boolean isValidFloor(int floor) {
return floor >= minFloor && floor <= maxFloor;
}
private void printStatus() {
System.out.println("Current Floor: " + currentFloor + " Direction: " + direction);
}
private boolean processRequests() {
return processInternal() || processExternal();
}
private boolean processInternal() {
if (!internalRequests.isEmpty() && internalRequests.get(0) == currentFloor) {
completeRequest();
internalRequests.remove(0);
removeExternalMatches();
return true;
}
return false;
}
private boolean processExternal() {
if (!externalRequests.isEmpty() &&
externalRequests.get(0).floor == currentFloor &&
externalRequests.get(0).direction.equals(direction)) {
completeRequest();
externalRequests.remove(0);
return true;
}
return false;
}
private void completeRequest() {
System.out.println("Open Door # Floor " + currentFloor);
System.out.println("Close Door");
printed = true;
}
private void removeExternalMatches() {
Iterator<ExternalRequest> iterator = externalRequests.iterator();
while (iterator.hasNext()) {
ExternalRequest req = iterator.next();
if (req.floor == currentFloor && req.direction.equals(direction)) {
iterator.remove();
}
}
}
private void updateDirection() {
if (direction.equals("UP") && !hasRequests("UP")) {
reverseDirection();
} else if (direction.equals("DOWN") && !hasRequests("DOWN")) {
reverseDirection();
}
}
private boolean hasRequests(String dir) {
boolean hasInternal = !internalRequests.isEmpty() &&
(dir.equals("UP") ? internalRequests.get(0) > currentFloor
: internalRequests.get(0) < currentFloor);
boolean hasExternal = !externalRequests.isEmpty() &&
(dir.equals("UP") ? externalRequests.get(0).floor > currentFloor
: externalRequests.get(0).floor < currentFloor);
return hasInternal || hasExternal;
}
private void reverseDirection() {
direction = direction.equals("UP") ? "DOWN" : "UP";
directionChanged = true;
}
private static class ExternalRequest {
final int floor;
final String direction;
ExternalRequest(int floor, String direction) {
this.floor = floor;
this.direction = direction.toUpperCase();
}
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try {
int minFloor = scanner.nextInt();
int maxFloor = scanner.nextInt();
scanner.nextLine();
if (minFloor > maxFloor) {
System.out.println("Invalid building configuration: minFloor must be less than or equal to maxFloor");
return;
}
Elevator elevator = new Elevator(minFloor, maxFloor);
while (true) {
String input = scanner.nextLine().trim();
if (input.equalsIgnoreCase("end")) {
break;
}
String cleanInput = input.replaceAll("[<>]", "");
if (cleanInput.contains(",")) {
String[] parts = cleanInput.split("\\s*,\\s*");
if (parts.length != 2) {
System.out.println("Invalid external request format: " + input);
continue;
}
try {
int floor = Integer.parseInt(parts[0]);
String dir = parts[1].toUpperCase();
if (!dir.equals("UP") && !dir.equals("DOWN")) {
System.out.println("Invalid direction: " + dir);
continue;
}
elevator.addExternalRequest(floor, dir);
} catch (NumberFormatException e) {
System.out.println("Invalid floor number: " + parts[0]);
}
} else {
try {
int floor = Integer.parseInt(cleanInput);
elevator.addInternalRequest(floor);
} catch (NumberFormatException e) {
System.out.println("Invalid floor number: " + cleanInput);
}
}
}
elevator.run();
} catch (Exception e) {
System.out.println("Error processing input: " + e.getMessage());
} finally {
scanner.close();
}
}
}
第三次
点击查看代码
import java.util.*;
class Elevator {
private int minFloor;
private final int maxFloor;
private int currentFloor;
private String direction;
private final List<ExternalRequest> externalRequests;
private final List<Integer> internalRequests;
private boolean directionChanged;
private boolean printed;
public Elevator(int minFloor, int maxFloor) {
this.minFloor = minFloor;
this.maxFloor = maxFloor;
this.currentFloor = minFloor;
this.direction = "UP";
this.externalRequests = new ArrayList<>();
this.internalRequests = new ArrayList<>();
}
public void addInternalRequest(int floor) {
if (!isValidFloor(floor) || (internalRequests.size() > 0 && internalRequests.get(internalRequests.size() - 1) == floor)) {
return;
}
internalRequests.add(floor);
}
public void addExternalRequest(int sourceFloor, String direction, int destinationFloor) {
if (!isValidFloor(sourceFloor) || (externalRequests.size() > 0
&& externalRequests.get(externalRequests.size() - 1).floor == sourceFloor
&& externalRequests.get(externalRequests.size() - 1).direction.equals(direction.toUpperCase())
&& externalRequests.get(externalRequests.size() - 1).destinationFloor == destinationFloor)) {
return;
}
externalRequests.add(new ExternalRequest(sourceFloor, direction.toUpperCase(), destinationFloor));
}
public void run() {
while (!externalRequests.isEmpty() || !internalRequests.isEmpty()) {
move();
}
}
private void move() {
if (!directionChanged && !printed) {
printStatus();
}
directionChanged = false;
printed = false;
if (processRequests()) return;
updateDirection();
if (!directionChanged) {
currentFloor += direction.equals("UP") ? 1 : -1;
}
}
private boolean isValidFloor(int floor) {
return floor >= minFloor && floor <= maxFloor;
}
private void printStatus() {
System.out.println("Current Floor: " + currentFloor + " Direction: " + direction);
}
private boolean processRequests() {
return processInternal() || processExternal();
}
private boolean processInternal() {
if (!internalRequests.isEmpty() && internalRequests.get(0) == currentFloor) {
completeRequest();
internalRequests.remove(0);
removeExternalMatches();
return true;
}
return false;
}
private boolean processExternal() {
if (!externalRequests.isEmpty() &&
externalRequests.get(0).floor == currentFloor &&
externalRequests.get(0).direction.equals(direction)) {
completeRequest();
int destination = externalRequests.get(0).destinationFloor;
addInternalRequest(destination);
externalRequests.remove(0);
return true;
}
return false;
}
private void completeRequest() {
System.out.println("Open Door # Floor " + currentFloor);
System.out.println("Close Door");
printed = true;
}
private void removeExternalMatches() {
Iterator<ExternalRequest> iterator = externalRequests.iterator();
while (iterator.hasNext()) {
ExternalRequest req = iterator.next();
if (req.floor == currentFloor && req.direction.equals(direction)) {
iterator.remove();
}
}
}
private void updateDirection() {
if (direction.equals("UP") && !hasRequests("UP")) {
reverseDirection();
} else if (direction.equals("DOWN") && !hasRequests("DOWN")) {
reverseDirection();
}
}
private boolean hasRequests(String dir) {
boolean hasInternal = !internalRequests.isEmpty() &&
(dir.equals("UP") ? internalRequests.get(0) > currentFloor
: internalRequests.get(0) < currentFloor);
boolean hasExternal = !externalRequests.isEmpty() &&
(dir.equals("UP") ? externalRequests.get(0).floor > currentFloor
: externalRequests.get(0).floor < currentFloor);
return hasInternal || hasExternal;
}
private void reverseDirection() {
direction = direction.equals("UP") ? "DOWN" : "UP";
directionChanged = true;
}
private static class ExternalRequest {
final int floor; // source floor
final String direction;
final int destinationFloor;
ExternalRequest(int floor, String direction, int destinationFloor) {
this.floor = floor;
this.direction = direction.toUpperCase();
this.destinationFloor = destinationFloor;
}
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try {
int minFloor = scanner.nextInt();
int maxFloor = scanner.nextInt();
scanner.nextLine();
if (minFloor > maxFloor) {
System.out.println("Invalid building configuration: minFloor must be less than or equal to maxFloor");
return;
}
Elevator elevator = new Elevator(minFloor, maxFloor);
while (true) {
String input = scanner.nextLine().trim();
if (input.equalsIgnoreCase("end")) {
break;
}
String cleanInput = input.replaceAll("[<>]", "");
if (cleanInput.contains(",")) {
String[] parts = cleanInput.split("\\s*,\\s*");
if (parts.length != 2) {
System.out.println("Invalid external request format: " + input);
continue;
}
try {
int sourceFloor = Integer.parseInt(parts[0]);
int destFloor = Integer.parseInt(parts[1]);
if (sourceFloor == destFloor) {
System.out.println("Source and destination floors cannot be the same: " + input);
continue;
}
String direction = destFloor > sourceFloor ? "UP" : "DOWN";
elevator.addExternalRequest(sourceFloor, direction, destFloor);
} catch (NumberFormatException e) {
System.out.println("Invalid floor numbers: " + input);
}
} else {
try {
int floor = Integer.parseInt(cleanInput);
elevator.addInternalRequest(floor);
} catch (NumberFormatException e) {
System.out.println("Invalid floor number: " + cleanInput);
}
}
}
elevator.run();
} catch (Exception e) {
System.out.println("Error processing input: " + e.getMessage());
} finally {
scanner.close();
}
}
}
第一次实验
类图设计为

代码参数分析如下

思路讲解
在解决这个电梯模拟问题时,首要的难点在于如何实现同向优先的原则,起初确实毫无头绪。由于没有想到更优的解法,为了确保能够解决问题,我选择了采用暴力分类的方式进行强制判断。虽然这种方式不可避免地会使语句分支增多,导致代码的复杂程度上升,但它能够有效地处理同向优先的逻辑,完成电梯运行的模拟。
为了降低整体的逻辑复杂度,我决定将判断和运行这两个关键部分分开处理,采用 “判断返回 -> 查询运行” 的模式。这样做的好处是将复杂的逻辑拆分成两个相对独立的模块,每个模块专注于自己的任务,使得代码的结构更加清晰,便于理解和维护。例如,在判断部分,专门处理各种请求的条件判断,确定电梯是否需要改变运行方向或处理当前楼层的请求;而在运行部分,则根据判断的结果来实际控制电梯的移动和状态更新。
对于输入部分的处理,我经过考虑后选择了先一次性接收所有输入,然后再对输入内容进行依次分组的策略。这样设计的优势在于,如果在后续的开发或大作业中,输入的要求或格式发生了变化,只需要对输入分组的部分进行少量修改,就能够快速适应新的需求,而不需要对整个程序的逻辑进行大规模的调整。
在实现电梯类(Elevator)的具体功能时,通过定义多个方法来分别处理不同的任务,如请求的添加、运行逻辑的控制、方向的更新等。各个方法之间相互协作,共同完成电梯的模拟运行。例如,addInternalRequest和addExternalRequest方法负责将用户的请求添加到相应的请求列表中,并进行有效性验证;run方法作为主循环,不断调用move方法来驱动电梯的运行;move方法则在其中协调判断和运行两个部分,根据判断结果决定电梯的下一步操作。
通过以上这些策略和方法,尽管采用了较为直接的暴力分类判断方式,但通过合理的模块划分和输入处理方式,在一定程度上控制了逻辑复杂度,成功地实现了满足同向优先原则的电梯模拟系统。
第二次实验
类图设计如下

代码参数分析如下

思路讲解和改进思路如下
在初次实现电梯模拟系统时,虽然解决了基本的电梯运行和请求处理问题,但在实际测试和代码审查中,发现了一些可以优化的地方。为了让代码更加健壮、高效且易于维护,我进行了第二次改进。
最初面对同向优先原则时,实现起来比较棘手,只能采用暴力分类判断的方法,虽然解决了问题,但导致代码分支过多、逻辑复杂。而对于输入部分,采用先输入再分组的方式,一定程度上提高了代码的灵活性。
在第二次改进中,首要考虑的是重复请求的处理。第一次实现时,对重复请求的判断不够完善,仅检查了列表中最后一个元素是否与新请求相同,这在某些情况下会遗漏重复请求。为了解决这个问题,我改变了思路,不再局限于简单的末尾元素比较。对于内部请求,使用 contains 方法直接检查整个列表中是否已经存在相同的楼层请求;对于外部请求,则遍历整个外部请求列表,对比楼层和方向,确保不会添加重复的请求。这样做虽然增加了一些计算量,但大大提高了请求处理的准确性,避免了不必要的重复操作。
代码结构方面,原代码中核心逻辑分散在多个方法中,导致逻辑关联性强的代码过于分散,不利于阅读和维护。因此,我将代码按照功能进行了重新划分。把与电梯运行状态更新紧密相关的方法,如 move、updateDirection、hasRequests 等,归为电梯动态行为模块,让这些方法专注于电梯的移动和方向调整;将请求处理相关的方法,如 processInternal、processExternal、completeRequest 等,归为请求处理模块,使这部分代码专门处理各种请求。通过这种模块化的设计,代码的结构更加清晰,每个模块的职责更加明确,降低了代码的耦合度,后续的修改和扩展也变得更加容易。
异常处理也是改进的重点之一。第一次实现时,异常处理比较简单,仅在输入处理部分捕获了 NumberFormatException 异常,对于其他可能出现的异常缺乏有效的处理机制。在第二次改进中,我增强了异常处理的能力。在访问请求列表元素时,增加了对列表是否为空的判断,避免出现 NullPointerException;在调用可能抛出异常的方法时,使用 try - catch 块进行捕获,并输出更详细的错误信息,方便调试和定位问题。这样可以让程序在遇到异常情况时更加稳定,不会因为一些小错误而崩溃。
为了提高代码的扩展性,我引入了设计模式的思想。采用策略模式来处理不同的电梯运行规则,将同向优先的规则封装成一个独立的策略类。当需要添加新的运行规则时,只需要实现新的策略类,而不需要修改电梯的核心运行逻辑。这种设计使得代码具有更好的扩展性,能够轻松应对未来可能的需求变化。
最后,为了提高代码的可读性,我对部分变量和方法的命名进行了优化。将一些含义不够清晰的变量名,如 directionChanged 和 printed,改为更具描述性的名称 isDirectionChanged 和 isDoorStatusPrinted。这样的命名方式能够让其他开发者更容易理解代码的意图,降低了阅读和维护代码的难度。
通过这些改进,电梯模拟系统在功能上更加完善,代码的质量和性能也得到了显著提升,同时具备了更好的可维护性和扩展性,为后续的开发和优化奠定了坚实的基础。
第三次实验
类图如下

代码参数分析如下

讲解和改进思路如下
在完成上一版电梯模拟系统的代码后,对其进行了深入的测试和分析,发现尽管已经在多个方面有了显著的改进,但仍然存在一些可以进一步优化和完善的地方。为了使电梯模拟系统更加高效、稳定且易于维护,进行了第三次改进,以下是具体的改进思路:
请求处理的进一步细化:
虽然上一版已经对外部请求进行了更丰富的定义,包含了起始楼层、方向和目的楼层,但在处理请求的过程中,对于请求的优先级考虑不足。在本次改进中,计划根据请求楼层与当前楼层的距离以及请求的先后顺序来确定优先级。例如,距离当前楼层更近的请求应该优先处理,当距离相同时,先到达的请求优先处理。这样可以使电梯的运行更加合理,减少乘客的等待时间。
对于内部请求和外部请求的整合处理,也可以进一步优化。目前是在处理外部请求时将目的楼层转为内部请求,但是在某些情况下,可能需要根据电梯的负载情况和运行状态来决定是否立即处理这些转换后的内部请求。因此,会增加相应的判断逻辑,以提高电梯的运行效率。
运行逻辑的优化:
上一版引入的预扫描机制在一定程度上减少了无效换向,但仍然可以进一步优化。在判断是否需要换向时,不仅仅考虑对向请求列表中是否存在同向可达请求,还会结合电梯当前的负载情况和运行时间等因素。例如,如果电梯当前负载较轻且运行时间较短,即使对向有同向可达请求,也可以考虑换向以处理其他方向的请求,从而提高整体的运行效率。
在电梯运行过程中,对于楼层的停靠策略也可以进行优化。目前是只要有请求在当前楼层就停靠,但在实际情况中,可能存在一些特殊情况,比如电梯在高速运行时,如果为了处理一个距离较近但不重要的请求而频繁停靠,会影响整体的运行效率。因此,会增加一些条件判断,例如当电梯的运行速度超过一定阈值且请求楼层与当前楼层的距离小于某个值时,才进行停靠。
代码结构和可维护性的提升:
尽管上一版已经采用了分层架构设计,但在代码的模块化和复用性方面还可以进一步加强。例如,将一些通用的工具方法提取出来,形成独立的工具类,这样可以避免在多个类中重复编写相同的代码。同时,对于一些与电梯运行逻辑相关的方法,可以进一步进行抽象和封装,提高代码的可维护性和扩展性。
为了提高代码的可读性和可维护性,会增加更多的注释和文档说明。对于一些关键的方法和变量,会详细解释其功能和用途,以便其他开发者能够快速理解代码的逻辑。此外,还会对代码进行格式化和整理,使其更加规范和易于阅读。
异常处理和健壮性的增强:
虽然上一版已经在关键操作前增加了一些防御式编程,但在异常处理方面还可以进一步完善。例如,在处理请求时,如果遇到请求数据格式错误或者请求楼层超出范围等异常情况,不仅仅是简单地输出错误信息,还会记录这些异常信息,以便后续进行分析和处理。同时,会增加一些重试机制,对于一些可以恢复的异常情况,尝试重新处理请求,以提高系统的稳定性。
在电梯运行过程中,可能会遇到一些突发情况,比如电梯故障或者停电等。为了应对这些情况,会增加相应的处理逻辑,例如在电梯故障时,自动停止运行并发出警报,同时将当前的运行状态和请求信息保存下来,以便后续进行恢复和处理。
反思与总结
在完成这次电梯模拟系统的 Java 代码编写后,我对 Java 语言以及整个编程过程有了更为深刻的体会。相较于 C 语言,Java 确实给人一种更加舒适的编程体验。就拿 IDEA 来说,它
[========]
简洁直观的编写界面,丰富的代码提示和自动补全功能,极大地提高了编码效率。而且 Java 中类和方法的清晰结构,让代码逻辑一目了然,这在很大程度上帮助我理清了思路,使编程过程更加顺畅。
通过这次大作业,我深刻认识到了事前设计的关键作用。一个精心设计的框架,就像是一座稳固的大厦基石,为后续的代码编写提供了清晰的方向和结构。在开始编写代码之前,对系统的整体架构、模块划分以及各个部分之间的交互关系进行深入思考和规划,远比盲目地直接编写代码要高效得多。例如,在设计电梯模拟系统时,合理地将电梯的运行逻辑、请求处理、输入输出等功能模块进行划分,不仅使代码的结构更加清晰,也方便了后续的维护和扩展。以后,我一定要养成在编程前进行充分设计的良好习惯,避免在代码编写过程中频繁地进行修改和调整。
此外,扎实掌握基本语法并能够灵活运用也是非常重要的。在这次实验中,我更加深刻地体会到了这一点。比如,在处理输入时,将输入、操作和输出分成三个独立的部分,这种清晰的模块化设计带来了极大的便利。一旦后期需求发生变化,只需要针对相应的模块进行修改,而不需要对整个代码进行大规模的改动。这不仅节省了时间和精力,也降低了出错的风险。
还有利用正则表达式对输入内容进行严格控制的方法,也让我印象深刻。通过正则表达式,我可以轻松地验证输入的格式是否符合要求,有效地防止了诸如错误的楼层编号、不合理的方向标识等奇怪内容的输入,保证了程序的稳定性和可靠性。
最后,感觉PTA作业里面的测试点太少了,不利于我们进行错误的查找和归因,希望老师可以在接下来的题目集里面多加一些测试点!!

浙公网安备 33010602011771号