ĐẠI HỌC QUOC GIA HA NOI TRUONG DAI HOC CONG NGHE
Phing Anh Duong
BAO CAO BAI TAP TAI CAU TRUC MA NGUON
Trang 2
ĐẠI HỌC QUOC GIA HA NOI TRUONG DAI HOC CONG NGHE
Phing Anh Duong
BAO CAO BAI TAP TAI CAU TRUC MA NGUON
Trang 3
VIETNAM NATIONAL UNIVERSITY, HANOI UNIVERSITY OF ENGINEERING AND TECHNOLOGY
Phung Anh Duong
REFACTORING SOURCE CODE PRACTICE REPORT
Major: Computer Science
Lecturer: Dr Vo Dinh Hieu
Ha Noi - 2022
Trang 5
Chương 1: Source code ban đầu - - LG 2C 1 11212121111 11 12 H1 HH TH HH 6
Ilhnc ha .e 6
I9 1ì " -ciiiiiỔ 6
I° ‹-0 9200 000 Si 7 F0 2-1: ẦẦồồốồốồố 43 7
V5 MAIN JAVA ốằ TnaaỄEEễ'E3‡ 8
Chương 2: Extract method - Q01 HT HE Ki ki nh 9
rhấc o0: aAa.a 9
2.2 Trước tái cấu †FÚC - - (2c +21 1E 121 21111 11 112111 11 1T TH TH TH TH TH TH Tnhh 9 2.3 Sau tái cấu †FÚC - LG 2c SH S1 S1 S122 21111 H1 1H H1 HT TH TH TH TT HH TH TH Hhg 10
Chương 3: Chỉnh sửa trình bày -QQQ Q00 HH HH HH rà 12
3.1 Xuống dòng các đoạn code dài, dễ gây rối - 5c 2c Scccseceeerre2 12 3.2 Cách dòng đề tách đoạn code xử lý với các biến và kết quả trả về 12 3.3 Tối ưu hóa tính toán (giảm bớt số 0 trong tính toán đề tránh sai sót) 13 Chương 4: Xóa bỏ những thứ không cần thiết . - 2S St Se re reeerree 14 4.1 Xóa bỏ một số biến không cần thiết . - 2C SH re 14 Chương 5: Viết Javadoc - - - L L1 T12 nh TH TH TH TH TH TH TH TH TH TH TH HH TH TH 15
"híc o0 ae 15
Trang 6Chương 1: Source code ban đầu
1.1 Giới thiệu
Source code ban dau gém 4 file:
e plays.java: class dinh nghia d6i trong plays, bao g6m c4c getter, setter và constructor của đối tượng
e©_ performances.java: class định nghĩa đối tượng performances, bao gồm các getfer, seffer và constructor của đối tượng
e invoice.java: class định nghĩa đối tượng invoice, bao gôm các getfer, setter và constructor của đối tượng Ngoài ra còn chứa method billQ có chức năng 1n hóa đơn
e©_ main.java: chứa method main() Bén trong method là data được cho sẵn
và một test
Link source code ban đầu: Github
Link source code sau khi tái câu trúc: Github
1.2 plays.java
public class plays {
Lị private String private String
public String getPlayID() "eturn
public void (String playID) th1s
public String getType() "eturn public void (String type)
public
public plays(String name, String type) {
Trang 71.3 performances.java
performances { plays pLlayID
playID) 2LayID = playID
audience) lience audience
(plays pLayTD audience) { playID = playID = audience eo eo e 1.4 invoice.java invoice { String customer performances[] performances String @ (String customer) customer = customer performances[ ] lộ performances
(performances[] performances) performances = performances
(String customer, performances[] performances) { = customer eS = performances String (invoice invoice, plays play) { totalAmount = 0 volumeCredit = 0
StringBuilder result = StringBuilder ( + invoice.getCustomer() +
Trang 8thisAmount = 30000 (perf.getAudience() > 20) { thisAmount += 10000 + 500 * (perf.getAudience() - 20) i thisAmount += 300 * perf.getAudience() Error( + pl.getType()) volumeCredit = Math.max(perf.getAudience() - 30, 86) ( equaLs(pL.getType())) { volumeCredit += Math.floor(perf.getAudience() / 5) resuLlt.append(play.getPlayID()).append( ).append(thisAmount / 100).append( append(perf getAudience()).append( ) totaLAmount += thisAmount }
result append( ).append(totalAmount / 100).append(
result append( ).append(volumeCredit) append( result toString() 1.5 main.java main { (String[] args) { plays[] plays = ptLays[5 ] om pLays( 1] plays ( 2 ! LE WET [ ptLays[ plays[ | plays performances[] performances = performances[3] performances[Q@] performances(pLlays[0@] performances[ 1] performances(ptays[1] performances[ 2 ] performances(ptays[2 ]
invoice invoice invoice( performances)
Trang 9Chuong 2: Extract method
2.1 Giới thiệu
Trong source code, method billQ có chứa phần code dùng để tính số tiền phải trả của một đối tượng performances Phần code này có thể được di chuyển thành một method mới, giúp method billQ thơng thống, dễ đọc hơn
2.2 Trước tái cấu trúc
result.a
Trang 102.3 Sau tái cầu trúc
pubLic String biLLs(invoice invoice) {
int totaLAmount = 0;
int volumeCredit = 0;
StringBuilder result = new StringBuilder ( + invoice.getCusto
for (performances perf : invoice.getPerfor
plays play = perf.getPLayTD(); t int thisAmount = 09; thisAmount = caLcPerf(perf); totalAmount += thisAmount; volumeCredit += calcVolumeCredit(perf) ; resuLt.append(pLlay.getPlayID()).append( ).append(thisAmount .append(perf getAudience()).appendí( \n"); 3 "esuLt.append( ).append(totaLAmount "esuLt.append ( ) append(volumeCredit).append
return result toString(); Là
Trang 12Chương 3: Chỉnh sửa trình bày
3.1 Xuống dòng các đoạn code dài, dễ gây rỗi
"esuLt.append(ptay getPLayTID()) append ( ).append(thisAmount / 100).append( append(perf getAudience()).append( )
}
Trang 133.3 Tối ưu hóa tính toán (giảm bớt số 0 trong tính toán để tránh sai sót)
Trang 14Chương 4: Xóa bỏ những thứ không cần thiết 4.1 Xóa bỏ một số biến không cần thiết