Ứ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#

99 541 0
Ứ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#

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Ứ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#

BỘ GIÁO DỤC ĐÀ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 NGUỒN ĐỂ TRIỂN KHAI TÌM CẢI TIẾN CÁC ĐOẠN 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 nguồn để triển khai tìm cải tiến các đọan 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 là 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 NGUỒN (REFACTORING) 7 I.1 ĐỊNH NGHĨA KỸ THUẬT TÁI CẤU TRÚC 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 nguồn . 19 I.2 HIỆU QUẢ CỦA TÁI CẤU TRÚC 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 nguồn phần mềm dễ hiểu 20 I.2.3 Refactoring giúp phát hiện 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 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 NGUỒN 23 I.4.1 Danh mục các kỹ thuật tái cấu trúc nguồn . 23 I.5 NHẬN XÉT KẾT LUẬN 26 CHƢƠNG II: LỖI CẤU TRÚC (BAD SMELLS) TRONG 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 GIẢI PHÁP CẢI TIẾN . 27 II.2.1 Duplicated Code - Trùng lặp . 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 – 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ý bị phân rã 32 II.2.7 Feature Envy – Phân bố phƣơng thức 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 phƣơng thức 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 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 cần thiết 43 II.3 NHẬN XÉT KẾT LUẬN 44 CHƢƠNG III: NỀN TẢNG .NET 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 NGUỒN ĐỂ TÌM CẢI TIẾN CÁC ĐOẠN XẤU TRONG CHƢƠNG TRÌNH C# . 49 IV.1 GIẢI PHÁP 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ụ tiện ích hỗ trợ việc tìm cải tiến 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 đánh giá 80 IV.2 ỨNG DỤNG KỸ THUẬT TÁI CẤU TRÚC NGUỒN ĐỂ TÌM CẢI TIẾN CÁC ĐOẠN 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 nguồn trên chƣơng trình thực tế . 82 IV.2.2 Phân tích đánh giá kết quả thực hiện 94 IV.3 NHẬN XÉT 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 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 triển ứng dụng VS.NET 48 H.4.1: Đặc tả kịch bản giải pháp triển 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 của CodeIT.Once 60 H.4.12: Minh họa kỹ thuật Convert Method to Property của 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 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 6 MỞ ĐẦU Trong qui trình phát triển phần mềm hiện nay, một thực tế đang tồn tạicác công ty sản xuất phần mềm là các lập trình viên thƣờng xem nhẹ việc tinh chỉnh nguồn kiểm thử. Ngoài lý do đơn giản vì đó là một công việc nhàm chán, khó đƣợc chấp nhận đối với việc quản lý vì sự tốn kém mất thời gian, còn một nguyên nhân khác là chúng ta không có những phƣơng pháp tiện ích tốt hỗ trợ cho những việc này. Điều này dẫn đến việc phần lớn các phần mềm không đƣợc kiểm thử đầy đủ phát hành với các nguy cơ lỗi tiềm ẩn. Phƣơng thức phát triển phần mềm linh hoạt[15] bắt đầu xuất hiện vào đầu những năm 90 với mục tiêu là phần mềm phải có khả năng biến đổi, phát triển tiến hóa theo thời gian không cần phải làm lại từ đầu. Phƣơng thức này đƣợc thực hiện dựa trên hai kỹ thuật chính là tái cấu trúc nguồn (refactoring) kiểm thử (developer testing). Vì thế việc nghiên cứu ứng dụng kỹ thuật tái cấu trúc nguồn nhằm tối ƣu hóa nguồn nâng cao hiệu quả kiểm thử là một nhu cầu cần thiết trong quá trình thực hiện phát triển phần mềm. Đề tài “Ứng dụng kỹ thuật tái cấu trúc nguồn để triển khai tìm cải tiến các đoạn xấu trong chƣơng trình C#” đƣợc thực hiện với mục đích nghiên cứu cơ sở lý thuyết kỹ thuật tái cấu trúc nguồn áp dụng để triển khai việc tìm cải tiến xấu (lỗi cấu trúc) trong các chƣơng trình hiện đại phổ biến hiện nay (C#). Toàn bộ nội dung của luận văn bao gồm các chƣơng: Chƣơng 1: Kỹ thuật tái cấu trúc nguồn (refectoring) Chƣơng 2: xấu (bad smells) giải pháp cải tiến dựa trên refactoring Chƣơng 3: Nền tảng .NET ngôn ngữ lập trình C# Chƣơng 4: Ứng dụng kỹ thuật tái cấu trúc nguồn để tìm cải thiện xấu trong các chƣơng trình C# Chƣơng 5: Kết luận 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 7 CHƢƠNG I: KỸ THUẬT TÁI CẤU TRÚC NGUỒN (REFACTORING) I.1 ĐỊNH NGHĨA KỸ THUẬT TÁI CẤU TRÚC NGUỒN I.1.1 Ví dụ minh họa Phƣơng thức tiếp cận tìm hiểu hiệu quả nhất với một khái niệm hay một kỹ thuật mới trong tin học là thông qua các ví dụ minh họa [11]. Với ví dụ dƣới đây, chúng ta sẽ hiểu refactoring là gì cũng nhƣ cách thực hiện hiệu quả của nó trong qui trình công nghệ phát triển phần mềm. Bài toán ví dụ: Chương trình trả lại kết quả danh sách các số nguyên tố. (Bài toán này sử dụng thuật toán Eratosthenes) Nội dung thuật toán Eratosthenes: - Viết một danh sách các số từ 2 tới maxNumbers ta cần tìm. Gọi là list A. - Viết số 2, số nguyên tố đầu tiên, vào một list kết quả. Gọi là list B. - Xóa bỏ 2 bội của 2 khỏi list A. - Số đầu tiên còn lại trong list A là số nguyên tố. Viết số này sang list B. - Xóa bỏ số đó tất cả bội của nó khỏi list A. - Lặp lại các bƣớc 4 and 5 cho tới khi không còn số nào trong list A. Chƣơng trình khởi đầu: public class PrimeNumbersGetter { private int maxNumber; public PrimeNumbersGetter(int maxNumber){ this.maxNumber = maxNumber; } public int[] GetPrimeNumbers() { // Use Eratosthenes's sieve bool[] numbers = new bool[maxNumber + 1]; for (int i = 0; i < numbers.Length; ++i){ umbers[i] = true; } int j = 2; while (j <= (int)Math.Sqrt(maxNumber) + 1) { for (int k = j + j; k <= maxNumber; k += j){ numbers[k] = false; } j++; while (!numbers[j]) { j++; if (j > maxNumber) break; } } } 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 8 List<int> l = new List<int>(); for (int k = 2; k <= maxNumber; ++k) { if (numbers[k]) l.Add(k); } return l.ToArray(); } Trƣớc khi refactoring, chúng ta cần viết kiểm thử cho phần nguồn đó. Phần kiểm thử này là yếu tố cần thiết bởi vì quá trình refactoring có thể phát sinh lỗi. Mỗi khi chúng ta thực hiện một lần refactoring, chúng ta nên thực hiện kiểm thử lại chƣơng trình một lần, để đảm bảo chƣơng trình không bị lỗi. Kiểm thử tốt làm giảm thời gian cần thiết để tìm lỗi. Chúng ta nên thực hiện xen kẽ việc kiểm thử refactoring để mỗi khi có lỗi phát sinh, thì cũng không quá khó để tìm ra lỗi đó. Trong ví dụ này, chúng có thể thêm đoạn kiểm thử nhƣ sau: public class Program { public static void Main(string[] args) { if (!IsEqualNumbers(new PrimeNumbersGetter(4).GetPrimeNumbers(), new int[] { 2, 3 })) return; if (!IsEqualNumbers(new PrimeNumbersGetter(5).GetPrimeNumbers(), new int[] { 2, 3, 5 })) return; if (!IsEqualNumbers(new PrimeNumbersGetter(6).GetPrimeNumbers(), new int[] { 2, 3, 5 })) return; if (!IsEqualNumbers(new PrimeNumbersGetter(100).GetPrimeNumbers(), new int[] { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43,47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 })) return; Console.WriteLine("Success!"); } private static bool IsEqualNumbers(int[] numbers1, int[] numbers2){ if (numbers1.Length != numbers2.Length) return false; for (int i = 0; i < numbers1.Length; ++i) { if (numbers1[i] != numbers2[i]) return false; } } return true; } Ta nhận thấy rằng phƣơng thức này quá dài, nó xử lý rất nhiều công việc khác nhau. Trong trƣờng hợp này, nên sử dụngthuật “Extract Method” trong cácthuật refactoring nhằm tạo ra các phƣơng thức nhỏ hơn, dễ đọc dễ bảo trì khi có yêu cầu thay đổi chƣơng trình. Với đoạn nguồn khởi tạo list các số ban đầu ( list 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 9 bool[] numbers = new bool[maxNumber + 1]; for (int i = 0; i < numbers.Length; ++i){ numbers[i] = true; } Ta nên trích xuất nó thành một phƣơng thức khác, sử dụng “Extract Method”. public int[] GetPrimeNumbers() { bool[] numbers = InitialNumbers(); // Other codes. } private bool[] InitialNumbers(){ bool[] numbers = new bool[maxNumber + 1]; for (int i = 0; i < numbers.Length; ++i){ numbers[i] = true; } return numbers; } Sau khi thực hiện việc refactoring nhƣ trên, chúng ta nên nhớ rằng phải thực hiện chạy lại chƣơng trình kiểm thử để đảm báo rằng việc refactoring không làm thay đổi tính đúng đắn của chƣơng trình. Tƣơng tự với đoạn nguồn thực hiện xuất ra danh sách kết quả chứa các số nguyên tố (list B) List<int> l = new List<int>(); for (int k = 2; k <= maxNumber; ++k) { if (numbers[k]) l.Add(k); } return l.ToArray(); Ta cũng tách nó ra thành một phƣơng thức khác public int[] GetPrimeNumbers() { // Other codes. return GetPrimeNumbersArray(numbers); } private int[] GetPrimeNumbersArray(bool[] numbers) { List<int> l = new List<int>(); for (int k = 2; k <= maxNumber; ++k) { if (numbers[k]) l.Add(k); } return l.ToArray(); } 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 10 Bây giờ chúng ta sẽ tinh chỉnh ở phần nguồn còn lại, đó là vòng lặp while int j = 2; while (j <= (int)Math.Sqrt(maxNumber) + 1){ for (int k = j + j; k <= maxNumber; k += j){ numbers[k] = false; } j++; while (!numbers[j]){ j++; if (j > maxNumber) break; } } Với đoạn nguồn trên, câu lệnh if là không cần thiết, ta có thể bỏ đi, đƣa điều kiện lên vòng while nhƣ sau: int j = 2; while (j <= (int)Math.Sqrt(maxNumber) + 1) { for (int k = j + j; k <= maxNumber; k += j) { numbers[k] = false; } j++; while (!numbers[j] && j < maxNumber) { j++; } } Ta thấy rằng, câu lệnh điều khiển trong vòng for không “đẹp” khó đọc, ta nên sửa đổi tên biến k thành i. int j = 2; while (j <= (int)Math.Sqrt(maxNumber) + 1) { for (int i = 2; i * j <= maxNumber; i++){ numbers[i * j] = false; } j++; while (!numbers[j] && j < maxNumber) { j++; } } Với vòng while ở trên, mục đích chỉ là duyệt danh sách các phần tử trong list A, nên ta có thể chuyển sang sử dụng vòng lặp for nhƣ sau: for (int j = 2; j <= (int)Math.Sqrt(maxNumber) + 1; j++) { if (!numbers[j]) continue; for (int i = 2; i * j <= maxNumber; i++) { numbers[i * j] = false; } } [...]... nhằm hỗ trợ cho các nhà phát triển trong việc rút ngắn thời gian tạo nên các phần mềm có chất lƣợng cao ổn định, đáp ứng tốt các yêu cầu hoạt động của hiện tại những thay đổi cần thiết trong tƣơng lai I.4.1 Danh mục các kỹ thuật tái cấu trúcnguồn Dƣới đây là danh mục các kỹ thuật tái cấu trúcnguồn đƣợc liệt kê theo nhóm: STT Kỹ thuật Refactoring Diễn giải/Mục đích sử dụng Composing Methods... KỸ THUẬT TÁI CẤU TRÚC NGUỒN Refactoring là một trong những phƣơng pháp nhằm nâng cao chất lƣợng phần mềm đã bắt đầu đƣợc nghiên cứu ứng dụng những năm 90 trong qui trình phát triển phần mềm Qua quá trình nghiên cứu phát triển, một tập các kỹ thuật refactoring đã đƣợc đặc tả chi tiết phần lớn các kỹ thuật refactoring trên đã đang dần đƣợc tích hợp vào trong các công cụ phát triển phần... hiểu đoạn nguồn từ đó giúp chúng ta trong việc phát hiện lỗi Trong quá trình tìm lỗi, việc các lập trình viên phải đọc hàng ngàn dòng nguồn để tìm lỗi là điều thƣờng xuyên xảy ra Lúc này refactoring sẽ giúp chúng ta hiểu sâu những đoạn nguồn làm gì, từ đó có thể có đƣợc những suy luận phán đoán về các khả năng lỗi xảy ra tìm đúng đến đoạn nguồn cần chỉnh sửa Một khi làm rõ cấu trúc. .. dung đã đƣợc trình bày ở trên về cơ sở lý thuyết của kỹ thuật tái cấu trúcnguồn (refactoring), đó là một kỹ thuật làm thay đổi cấu trúc nội tại phần mềm, làm cho phần mềm dễ hiểu hơn ít tốn chi phí để cập nhật không làm thay đổi ứng xử bên ngoài Hiện tại kỹ thuật mới này đang đƣợc áp dụng triển khaicác quốc gia có nền công nghiệp phần mềm phát triển (Mỹ, Nhật, Ấn Độ, ) đang tiến đến... năng xảy ra lỗi trong quá trình hoạt động Các dấu hiệu đó có thể là: chƣơng trình đƣợc thiết kế không logic, các phân đoạn nguồncấu trúc không đồng nhất khó hiểu, nguồn trùng lắp, tên hàm biến khó kiểm soát, lớp phƣơng thức phức tạp, v.v Thông thƣờng các dấu hiệu này sẽ đƣợc các nhà phát triển lập trình phát hiện tinh chỉnh qua các bƣớc trong qui trình phát triển phần mềm dựa... đề xuất một tập các xấu thƣờng gặp[4] giải pháp cải tiến dựa trên kỹ thuật refactoring II.2.1 Duplicated Code - Trùng lặp Nếu trong nguồn tồn tại những đoạn trùng lặp ở nhiều nơi: - Sử dụng Extract Method để làm triệt tiêu các đoạn trùng lặp bên trong một lớp - Khi hai lớp đồng kế thừa từ một lớp cha (sibling classes) có các nguồn trùng lặp, áp dụng Extract Method trong cả hai lớp... công ty lớn, các lập trình viên sẽ đƣợc huấn luyện đào tạo để tuân thủ các yêu cầu làm việc: nhƣ quy tắc đặt tên biến, khi viết nguồn áp dụng partern nào, xây dựng unit test ra sao I.3 KHI NÀO THỰC HIỆN TÁI CẤU TRÚC NGUỒN Nhƣ trình bày ở trên, việc áp dụng kỹ thuật refactoring đem lại những hiệu quả cải tiến trong qui trình phát triển phần mềm hiện đại Vậy chúng ta sẽ thực hiện nó trong những... dụ ta trình bày trên, ta có thể thấy việc refactoring thực sự đơn giản nhƣng chỉ với các bƣớc đơn giản nhƣ vậy thôi cũng đã làm cho đoạn nguồn dễ đọc dễ hiểu hơn rất nhiều Vậy refactoring là gì hiệu quả của nó nhƣ thế nào trong quá trình phát triển phần mềm I.1.2 Định nghĩa kỹ thuật tái cấu trúcnguồn Chúng ta có hai khái niệm định nghĩa [4] khi tiếp cận thuật ngữ tái cấu trúc mã nguồn. .. thực thi của đoạn cần chỉnh sửa Để làm đƣợc việc đó, chúng ta cần phải làm cho đoạn dễ đọc Học viên thực hiện: Nhiêu Lập Hòa 22 Luận văn tốt nghiệp cao học – Khóa 2005 - 2008 hiểu hơn Nhƣ vậy trong quá trình sửa lỗi, chúng ta nhìn phân tích đoạn nguồn để hiểu refactor để cải thiện sự hiểu biết của mình Thông thƣờng chúng ta dự đoán qui trình hoạt động của đoạn hiện tại để tìm lỗi Tuy... việc refactoring nguồn Nhƣ vậy có thể xem xấu là điều kiện để thực thi việc refactoring nguồn của một chƣơng trình hay nói đúng hơn đó là cặp song hành: nếu một nguồn chƣơng trình có bad smells thì refactoring để làm cho chƣơng trình tốt hơn II.2 LỖI CẤU TRÚC GIẢI PHÁP CẢI TIẾN Dựa trên kinh nghiệm nhiều năm lập trình nghiên cứu về refactoring, hai chuyên gia Kent Beck Marting Fowler

Ngày đăng: 27/04/2013, 22:04

Hình ảnh liên quan

Hình 3.1: Kiến trúc nền tảng .NET - Ứ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ình 3.1.

Kiến trúc nền tảng .NET Xem tại trang 46 của tài liệu.
Hình 3.2: Môi trƣờng phát triển ứng dụng Visual Studio.NET (2005) -Solution Explorer:  hiển thị tất cả các project, các files theo dạng cây  - Ứ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ình 3.2.

Môi trƣờng phát triển ứng dụng Visual Studio.NET (2005) -Solution Explorer: hiển thị tất cả các project, các files theo dạng cây Xem tại trang 48 của tài liệu.
Hình 4.1: Đặc tả kịch bản giải pháp triển khai Giải pháp tổng thể bao gồm các thành phần sau:  - Ứ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ình 4.1.

Đặc tả kịch bản giải pháp triển khai Giải pháp tổng thể bao gồm các thành phần sau: Xem tại trang 49 của tài liệu.
Hình 4.3: Màn hình trình chức năng refactor của Visual Assi tX for Visual Studio.NET - Ứ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ình 4.3.

Màn hình trình chức năng refactor của Visual Assi tX for Visual Studio.NET Xem tại trang 51 của tài liệu.
Hình 4.4: Màn hình trình chức năng refactor của C# Refactory for Visual Studio.NET - Ứ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ình 4.4.

Màn hình trình chức năng refactor của C# Refactory for Visual Studio.NET Xem tại trang 52 của tài liệu.
Hình 4.5: Màn hình trình chức năng refactor của .NET Refactor for C# &amp; VB.NET - Ứ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ình 4.5.

Màn hình trình chức năng refactor của .NET Refactor for C# &amp; VB.NET Xem tại trang 53 của tài liệu.
Hình 4.6: Màn hình trình chức năng refactor của CodeIT.Once for .NET - Ứ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ình 4.6.

Màn hình trình chức năng refactor của CodeIT.Once for .NET Xem tại trang 54 của tài liệu.
Hình 4.7: Màn hình trình chức năng refactor của JetBrances ReShape - Ứ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ình 4.7.

Màn hình trình chức năng refactor của JetBrances ReShape Xem tại trang 55 của tài liệu.
Hình 4.10: Màn hình kết quả minh họa kỹ thuật Change Signature - Ứ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ình 4.10.

Màn hình kết quả minh họa kỹ thuật Change Signature Xem tại trang 58 của tài liệu.
Hình 4.9: Màn hình minh họa kỹ thuật Change Signature trong JetBrains ReSharper - Ứ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ình 4.9.

Màn hình minh họa kỹ thuật Change Signature trong JetBrains ReSharper Xem tại trang 58 của tài liệu.
Hình 4.13: Màn hình kết quả kỹ thuật Convert Method to Property - Ứ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ình 4.13.

Màn hình kết quả kỹ thuật Convert Method to Property Xem tại trang 61 của tài liệu.
Hình 4.12: Màn hình minh họa kỹ thuật Convert Method to Property của ReSharper - Ứ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ình 4.12.

Màn hình minh họa kỹ thuật Convert Method to Property của ReSharper Xem tại trang 61 của tài liệu.
Hình 4.15: Màn hình kết quả kỹ thuật Decompose/Simplify Conditional - Ứ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ình 4.15.

Màn hình kết quả kỹ thuật Decompose/Simplify Conditional Xem tại trang 63 của tài liệu.
Hình 4.14: Màn hình minh họa kỹ thuật Decompose/Simplify Conditional - Ứ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ình 4.14.

Màn hình minh họa kỹ thuật Decompose/Simplify Conditional Xem tại trang 63 của tài liệu.
Hình 4.18: Màn hình kết quả kỹ thuật Encapsulate Field - Ứ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ình 4.18.

Màn hình kết quả kỹ thuật Encapsulate Field Xem tại trang 66 của tài liệu.
Hình 4.17: Màn hình minh họa kỹ thuật Encapsulate Field của Visual Assi tX for .NET - Ứ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ình 4.17.

Màn hình minh họa kỹ thuật Encapsulate Field của Visual Assi tX for .NET Xem tại trang 66 của tài liệu.
Hình 4.19: Màn hình minh họa kỹ thuật Extract Interface của Refactor trong VS.NET - Ứ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ình 4.19.

Màn hình minh họa kỹ thuật Extract Interface của Refactor trong VS.NET Xem tại trang 68 của tài liệu.
Hình 4.21: Màn hình kết quả kỹ thuật Extract Interface - Ứ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ình 4.21.

Màn hình kết quả kỹ thuật Extract Interface Xem tại trang 69 của tài liệu.
Hình 4.23: Màn hình kết quả kỹ thuật Extract Method - Ứ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ình 4.23.

Màn hình kết quả kỹ thuật Extract Method Xem tại trang 71 của tài liệu.
Hình 4.22: Màn hình minh họa kỹ thuật Extract Method của Refactor trong VS.NET - Ứ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ình 4.22.

Màn hình minh họa kỹ thuật Extract Method của Refactor trong VS.NET Xem tại trang 71 của tài liệu.
Hình 4.24: Màn hình minh họa kỹ thuật InlineVariable của CodeIT.Once for .NET - Ứ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ình 4.24.

Màn hình minh họa kỹ thuật InlineVariable của CodeIT.Once for .NET Xem tại trang 73 của tài liệu.
Hình 4.26: Màn hình minh họa kỹ thuật Promote Local Variable to Parameter của VS.NET - Ứ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ình 4.26.

Màn hình minh họa kỹ thuật Promote Local Variable to Parameter của VS.NET Xem tại trang 75 của tài liệu.
Hình 4.27: Màn hình minh họa kỹ thuật Promote Local Variable to Parameter của CodeIT.Once  - Ứ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ình 4.27.

Màn hình minh họa kỹ thuật Promote Local Variable to Parameter của CodeIT.Once Xem tại trang 75 của tài liệu.
Hình 4.29: Màn hình kết quả kỹ thuật Promote Local Variable to Parameter - Ứ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ình 4.29.

Màn hình kết quả kỹ thuật Promote Local Variable to Parameter Xem tại trang 76 của tài liệu.
Hình 4.28: Màn hình minh họa kỹ thuật Promote Local Variable to Parameter của JetBrains ReSharper  - Ứ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ình 4.28.

Màn hình minh họa kỹ thuật Promote Local Variable to Parameter của JetBrains ReSharper Xem tại trang 76 của tài liệu.
Hình 4.30: Màn hình minh họa kỹ thuật Rename Variables của Refactor trong VS.NET - Ứ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ình 4.30.

Màn hình minh họa kỹ thuật Rename Variables của Refactor trong VS.NET Xem tại trang 78 của tài liệu.
Hình 4.32: Màn hình kết quả kỹ thuật Rename Variables - Ứ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ình 4.32.

Màn hình kết quả kỹ thuật Rename Variables Xem tại trang 79 của tài liệu.
Hình 4.31: Màn hình minh họa kỹ thuật Rename Variables của Visual Assi tX for NET - Ứ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ình 4.31.

Màn hình minh họa kỹ thuật Rename Variables của Visual Assi tX for NET Xem tại trang 79 của tài liệu.
Hình 4.34: Màn hình kết quả chạy chƣơng trình khi chƣa refactoring - Ứ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ình 4.34.

Màn hình kết quả chạy chƣơng trình khi chƣa refactoring Xem tại trang 84 của tài liệu.
Hình 4.35: Màn hình kết quả chạy chƣơng trình sau khi refactoring - Ứ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ình 4.35.

Màn hình kết quả chạy chƣơng trình sau khi refactoring Xem tại trang 91 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan