xuanlove_93

New Member

Download miễn phí Đề 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#





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 họa. 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 – cách 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 – Cấu trúc lớp ít có tính khả biến . 32
II.2.6 Shotgun Surgery – Lớp được thiết kế không hợp lý và bị phân rã . 32
II.2.7 Feature Envy – Phân bố cách giữa các lớp không hợp lý . 33
II.2.8 Data Clumps – Gôm cụm dữ liệu . 34
II.2.9 Primitive Obsession – Khả năng thể hiện dữ liệu của lớp bị hạn chế . 34
II.2.10 Switch Statements – Khối lệnh điều kiện rẽ hướng không hợp lý . 36
II.2.11 Lazy Class – Lớp được định nghĩa không cần thiết . 38
II.2.12 Speculative Generality – Cấu trúc bị thiết kế dư thừa . 38
II.2.13 Temporary Field – Lạm dụng thuộc tính tạm thời . 39
II.2.14 Message Chains –Chuỗi cách liên hoàn khó kiểm soát. 39
II.2.15 Middle Man – Quan hệ ủy quyền không hợp lý/logic . 39
II.2.16 Inapproprite Intimacy - Cấu trúc thành phần riêng không hợp lý . 41
II.2.17 Alternative Classes with Different Interfaces - Đặc tả lớp không rõ ràng 41
II.2.18 Incomplete Library Class – Sử dụng thư viện lớp chưa được hòan chỉnh 41
II.2.19 Data Class – Lớp dữ liệu độc lập . 42
II.2.20 Refused Bequest – Quan hệ kế thừa không hợp lý/logic . 43
II.2.21 Comments – Chú thích không cần 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 Mục tiêu của .NET . 45
III.1.3 Dịch vụ của .NET . 45
III.1.4 Kiến trúc của .NET . 46
III.2 NGÔN NGỮ LẬP TRÌNH C# . 47
III.2.1 Tổng quan về ngôn ngữ lập trình C# . 47
III.2.2 Đặc trưng của các ngôn ngữ lập 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ả giải pháp triển khai . 49
IV.1.2 Một số công cụ và tiện ích hỗ trợ việc dò tìm và cải tiến mã xấu . 50
IV.1.3 Thử nghiệm minh họa 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 Thực hiện kỹ thuật tái cấu trúc mã nguồn trên chương trình thực tế . 82
IV.2.2 Phân tích và đánh giá kết quả thực hiện . 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 Triển khai áp dụng trên các ngôn ngữ khác . 97
V.3.2 Thử nghiệm xây dựng một refactoring tool tích hợp vào VS.NET . 97
TÀI LIỆU THAM KHẢO . 98
 



Để tải bản Đầy Đủ của tài liệu, xin Trả lời bài viết này, Mods sẽ gửi Link download cho bạn sớm nhất qua hòm tin nhắn.
Ai cần download tài liệu gì mà không tìm thấy ở đây, thì đăng yêu cầu down tại đây nhé:
Nhận download tài liệu miễn phí

Tóm tắt nội dung tài liệu:

chung với nhau lại. Sử
dụng Extract Subclass khi các phƣơng thức kết hợp với các biến mở rộng chức
năng của lớp. Thông thƣờng không phải lúc nào tất cả các biến trong một lớp cũng
luôn đƣợc sử dụng , vì vậy chúng ta cũng có thể sử dụng Extract Class hay
Extract Subclass để trích xuất chúng nhiều lần.
- Một thủ thuật hữu ích nữa là xem xét mục đích sử dụng của các lớp kết hợp với kỹ
thuật Extract Interface để tổ chức và phân chia lớp cho hợp lý.
- Trong lập trình hƣớng đối tƣợng, khi gặp một lớp GUI có qui mô lớn cần chuyển
dữ liệu và hoạt động xử lý đến một đối tƣợng có phạm vi riêng. Điều này yêu cầu
có sự trùng lắp dữ liệu ở hai nơi cũng nhƣ sự đồng nhất trong quá trình động bộ.
Lúc này Duplicate Observed Data trong refactoring sẽ đƣợc xem xét và sử dụng.
Ví dụ: Một lớp mà có một số chức năng chỉ đƣợc sử dụng cho một vài thực thể
(instances) cá biệt thì nên sử dụng Extract Subclass để tạo một lớp con đi kèm các chức
năng đó
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 31
II.2.4 Long Parameter List - Danh sách tham số quá dài
Trong lập trình hƣớng thủ tục, việc trao đổi mọi thứ dữ liệu giữa các thủ tục và
hàm thông qua việc truyền tham số. Một giải pháp khác tốt hơn là sử dụng dữ liệu toàn
cục nhƣng tiềm ẩn nhiều rủi ro trong việc kiểm soát. Với lập trình hƣớng đối tƣợng thì
khác, chúng ta không cần chuyển mọi thứ thông qua một danh sách dài các tham số
khó hiểu mà chỉ là một ít dữ liệu cơ sở vừa đủ cho việc truy suất tất cả các giá trị cần
thiết khác luôn đƣợc cập nhật mới.
- Sử dụng Replace Parameter with Method để nhận dữ liệu từ một đối tƣợng đã
biết. Đối tƣợng này có thể là một trƣờng dữ liệu hay một tham số khác. Sử dụng
Preserve Whole Object để thay thế một nhóm dữ liệu trong lớp bởi một thành
phần dữ liệu thay thế chung của bản thân lớp đó.Với những mục dữ liệu riêng mà
không gắn liền với một đối tƣợng nào cả, sử dụng Introduce Parameter Object
- Một ngoại lệ quan trọng trong việc thực hiện những thay đổi này, đó là khi chúng
ta không muốn tạo ra một sự phụ thuộc từ đối tƣợng đƣợc gọi đến một đối tƣợng
lớn hơn. Giải pháp hợp lý trong trƣờng hợp này là chuyển dữ liệu nhƣ các tham
số, khi đó cần chú ý đến những rủi ro có liên quan. Nếu danh sách tham số quá
dài hay thƣờng xuyên thay đổi, chúng ta cần xem xét lại cấu trúc phụ thuộc.
Ví dụ 1: Sử dụng Replace Parameter with Method để rút gọn tham số phƣơng thức
public double getPrice() {
int basePrice = _quantity * _itemPrice;
int discountLevel;
if (_quantity > 100) discountLevel = 2;
else discountLevel = 1;
double finalPrice = discountedPrice (basePrice, discountLevel);
return finalPrice;
}
private double discountedPrice (int basePrice, int discountLevel) {
if (discountLevel == 2) return basePrice * 0.1;
else return basePrice * 0.05;
}
public double getPrice() {
int basePrice = _quantity * _itemPrice;
int discountLevel = getDiscountLevel();
double finalPrice = discountedPrice (basePrice);
return finalPrice;
}
private int getDiscountLevel() {
if (_quantity > 100) return 2;
else return 1;
}
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 32
private double discountedPrice (int basePrice) {
if (getDiscountLevel() == 2) return basePrice * 0.1;
else return basePrice * 0.05;
}
Ví dụ 2: Với những tham số là các mục dữ liệu riêng mà không gắn liền với một đối
tƣợng nào cả, sử dụng Introduce Parameter Object
II.2.5 Divergent Change – Cấu trúc lớp ít có tính khả biến
Cấu trúc của phần mềm phải đƣợc thiết kế sao cho dễ dàng trong việc thay đổi và
cập nhật. Nếu một lớp bị thay đổi theo nhiều cách khác nhau tùy thuộc vào các nguyên
nhân khác nhau thì chúng ta nên chia lớp đó ra làm hai, trong đó mỗi lớp đƣợc tạo ra dựa
trên yếu tố đặc trƣng thuận lợi với các cách thay đổi nêu trên. Trong trƣờng hợp chia tách
này, giải pháp chính là sử dụng Extract Class.
Ví dụ: Sử dụng kỹ thuật Extract Class tạo một lớp mới và dịch chuyển các thuộc tính và
phƣơng thức có liên quan từ lớp cũ sang
II.2.6 Shotgun Surgery – Lớp đƣợc thiết kế không hợp lý và bị phân rã
Trái ngƣợc với Divergent Change là Shotgun Surgery. Mỗi khi chúng ta thực hiện
một sự thay đổi trong chƣơng trình, thông thƣờng việc thay đổi này kéo theo một chuỗi
các thay đổi nhỏ ở nhiều lớp khác nhau và diễn ra ở khắp nơi. Lúc này việc phát hiện
chính xác và thay đổi toàn bộ là một điều rất khó khăn không loại trừ có thể thiếu sót ở
một nơi quan trọng nào đó.
- Sử dụng Move Method & Move Field để dịch chuyển (thâu gôm) các phƣơng thức
và thuộc tính từ lớp này sang lớp khác để làm cho chƣơng trình có cấu trúc rõ hơn.
- Nếu chƣa có lớp nào thích hợp để tích hợp vào thì tạo một lớp mới. Và trong
trƣờng hợp này, chúng ta sử dụng giải pháp Inline Class để tích hợp các thành
phần thay đổi này.
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 33
Ví dụ 1: Nếu một thuộc tính aField đƣợc sử dụng nhiều hơn trong lớp khác Class 2 thay
vì lớp chứa nó Class 1 thì chúng ta nên sử dụng Move Field để dịch chuyển phƣơng thức
đó sang lớp kia.
Ví dụ 2: Nếu hai lớp có qui mô nhỏ (không làm gì nhiều) và có quan hệ với nhau thì nên
sử dụng Inline Class để hợp nhất chúng lại một lớp.
II.2.7 Feature Envy – Phân bố phƣơng thức giữa các lớp không hợp lý
Trong lập trình hƣớng đối tƣợng, đôi lúc chúng ta gặp trƣờng hợp một phƣơng
thức của một lớp mà nó sử dụng hay hỗ trợ nhiều chức năng (thuộc tính và phƣơng
thức) cho một lớp khác hơn chính lớp chứa nó. Khi đó chúng ta sẽ sử dụng Extract
Method và Move Method để trích xuất và dịch chuyển phƣơng thức vào một vị trị lớp
thích hợp nhất.
Ví dụ: Một phƣơng thức của một lớp Class 1 mà nó sử dụng nhiều chức năng (thuộc tính
và phƣơng thức) của một lớp khác Class 2 hơn chính nó thì sử dụng Move Method để
dịch chuyển phƣơng thức đó sang lớp kia.
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 34
II.2.8 Data Clumps – Gôm cụm dữ liệu
Thông thƣờng trong mã nguồn, chúng ta cũng gặp trƣờng hợp cùng lúc ba hay
bốn mục dữ liệu thƣờng đi chung với nhau (nhiều thuộc tính trong lớp, các tham số
truyền cho phƣơng thức,…) và đƣợc sử dụng ở nhiều nơi. Một giải pháp tốt hơn là gôm
cụm chúng lại và chuyển sang một lớp đối tƣợng:
- Nếu các mục dữ liệu đó là các thuộc tính -> sử dụng Extract Class để định nghĩa
các lớp mới phù hợp với từng nhóm thuộc tính.
- Nếu các mục dữ liệu là các tham số -> sử dụng Introduce Parameter Object hay
Preserve Whole Object để làm gọn hơn biểu thức tham số truyền vào và thân
chƣơng trình xử lý
Ví dụ: Thay vì truy xuất từng giá trị thuộc tính riêng lẻ của một đối tƣợng và truyền các
giá trị này theo kiểu tham số cho một phƣơng thức. Chúng ta sẽ sử dụng kỹ thuật
Preserve Whole Object để truyền nguyên đối tƣợng đó.
int low = daysTempRange().getLow();
int high = daysTempRange().getHigh();
withinPlan = plan.withinRange(low, high);
withinPlan = plan.with...
 

Các chủ đề có liên quan khác

Top