一、前言
本次pta單部電梯調(diào)度程序分為三次,其中后兩次作業(yè)是在前一次作業(yè)的基礎(chǔ)之上進(jìn)行迭代改進(jìn),因此,第一次作業(yè)就顯得尤為重要,且萬(wàn)事開(kāi)頭難,光是將這個(gè)題目電梯的運(yùn)行邏輯搞清楚要耗費(fèi)不少時(shí)間,而且這個(gè)電梯LOOK算法變種與日常生活中的電梯很不一樣,了解其中運(yùn)行邏輯在開(kāi)始時(shí)相當(dāng)困難,在編寫代碼時(shí)也遇見(jiàn)了許多困難,比如怎么對(duì)輸入的這串字符串進(jìn)行處理,這些數(shù)字,字母,<>怎么去進(jìn)行分割提取,為此學(xué)習(xí)了正則表達(dá)式,List等相關(guān)知識(shí),還有寫的過(guò)程中發(fā)現(xiàn)一些地方的邏輯錯(cuò)誤或者是情況考慮少了等等。而第二、三次都是添加了一些要求也就是對(duì)第一次的代碼進(jìn)行迭代并用面向?qū)ο笤O(shè)計(jì)要求去改進(jìn)完善代碼以及完善算法,處理更多特殊情況之類的。三次題目層序漸進(jìn),環(huán)環(huán)相扣,讓我邊寫邊學(xué)收獲了很多的新知識(shí)。
二、設(shè)計(jì)與分析
第一次電梯題目的設(shè)計(jì)與分析
題目要求:
設(shè)計(jì)一個(gè)電梯類,包含最大樓層數(shù)、最小樓層數(shù)(默認(rèn)為1層)當(dāng)前樓層、運(yùn)行方向、運(yùn)行狀態(tài),以及電梯內(nèi)部乘客請(qǐng)求隊(duì)列和外部請(qǐng)求隊(duì)列,其中,電梯外部請(qǐng)求隊(duì)列區(qū)分上下行。運(yùn)行規(guī)則:電梯默認(rèn)在1層,狀態(tài)靜止,有乘客發(fā)起請(qǐng)求時(shí)(各樓層電梯外部乘客按下上行或下行按鈕或內(nèi)部乘客按下想要到達(dá)的樓層數(shù)字按鈕),電梯開(kāi)始移動(dòng),當(dāng)電梯向某個(gè)方向移動(dòng)時(shí),優(yōu)先處理同方向請(qǐng)求,當(dāng)同方向請(qǐng)求均被處理完畢再處理相反方向的請(qǐng)求。電梯運(yùn)行過(guò)程中的狀態(tài)包括停止、移動(dòng)中、開(kāi)門、關(guān)門等狀態(tài)。當(dāng)電梯停止時(shí),如果有新請(qǐng)求,就根據(jù)請(qǐng)求方向或位置決定移動(dòng)方向。電梯在運(yùn)行到某一樓層時(shí),檢查當(dāng)前是否有請(qǐng)求(訪問(wèn)電梯內(nèi)請(qǐng)求隊(duì)列和電梯外請(qǐng)求隊(duì)列),然后據(jù)此決定移動(dòng)方向。每次移動(dòng)一個(gè)樓層,檢查是否有需要停靠的請(qǐng)求,如果有,則開(kāi)門,處理該樓層的請(qǐng)求,然后關(guān)門繼續(xù)移動(dòng)。還要注意處理無(wú)效請(qǐng)求情況,比如超過(guò)大樓的最高或最低樓層。
設(shè)計(jì)類圖:

其中main類使用正則表達(dá)式來(lái)正確讀取每行輸入當(dāng)中所需的數(shù)據(jù),然后按數(shù)據(jù)的形式來(lái)進(jìn)行外部或者內(nèi)部的請(qǐng)求的加入。Elevator類用來(lái)控制電梯的運(yùn)行,和方向的確定,以及打印電梯當(dāng)前所在的樓層、狀態(tài)和運(yùn)行方向。由于還不會(huì)枚舉,所以用的-1,0,1來(lái)表示電梯的方向向上,靜止還是向下。
Souce Monitor分析結(jié)果:

這一次的代碼寫的很糟糕,因?yàn)榭赡蹸語(yǔ)言的設(shè)計(jì)思維還沒(méi)有完全轉(zhuǎn)變過(guò)來(lái),再就是題目難度的忽然升高理解電梯運(yùn)行邏輯等等所花時(shí)間太多了,編寫代碼的時(shí)間就少了很多。
點(diǎn)擊查看代碼
import java.util.*;
public class Main
{
static class Elevator
{
// 1,0,-1分別表示向上靜止和向下
private int UP = 1;
private int IDLE = 0;
private int DOWN = -1;
private int minFloor;
private int maxFloor;
private int currentFloor;
private int direction; // 這個(gè)指的是當(dāng)前方向
private LinkedList<Integer> innerQueue = new LinkedList<>(); //又用LinkedList看看時(shí)間能否減少
private LinkedList<Integer> outerUpQueue = new LinkedList<>();
private LinkedList<Integer> outerDownQueue = new LinkedList<>();
public Elevator(int min, int max)
{
minFloor = min;
maxFloor = max;
currentFloor = 1; // 初始在1層
direction = IDLE;
}
// 用于添加內(nèi)部的請(qǐng)求
void addInner(int floor)
{
if (floor < minFloor || floor > maxFloor)
return;
innerQueue.add(floor);
}
// 添加外部請(qǐng)求
void addExternalQueue(int floor, String dir)
{
if (floor < minFloor || floor > maxFloor)
return;
if ("UP".equals(dir))
{
outerUpQueue.add(floor);
} else
{
outerDownQueue.add(floor);
}
}
private boolean hasRequest()
{ // 這個(gè)這個(gè)方法是說(shuō)有沒(méi)有請(qǐng)求<沒(méi)有考慮要不要開(kāi)門>
return!innerQueue.isEmpty() ||!outerUpQueue.isEmpty() ||!outerDownQueue.isEmpty();
}
// dianti的運(yùn)行
void runFloor()
{ setInitialDir();
System.out.println("Current Floor: " + currentFloor + " Direction: " + getDirName());
while (hasRequest()||direction != IDLE)
{ // 如果有請(qǐng)求的話
// 處理當(dāng)前樓層的請(qǐng)求
boolean needOpen = processFloor();
if (needOpen)
{ // 安裝需要的輸出格式輸出
System.out.println("Current Floor: " + currentFloor + " Direction: " + getDirName());
System.out.println("Open Door # Floor " + currentFloor);
System.out.println("Close Door");
} else if (direction != IDLE)
{
System.out.println("Current Floor: " + currentFloor + " Direction: " + getDirName());
}
// 判斷要不要轉(zhuǎn)變方向
if (needReverse())
{
reverseDirection();
}
setInitialDir();
moveFloor();
} // 直到?jīng)]有了請(qǐng)求
}
// 用于刪除數(shù)組第一個(gè)元素
private void deleteFirst(LinkedList<Integer> list) {
if (!list.isEmpty()) {
list.removeFirst();
}
}
// 處理當(dāng)前樓層請(qǐng)求(只檢查隊(duì)列第一個(gè)元素)
private boolean processFloor()
{
boolean open = false;
// 處理內(nèi)部隊(duì)列
if (!innerQueue.isEmpty() && innerQueue.peekFirst() == currentFloor)
{
deleteFirst(innerQueue);
open = true;
}
// 處理外部隊(duì)列(根據(jù)方向)
LinkedList<Integer> externalQueue;
if (direction == UP)
{
externalQueue = outerUpQueue;
} else
{
externalQueue = outerDownQueue;
}
if (!externalQueue.isEmpty() && externalQueue.get(0) == currentFloor)
{
if (direction == UP)
{
deleteFirst(outerUpQueue);
} else
{
deleteFirst(outerDownQueue);
}
open = true;
}
return open;
}
// 判斷是否需要轉(zhuǎn)變電梯的方向
private boolean needReverse()
{
if (direction == IDLE)
return false;
// 檢查當(dāng)前方向是否還有請(qǐng)求
boolean hasRequest = false;
if (direction == UP)
{ // 如果方向向上
if (haveQueue(innerQueue, true) || haveQueue(outerUpQueue, true))
{ // 如果有內(nèi)部向上或者外部向上的請(qǐng)求
hasRequest = true;
}
} else
{
if (haveQueue(innerQueue, false) || haveQueue(outerDownQueue, false))
{
hasRequest = true;
}
}
return!hasRequest;
}
// 檢查隊(duì)列中是否有<需要處理>的請(qǐng)求,這個(gè)方法是說(shuō)有沒(méi)有要處理的請(qǐng)求
private boolean haveQueue(LinkedList<Integer> queue, boolean isUp)
{
for (int floor : queue)
{ // forEach循環(huán)
if (isUp && floor > currentFloor)
{ // 如果電梯向上并且有大于當(dāng)前樓梯的請(qǐng)求
return true;
}
if (!isUp && floor < currentFloor)
{ // 如果電梯向下并且有小于當(dāng)前樓梯的請(qǐng)求
return true;
}
}
return false; // 其他情況都是false
}
// 電梯移動(dòng)一樓
private void moveFloor()
{
if (direction == UP)
{
if (currentFloor < maxFloor)
{ // 如果電梯方向向上并且小于最大樓層
currentFloor++;
}
} else if (direction == DOWN)
{
if (currentFloor > minFloor)
{ // 如果電梯方向向下并且大于最小樓層的華
currentFloor--;
}
} else
{
setInitialDir();
}
}
// 用于設(shè)置初始方向
private void setInitialDir()
{
int firstReq = getFirstRequest();
if (firstReq > currentFloor)
{
direction = UP;
} else if (firstReq < currentFloor)
{
direction = DOWN;
}
else direction = IDLE;
}
// 獲取第一個(gè)請(qǐng)求的樓層
private int getFirstRequest()
{
if (!innerQueue.isEmpty())
return innerQueue.getFirst();
if (!outerUpQueue.isEmpty())
return outerUpQueue.getFirst();
if (!outerDownQueue.isEmpty())
return outerDownQueue.getFirst();
return currentFloor; // 無(wú)請(qǐng)求時(shí)保持當(dāng)前層
}
// 調(diào)轉(zhuǎn)方向
private void reverseDirection()
{
if (direction == UP)
{
direction = DOWN;
} else if (direction == DOWN)
{
direction = UP;
}
// 如果調(diào)轉(zhuǎn)后沒(méi)有請(qǐng)求,則靜止
if (!haveQueue(innerQueue, direction == UP) &&!haveQueue(innerQueue, direction == DOWN) &&
!haveQueue(outerUpQueue, direction == UP) &&!haveQueue(outerUpQueue, direction == DOWN))
{
// 如果各種請(qǐng)求都沒(méi)有了的華
direction = IDLE;
}
}
// 將方向轉(zhuǎn)換為字符串!差點(diǎn)忘了
private String getDirName()
{
if (direction == UP)
return "UP";
if (direction == DOWN)
return "DOWN";
return "IDLE";
}
}
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
int min = input.nextInt();
int max = input.nextInt();
input.nextLine(); // 讀取換行符
Elevator elevator = new Elevator(min, max);
while (true)
{
String line = input.nextLine().trim();
if (line.equalsIgnoreCase("end"))
break;
line = line.replaceAll("[<>\\s]", ""); // 去掉<>和空格
if (line.contains(","))
{ // 如果包含,那就說(shuō)明是外部的請(qǐng)求
String[] parts = line.split(",");
int floor = Integer.parseInt(parts[0]);
String dir = parts[1].toUpperCase();
elevator.addExternalQueue(floor, dir);
} else
{ // 否則就是內(nèi)部的請(qǐng)求
int floor = Integer.parseInt(line);
elevator.addInner(floor);
}
}
elevator.runFloor();
}
}
第二次電梯題目的設(shè)計(jì)與分析
題目要求:
新增:乘客請(qǐng)求樓層數(shù)有誤,具體為高于最高樓層數(shù)或低于最低樓層數(shù),處理方法:程序自動(dòng)忽略此類輸入,繼續(xù)執(zhí)行。乘客請(qǐng)求不合理,具體為輸入時(shí)出現(xiàn)連續(xù)的相同請(qǐng)求,例如<3><3><3>或者<5,DOWN><5,DOWN>,處理方法:程序自動(dòng)忽略相同的多余輸入,繼續(xù)執(zhí)行,例如<3><3><3>過(guò)濾為<3>,要分成多個(gè)類,并且要遵循單一職責(zé)原則(SRP)。
設(shè)計(jì)類圖:

根據(jù)題目所給類圖提示進(jìn)行設(shè)計(jì)Main類用正則表達(dá)式解析輸入數(shù)據(jù)分為電梯內(nèi)部請(qǐng)求和電梯外部請(qǐng)求,分別加入到RequestQueue類的匹配請(qǐng)求隊(duì)列當(dāng)中。Elevator類包含電梯樓層范圍、當(dāng)前樓層、樓層合法性檢驗(yàn)、電梯的運(yùn)行方向和運(yùn)行狀態(tài),用于Controller類的電梯運(yùn)行邏輯。ExterRequest類用來(lái)存儲(chǔ)電梯外部請(qǐng)求的樓層與方向。RequestQueue類包括電梯內(nèi)部外部請(qǐng)求兩個(gè)隊(duì)列,以及添加請(qǐng)求、獲得當(dāng)前請(qǐng)求和檢驗(yàn)請(qǐng)求是否重復(fù)方法,用于Controller類當(dāng)中的電梯運(yùn)行方向分析和判斷。Controller類用來(lái)執(zhí)行電梯的運(yùn)行方向及狀態(tài)判斷、控制電梯的移動(dòng)、完成請(qǐng)求隊(duì)列中的請(qǐng)求和打印當(dāng)前電梯的運(yùn)行狀態(tài)和樓層。
Souce Monitor分析結(jié)果:

這一次通過(guò)給出的java類圖對(duì)思路有很大幫助,就像把一個(gè)復(fù)雜的問(wèn)題分成多個(gè)小部分使其簡(jiǎn)單化,同時(shí)對(duì)問(wèn)題出現(xiàn)錯(cuò)誤在哪可以更加容易的找到。這次的代碼寫雖然還是存在一些問(wèn)題,但是以經(jīng)有了很大的進(jìn)步,通過(guò)與其他同學(xué)的測(cè)試結(jié)果比對(duì),我們都發(fā)現(xiàn)了一些問(wèn)題,有時(shí)候問(wèn)題出錯(cuò)很簡(jiǎn)單但是不報(bào)錯(cuò),這種不小心寫錯(cuò)導(dǎo)致的邏輯上的錯(cuò)誤很難發(fā)現(xiàn),再就是仍然是存在某種情況下電梯沒(méi)有停下,這個(gè)當(dāng)時(shí)來(lái)不及改,也不知道是到底哪里出了問(wèn)題,一直被困在這里。
點(diǎn)擊查看代碼
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Collections;
import java.util.List;
enum Direction {
UP, DOWN, IDLE
}
class ExternalRequest {
final int floor;
final Direction direction;
ExternalRequest(int floor, Direction direction) {
this.floor = floor;
this.direction = direction;
}
}
class RequestQueue {
private final LinkedList<Integer> internal = new LinkedList<>();
private final LinkedList<ExternalRequest> external = new LinkedList<>();
void addInternal(int floor) {
if (internal.isEmpty() || internal.getLast() != floor) {
internal.add(floor);
}
}
void addExternal(int floor, Direction direction) {
ExternalRequest newReq = new ExternalRequest(floor, direction);
if (external.isEmpty() || !isEqual(external.getLast(), newReq)) {
external.add(newReq);
}
}
private boolean isEqual(ExternalRequest a, ExternalRequest b) {
return a.floor == b.floor && a.direction == b.direction;
}
Integer peekInternal() { return internal.peek(); }
ExternalRequest peekExternal() { return external.peek(); }
void removeInternal() { internal.poll(); }
void removeExternal() { external.poll(); }
boolean isEmpty() { return internal.isEmpty() && external.isEmpty(); }
// 新增訪問(wèn)方法
List<Integer> getInternalRequests() {
return new LinkedList<>(internal); // 返回副本
}
List<ExternalRequest> getExternalRequests() {
return new LinkedList<>(external); // 返回副本
}
}
class Elevator {
int currentFloor;
Direction direction = Direction.IDLE;
final int minFloor;
final int maxFloor;
Elevator(int minFloor, int maxFloor) {
this.minFloor = minFloor;
this.maxFloor = maxFloor;
this.currentFloor = minFloor;
}
boolean isValidFloor(int floor) {
return floor >= minFloor && floor <= maxFloor;
}
void moveStep() {
if (direction == Direction.UP) currentFloor++;
else if (direction == Direction.DOWN) currentFloor--;
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int min = Integer.parseInt(scanner.nextLine());
int max = Integer.parseInt(scanner.nextLine());
Elevator elevator = new Elevator(min, max);
RequestQueue queue = new RequestQueue();
// 處理輸入
String line;
while (!(line = scanner.nextLine()).equalsIgnoreCase("end")) {
line = line.trim().toUpperCase();
if (line.matches("<\\d+>")) {
int floor = Integer.parseInt(line.replaceAll("[<>]", ""));
if (elevator.isValidFloor(floor)) queue.addInternal(floor);
} else if (line.matches("<\\d+,\\s*(UP|DOWN)>")) {
String[] parts = line.replaceAll("[<>]", "").split(",");
int floor = Integer.parseInt(parts[0].trim());
Direction dir = Direction.valueOf(parts[1].trim());
if (elevator.isValidFloor(floor)) queue.addExternal(floor, dir);
}
}
// 電梯運(yùn)行邏輯
while (!queue.isEmpty()) {
Integer M = queue.peekInternal();
ExternalRequest P = queue.peekExternal();
int N = elevator.currentFloor;
// 方向判定
if (elevator.direction == Direction.IDLE) {
if (M != null) {
elevator.direction = M > N ? Direction.UP : Direction.DOWN;
} else if (P != null) {
elevator.direction = P.floor > N ? Direction.UP : Direction.DOWN;
} else {
break;
}
System.out.printf("Current Floor: %d Direction: %s\n", N, elevator.direction);
}
// 執(zhí)行移動(dòng)
elevator.moveStep();
N = elevator.currentFloor;
System.out.printf("Current Floor: %d Direction: %s\n", N, elevator.direction);
// 檢查停靠
boolean stop = false;
if (M != null && M == N) {
stop = true;
queue.removeInternal();
}
if (P != null && P.floor == N &&
(P.direction == elevator.direction || elevator.direction == Direction.IDLE)) {
stop = true;
queue.removeExternal();
}
if (stop) {
System.out.printf("Open Door # Floor %d\n", N);
System.out.println("Close Door");
}
// 方向更新邏輯
boolean hasSameDirectionRequest = false;
List<Integer> internalRequests = queue.getInternalRequests();
List<ExternalRequest> externalRequests = queue.getExternalRequests();
if (elevator.direction == Direction.UP) {
// 檢查所有UP方向請(qǐng)求
for (Integer m : internalRequests) {
if (m > N) {
hasSameDirectionRequest = true;
break;
}
}
for (ExternalRequest p : externalRequests) {
if (p.floor > N && p.direction == Direction.UP) {
hasSameDirectionRequest = true;
break;
}
}
} else if (elevator.direction == Direction.DOWN) {
// 檢查所有DOWN方向請(qǐng)求
for (Integer m : internalRequests) {
if (m < N) {
hasSameDirectionRequest = true;
break;
}
}
for (ExternalRequest p : externalRequests) {
if (p.floor < N && p.direction == Direction.DOWN) {
hasSameDirectionRequest = true;
break;
}
}
}
if (!hasSameDirectionRequest) {
// 切換方向檢查反向請(qǐng)求
boolean hasReverseRequest = false;
if (elevator.direction == Direction.UP) {
for (Integer m : internalRequests) {
if (m < N) {
hasReverseRequest = true;
break;
}
}
for (ExternalRequest p : externalRequests) {
if (p.floor < N && p.direction == Direction.DOWN) {
hasReverseRequest = true;
break;
}
}
} else {
for (Integer m : internalRequests) {
if (m > N) {
hasReverseRequest = true;
break;
}
}
for (ExternalRequest p : externalRequests) {
if (p.floor > N && p.direction == Direction.UP) {
hasReverseRequest = true;
break;
}
}
}
if (hasReverseRequest) {
elevator.direction = elevator.direction == Direction.UP ? Direction.DOWN : Direction.UP;
} else {
elevator.direction = Direction.IDLE;
}
}
// 最終檢查隊(duì)列狀態(tài)
if (queue.isEmpty()) {
elevator.direction = Direction.IDLE;
break;
}
}
}
}
第三次電梯題目的設(shè)計(jì)與分析
題目要求:
對(duì)之前電梯調(diào)度程序再次進(jìn)行迭代性設(shè)計(jì),加入乘客類(Passenger),取消乘客請(qǐng)求類,類設(shè)計(jì)要求遵循單一職責(zé)原則(SRP);乘客請(qǐng)求輸入變動(dòng)情況:外部請(qǐng)求由之前的<請(qǐng)求樓層數(shù),請(qǐng)求方向>修改為<請(qǐng)求源樓層,請(qǐng)求目的樓層>對(duì)于外部請(qǐng)求,當(dāng)電梯處理該請(qǐng)求之后(該請(qǐng)求出隊(duì)),要將<請(qǐng)求源樓層,請(qǐng)求目的樓層>中的請(qǐng)求目的樓層加入到請(qǐng)求內(nèi)部隊(duì)列(加到隊(duì)尾)
設(shè)計(jì)類圖:

這次的題目集變化了輸入樓層請(qǐng)求的格式,參考類圖刪除了ExternalRequest類,新增了一個(gè)Passager類。Main類這次用于處理輸入數(shù)據(jù)的正則表達(dá)式要改變,然后這次的某一行數(shù)據(jù)按Passenger類的構(gòu)造方法來(lái)儲(chǔ)存。RequestQueue類中隊(duì)列的類型變?yōu)镻assenger,并且把乘客請(qǐng)求添加到隊(duì)列里方法變?yōu)閭魅隤assenger。Controller類移除請(qǐng)求的方法中要改為在處理完一個(gè)外部請(qǐng)求時(shí)先把外部請(qǐng)求中的樓層加入內(nèi)部請(qǐng)求隊(duì)列隊(duì)尾部分,再移除當(dāng)前這個(gè)外部請(qǐng)求。
Souce Monitor分析結(jié)果:

這次題目變化了輸入的格式、類的重新設(shè)計(jì)和邏輯處理情況。我在其中碰到了許多的問(wèn)題,比如在外部請(qǐng)求的刪除和添加到內(nèi)部末尾處有問(wèn)題,還有就是邏輯上的問(wèn)題,由于前一次的電梯問(wèn)題我還沒(méi)有發(fā)現(xiàn),說(shuō)明我可能有情況漏掉了,同樣帶到了這一次的問(wèn)題當(dāng)中。
三、踩坑心得
一定要有完整的思路再去開(kāi)始寫代碼
寫代碼一定要有“全局觀”,我剛開(kāi)始想到什么就寫什么,這樣不僅會(huì)導(dǎo)致情況很可能考慮的不周到,還會(huì)影響編寫其他代碼的思路,最后的結(jié)果就是刪刪改改,可能還會(huì)越改越錯(cuò)。所以一定要謀而后動(dòng)。
與人溝通很重要
“他山之玉,可以攻石”,有時(shí)候一個(gè)問(wèn)題你思考了好久都沒(méi)有解決甚至是沒(méi)有頭緒的時(shí)候,別人可能稍稍指點(diǎn)一下就會(huì)解決,團(tuán)隊(duì)協(xié)助,互幫互助非常重要。
一定要仔細(xì)
不要盲目的去追求速度,如果速度上去了,因?yàn)榇中拇笠舛{(diào)試找錯(cuò)的時(shí)間成本可能會(huì)大于仔細(xì)認(rèn)真的敲,有時(shí)候一個(gè)中英文輸錯(cuò)&&和||寫錯(cuò)或者大小寫拼寫等等問(wèn)題就很難發(fā)現(xiàn),但又會(huì)影響你全部的代碼。
第一步很重要
這次電梯的三次實(shí)驗(yàn),其實(shí)最重要的我覺(jué)得還是第一次對(duì)電梯的理解是否完全是否透徹,我就是由于不知曉某個(gè)情況沒(méi)正確考慮,而導(dǎo)致后續(xù)的作業(yè)一直被影響。所以一定要搞明白設(shè)計(jì)需求,邏輯原理。
四、改進(jìn)建議
1.代碼的部分方法邏輯過(guò)于重復(fù)且繁瑣,可將其拆分為多個(gè)方法,這樣不僅能提高代碼的可讀性,也便于進(jìn)行后續(xù)的維護(hù)。
2.方法盡量做到單一功能,使邏輯更清晰。
3.在一些可能越界的地方加入判斷更好的檢測(cè)到問(wèn)題出現(xiàn)在哪,快速定位和解決問(wèn)題。
4.增加代碼的注釋,提高可讀性,不然自己一段時(shí)間后重新看會(huì)很費(fèi)勁,降低效率。特別是復(fù)雜方法邏輯不清晰更要添加注釋。
五、總結(jié)
收獲
通過(guò)這三次迭代性題目集的綜合性學(xué)習(xí),我獲益良多,首先,我對(duì)C語(yǔ)言面對(duì)過(guò)程編程和Java面對(duì)對(duì)象編程的差異有了更多的了解,再就是這三次PTA作業(yè)使我的邏輯思維和編程能力很有幫助。然后在不斷編寫和修改代碼過(guò)程中, 我對(duì)于Java語(yǔ)法掌握、正則表達(dá)式應(yīng)用,List使用以及面向?qū)ο蟮某绦蛟O(shè)計(jì)有了有更加深刻的理解和提升,通過(guò)題目的迭代設(shè)計(jì),如電梯第一個(gè)題目迭代到第二個(gè)題目,我對(duì)于類設(shè)計(jì)的遵循單一職責(zé)原則SRP和類間關(guān)系有了更加深刻的認(rèn)識(shí)。同時(shí)也理解領(lǐng)悟了自身還有很多的不足之處。
建議
希望老師發(fā)布新一輪的迭代作業(yè)后對(duì)前一輪的作業(yè)提供一些幫助,比如這次的三輪迭代作業(yè),好多人可能第一次作業(yè)時(shí)沒(méi)有搞懂會(huì)導(dǎo)致后面的都幾乎沒(méi)法做了,還會(huì)影響打擊信心,再就是希望提交后的錯(cuò)誤提示多一點(diǎn),比如第一次的電梯作業(yè)就一個(gè)提示答案錯(cuò)誤70分,還有就是希望迭代作業(yè)起步的時(shí)候能有更多的測(cè)試用例,后面我們對(duì)題目邏輯有一定的理解后就可以自己設(shè)置測(cè)試用例來(lái)找錯(cuò)誤。
浙公網(wǎng)安備 33010602011771號(hào)