Trang 1 ĐẠ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 Duo
Trang 1
ĐẠI HỌC QUOC GIA HA NOI TRUONG DAI HOC CONG NGHE
Phing Anh Duong
BAO CAO BAI TAP TAI CAU TRUC MA NGUON
BAI TAP MON KIEN TRUC PHAN MEM
Ngành: Khoa Học Máy Tính
Hà Nội — 2022
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
BAI TAP MON KIEN TRUC PHAN MEM
Ngành: Khoa Học Máy Tính
Giảng viên: TS Võ Đình Hiếu
Hà Nội — 2022
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
I° ‹-0 9200 000 Si 7 F0 2-1: ẦẦồồốồốồố 43 7
Chương 2: Extract method - Q01 HT HE Ki ki nh 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
ý co (00 diiiiiiaiiiẳẳẳiẳiidddiiốỐốỐỔỒŸ 15 5.3 Sau khi sửa - _ CS HT ng KT TK Ko KT TK ky ke xà 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) {
this.t
Trang 71.3 performances.java
performances { plays pLlayID
playID) 2LayID = playID
audience) lience audience
(plays pLayTD audience) { playID = playID
= audience
1.4 invoice.java
invoice {
String customer
performances[] performances
= customer
eS = performances
totalAmount = 0
volumeCredit = 0
(performances perf : invoice.getPerformances()) {
plays pl = perf.getPlayID()
thisAmount =
(pl.getType()) {
thisAmount = 40000
(perf.getAudience() > 30) { thisAmount += 1000 * (perf.getAudience() -
Trang 8thisAmount = 30000 (perf.getAudience() > 20) { thisAmount += 10000 + 500 * (perf.getAudience() - 20)
i thisAmount += 300 * perf.getAudience()
volumeCredit += Math.floor(perf.getAudience() / 5)
totaLAmount += thisAmount
}
result toString()
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)
String print = invoice.bills()
System.out.println(print)
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 thoá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) {
for (performances perf : invoice.getPerfor
int thisAmount = 09;
thisAmount = caLcPerf(perf);
totalAmount += thisAmount;
.append(perf getAudience()).appendí( \n");
3
private int caLcPerf(perform int resutLt = 0;
plays play = perf.getPlayID();
switch (play.getType()) case
if (perf.getAudience() > et
"esuLt += * (perf.getAudience() - }
break;
case
if (perf.getAudience()
result += * (perf.getAudience()
}
"esuLt * perf.getAudience();
break;
default:
throw new Error( + play.getType()); “ ƒ
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( )
}
"esutt.append( ).append(totalAmount / 100).append(
result append( ).append(volumeCredit) append(
result append( ›
-append(totalAmount / 100) append( )
"esutt.append(ptay getPLayTD())
.append(thisAmount / 100)
.append( y result append( )
.append(perf.getAudience()) append(volumeCredit)
append ( ) append( )
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ề
(performances perf) {
"esuLt =
result += Math.max(perf.getAudience() - 30, 6}
result += comedyAdd(perf)
"esuLt
(performances perf) {
result =
result += Math.max(perf.getAudience() - 30, 9)
result += comedyAdd(perf)
"esuLt
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 14
Chươ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