BỘ GIÁO DỤC VÀ ĐÀO TẠO
ĐẠI HỌC ĐÀ NẴNG
BÁO CÁO
LUẬN VĂN THẠC SĨ KỸ THUẬT
NGÀNH KHOA HỌC MÁY TÍNH
TÊN ĐỀ TÀI:
ỨNG DỤNG KỸ THUẬT TÁI CẤU TRÚC MÃ NGUỒN ĐỂ
TRIỂN KHAI DÒ TÌM VÀ CẢI TIẾN CÁC ĐOẠN
MÃ XẤU TRONG CHƢƠNG TRÌNH C#
Họ tên HV : NHIÊU LẬP HÒA
Họ tên CBHD : TS.NGUYỄN THANH BÌNH
ĐÀ NẴNG, 11/2008
Luận văn tốt nghiệp cao học Khóa 2005 - 2008
Học viên thực hiện: Nhiêu Lập Hòa
2
LỜI CAM ĐOAN
Tôi xin cam đoan nội dung luận văn "Ứng dụng kỹ thuật tái cấu trúc mã nguồn để
triển khai dò tìm và cải tiến các đọan mã xấu trong chƣơng trình C# ", dƣới sự hƣớng dẫn
của TS. Nguyễn Thanh Bình, là công trình do tôi trực tiếp nghiên cứu.
Tôi xin cam đoan các số liệu, kết quả nghiên cứu trong luận văn trung thực
chƣa từng đƣợc công bố trong bất cứ công trình nào trƣớc đây.
Tác giả
Nhiêu Lập Hòa
Luận văn tốt nghiệp cao học Khóa 2005 - 2008
Học viên thực hiện: Nhiêu Lập Hòa
3
MỤC LỤC
LỜI CAM ĐOAN ................................................................................................................ 2
MỤC LỤC ........................................................................................................................... 3
DANH MỤC HÌNH ẢNH ................................................................................................... 5
MỞ ĐẦU ............................................................................................................................. 6
CHƢƠNG I: KỸ THUẬT TÁI CẤU TRÚC MÃ NGUỒN (REFACTORING) .............. 7
I.1 ĐỊNH NGHĨA KỸ THUẬT TÁI CẤU TRÚC MÃ NGUỒN ................................ 7
I.1.1 Ví d minh ha................................................................................................. 7
I.1.2 Định nghĩa k thuật tái cấu trúc mã nguồn ................................................... 19
I.2 HIỆU QUẢ CỦA TÁI CẤU TRÚC MÃ NGUỒN ................................................ 20
I.2.1 Refactoring cải thiện thiết kế phần mềm ....................................................... 20
I.2.2 Refactoring làm mã nguồn phần mềm dễ hiểu .............................................. 20
I.2.3 Refactoring giúp phát hiện và hạn chế lỗi ..................................................... 21
I.2.4 Refactoring giúp đấy nhanh quá trình phát triển phần mềm ......................... 21
I.3 KHI NÀO THỰC HIỆN TÁI CẤU TRÚC MÃ NGUỒN ..................................... 22
I.3.1 Refactor khi thêm chức năng ......................................................................... 22
I.3.2 Refactor khi cần sửa lỗi ................................................................................ 22
I.3.3 Refactor khi thực hiện duyệt chƣơng trình ................................................... 23
I.4 CÁC KỸ THUẬT TÁI CẤU TRÚC MÃ NGUỒN .............................................. 23
I.4.1 Danh mục các kỹ thuật tái cấu trúc mã nguồn ............................................... 23
I.5 NHẬN XÉT VÀ KẾT LUẬN ................................................................................ 26
CHƢƠNG II: LỖI CẤU TRÚC (BAD SMELLS) TRONG MÃ NGUỒN ................... 27
II.1 KHÁI NIỆM VỀ LỖI CẤU TRÚC (BAD SMELLS) ........................................ 27
II.2 LỖI CẤU TRÚC VÀ GIẢI PHÁP CẢI TIẾN ..................................................... 27
II.2.1 Duplicated Code - Trùng lặp mã ................................................................. 27
II.2.2 Long Method Phƣơng thức phức tạp ......................................................... 28
II.2.3 Large Class Qui mô lớp lớn ...................................................................... 30
II.2.4 Long Parameter List - Danh sách tham s quá dài ....................................... 31
II.2.5 Divergent Change Cu trúc lp ít có tính kh biến .................................. 32
II.2.6 Shotgun Surgery Lớp đƣợc thiết kế không hp lý và b phân rã ............ 32
II.2.7 Feature Envy Phân b phƣơng thức gia các lp không hp lý .............. 33
II.2.8 Data Clumps Gôm cm d liu ................................................................ 34
II.2.9 Primitive Obsession Kh năng thể hin d liu ca lp b hn chế ......... 34
II.2.10 Switch Statements Khi lệnh điều kin r hƣớng không hp........... 36
II.2.11 Lazy Class Lớp đƣợc định nghĩa không cần thiết .................................. 38
II.2.12 Speculative Generality Cu trúc b thiết kế dƣ thừa ............................... 38
II.2.13 Temporary Field Lm dng thuc tính tm thi .................................... 39
II.2.14 Message Chains Chuỗi phƣơng thức liên hoàn khó kim soát............... 39
II.2.15 Middle Man Quan h y quyn không hp lý/logic ............................... 39
II.2.16 Inapproprite Intimacy - Cu trúc thành phn riêng không hp lý ............ 41
II.2.17 Alternative Classes with Different Interfaces - Đặc t lp không rõ ràng 41
II.2.18 Incomplete Library Class S dụng thƣ vin lớp chƣa đƣợc hòan chnh 41
II.2.19 Data Class Lp d liệu độc lp ............................................................. 42
II.2.20 Refused Bequest Quan h kế tha không hp lý/logic ......................... 43
Luận văn tốt nghiệp cao học Khóa 2005 - 2008
Học viên thực hiện: Nhiêu Lập Hòa
4
II.2.21 Comments Chú thích không cn thiết .................................................... 43
II.3 NHẬN XÉT VÀ KẾT LUẬN .............................................................................. 44
CHƢƠNG III: NỀN TẢNG .NET VÀ NGÔN NGỮ LẬP TRÌNH C# ............................ 45
III.1 TỔNG QUAN VỀ NỀN TẢNG .NET .............................................................. 45
III.1.1 Định nghĩa .NET ........................................................................................ 45
III.1.2 Mc tiêu ca .NET ..................................................................................... 45
III.1.3 Dch v ca .NET ....................................................................................... 45
III.1.4 Kiến trúc ca .NET .................................................................................... 46
III.2 NGÔN NGỮ LẬP TRÌNH C# .......................................................................... 47
III.2.1 Tng quan v ngôn ng lp trình C# ......................................................... 47
III.2.2 Đặc trƣng của các ngôn ng lp trình C# ................................................... 47
III.3 MÔI TRƢỜNG PHÁT TRIỂN ỨNG DỤNG VISUAL STUDIO .NET .......... 48
CHƢƠNG IV: ỨNG DỤNG KỸ THUẬT TÁI CẤU TRÚC MÃ NGUỒN ĐỂ
DÒ TÌM VÀ CẢI TIẾN CÁC ĐOẠN MÃ XẤU TRONG CHƢƠNG TRÌNH C# ......... 49
IV.1 GIẢI PHÁP VÀ CÔNG CỤ HỖ TRỢ REFACTOR .......................................... 49
IV.1.1 Đc t gii pháp trin khai ......................................................................... 49
IV.1.2 Mt s công c và tin ích h tr vic dò tìm và ci tiến mã xu ............. 50
IV.1.3 Th nghim minh ha các công c h tr refactor trong VS.Net .............. 57
IV.1.4 Nhận xét và đánh giá .................................................................................. 80
IV.2 ỨNG DỤNG KỸ THUẬT TÁI CẤU TRÚC MÃ NGUỒN ĐỂ DÒ TÌM VÀ
CẢI TIẾN CÁC ĐOẠN MÃ XẤU TRONG CHƢƠNG TRÌNH C#.......................... 81
IV.2.1 Thc hin k thut tái cu trúc mã nguồn trên chƣơng trình thc tế ......... 82
IV.2.2 Phân tích và đánh giá kết qu thc hin .................................................... 94
IV.3 NHẬN XÉT VÀ KẾT LUẬN ............................................................................ 95
CHƢƠNG V: KẾT LUẬN ............................................................... 96
V.1 ĐÁNH GIÁ KẾT QUẢ CỦA ĐỀ TÀI ............................................................... 96
V.2 PHẠM VI ỨNG DỤNG .................................................................................... 96
V.3 HƢỚNG PHÁT TRIỂN ...................................................................................... 97
V.3.1 Trin khai áp dng trên các ngôn ng khác ................................................ 97
V.3.2 Th nghim xây dng mt refactoring tool tích hp vào VS.NET ........... 97
TÀI LIỆU THAM KHẢO ................................................................................................. 98
Luận văn tốt nghiệp cao học Khóa 2005 - 2008
Học viên thực hiện: Nhiêu Lập Hòa
5
DANH MỤC HÌNH ẢNH
Tên hình ảnh
Trang
H.3.1: Kiến trúc nền tảng .NET
46
H.3.2: Môi trường phát trin ng dng VS.NET
48
H.4.1: Đặc t kch bn gii pháp trin khai
49
H.4.2: Trình chức năng refactor tích hợp trong VS.NET
50
H.4.3: Trình chức năng refactor của Visual Assit X for VS.NET
51
H.4.4: Trình chức năng refactor của C# Refactory for VS.NET
52
H.4.5: Trình chức năng refactor của .NET Refactor for .NET
53
H.4.6: Trình chức năng refactor của CodeIT.Once for .NET
54
H.4.7: Trình chức năng refactor của JetBrances ReShape
55
H.4.8: Trình chức năng refactor của DevExpress Refactor!™ Pro
56
H.4.9: Minh họa kỹ thuật Change Signature trong JetBrains ReSharper
58
H.4.10: Kết quả minh họa kỹ thuật Change Signature
58
H.4.11: Minh họa kỹ thuật Convert Method to Property ca CodeIT.Once
60
H.4.12: Minh họa kỹ thuật Convert Method to Property ca ReSharper
61
H.4.13: Kết quả kỹ thuật Convert Method to Property
61
H.4.14: Minh họa kỹ thuật Decompose/Simplify Conditional
63
H.4.15: Kết quả kỹ thuật Decompose/Simplify Conditional
63
H.4.16: Minh họa kỹ thuật Encapsulate Field của Refactor trong VS.NET
65
H.4.17: Minh họa kỹ thuật Encapsulate Field của Visual Assit X for .NET
66
H.4.18: Kết quả kỹ thuật Encapsulate Field
66
H.4.19: Minh họa kỹ thuật Extract Interface của Refactor trong VS.NET
68
H.4.20: Minh họa kỹ thuật Extract Interface của CodeIT.Once
69
H.4.21: Kết quả kỹ thuật Extract Interface
69
H.4.22: Minh họa kỹ thuật Extract Method của Refactor trong VS.NET
71
H.4.23: Kết quả kỹ thuật Extract Method
71
H.4.24: Minh họa kỹ thuật Inline Variable của CodeIT.Once for .NET
73
H.4.25: Kết quả kỹ thuật Inline Variable
73
H.4.26: Minh họa kỹ thuật Promote Local Variable to Parameter của VS.NET
75
H.4.27: Minh họa kỹ thuật Promote Local Variable to Parameter của CodeIT.Once
75
H.4.28: Minh họa kỹ thuật Promote Local Variable to Parameter của ReSharper
76
H.4.29: Kết quả kỹ thuật Promote Local Variable to Parameter
76
H.4.30: Minh họa kỹ thuật Rename Variables của Refactor trong VS.NET
78
H.4.31: Minh họa kỹ thuật Rename Variables của Visual Assit X
79
H.4.32: Kết quả kỹ thuật Rename Variables
79
H.4.33: Sơ đồ lớp của chương trình khi chưa refactoring
82
H.4.34: Màn hình kết quả chạy chương trình khi chưa refactoring
84
H.4.35: Sơ đồ lớp của chương trình sau khi refactoring
91
H.4.36: Màn hình kết quả chạy chương trình sau khi refactoring
93