Bài giảng Kỹ thuật lập trình: Chương 4 - TS. Vũ Hương Giang
Số trang: 128
Loại file: pdf
Dung lượng: 3.58 MB
Lượt xem: 12
Lượt tải: 0
Xem trước 10 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Bài giảng "Các kỹ thuật kiểm tra tính đúng đắn và tính an toàn của chương trình phần mềm" bao gồm các nội dung: Bẫy lỗi (error handling), lập trình phòng ngừa (defensive programming), kiểm thử (Testing), gỡ rối (Debugging). Mời các bạn cùng tham khảo nội dung chi tiết.
Nội dung trích xuất từ tài liệu:
Bài giảng Kỹ thuật lập trình: Chương 4 - TS. Vũ Hương Giang • Với mỗi bài toán, làm thế nào để: – Thiết kế giải thuật nhằm giải quyết bài toán đó – Cài đặt giải thuật bằng một chương trình máy tính - Hãy làm cho chương trình chạy đúng trước khi tăng tính hiệu quả của chương trình - Hãy tăng tính hiệu quả của chương trình và đồng thời thể hiện tốt phong cách lập trình của cá nhân CuuDuongThanCong.com https://fb.com/tailieudientucntt CHƯƠNG IV. CÁC KỸ THUẬT KIỂM TRA TÍNH ĐÚNG ĐẮN VÀ TÍNH AN TOÀN CỦA CHƯƠNG TRÌNH PHẦN MỀM I. Bẫy lỗi (error handling) II. Lập trình phòng ngừa (defensive programming) III. Kiểm thử (Testing) IV. Gỡ rối (Debugging) CuuDuongThanCong.com https://fb.com/tailieudientucntt Mở đầu • Lỗi: chương trình chạy không đúng như đã định • Chuỗi kiểm tra chương trình – Bẫy lỗi (error handling) – Lập trình phòng ngừa (defensive programming) – Kiểm thử (testing) – Gỡ rối (debugging) • Phân biệt: – Bẫy lỗi: Prevent errors – Lập trình phòng ngừa: Detect problems as early as possible – Kiểm thử: finished code – Gỡ rối: fixing defects uncovered by testing CuuDuongThanCong.com https://fb.com/tailieudientucntt I. BẪY LỖI CuuDuongThanCong.com https://fb.com/tailieudientucntt Nguyên tắc • Khi lỗi xảy ra cần – Định vị nguồn gây lỗi – Kiểm soát lỗi • Luôn có ý thức đề phòng các lỗi hay xảy ra trong chương trình, nhất là khi đọc file, dữ liệu do người dùng nhập vào và cấp phát bộ nhớ. • Áp dụng các biện pháp phòng ngừa ngay cả khi điều đó có thể dẫn tới việc dừng chương trình • In các lỗi bằng stderr stream. fprintf (stderr,There is an error!\n); CuuDuongThanCong.com https://fb.com/tailieudientucntt Kiểm tra cái gì để phát hiện lỗi ? • Kiểm tra mọi thao tác có thể gây lỗi khi viết CT – Nhập dữ liệu – Sử dụng dữ liệu • Ví dụ: – Kiểm tra mỗi lần mở một tệp tin hay cấp phát các ô nhớ. – Kiểm tra các phương thức người dùng nhập dữ liệu vào cho đến khi không còn nguy cơ gây ra dừng chương trình – Trong trường hợp tràn bộ nhớ (out of memory), nên in ra lỗi kết thúc chương trình (-1: error exit); – Trong trường hợp dữ liệu do người dùng đưa vào bị lỗi, tạo cơ hội cho người dùng nhập lại dữ liệu (lỗi tên file cũng có thể do người dùng nhập sai) CuuDuongThanCong.com https://fb.com/tailieudientucntt Làm gì khi phát hiện lỗi ? • Cần có cách xử lý các lỗi mà ta chờ đợi sẽ xảy ra • Tùy theo tình huống cụ thể, ta có thể – Trả về 1 giá trị trung lập – Thay thế đoạn tiếp theo của dữ liệu hợp lệ – Trả về cùng giá trị như lần trước – Thay thế giá trị hợp lệ gần nhất – Ghi vết 1 cảnh báo vào tệp – Trả về 1 mã lỗi – Gọi 1 thủ tục hay đối tượng xử lý – Hiện thông báo lỗi – Tắt máy CuuDuongThanCong.com https://fb.com/tailieudientucntt Một số lỗi nhập dữ liệu phổ biến • Dữ liệu nhập vào quá lớn (ví dụ, vượt quá kích thước kích thước lưu trữ cho phép của mảng hay của biến) • Dữ liệu nhập vào sai kiểu, giá trị quá nhỏ hoặc giá trị âm • Lỗi chia cho số 0 (divide by zero) CuuDuongThanCong.com https://fb.com/tailieudientucntt Dùng hàm bao gói (Wrappered function) • Hàm bao gói = gọi hàm gốc + bẫy lỗi • Tại mọi thời điểm cần kiểm tra lỗi của hàm gốc, dùng hàm bao gói thay vì dùng hàm gốc • Ví dụ: • Nếu phải viết đoạn mã kiểm tra lỗi mỗi lần sử dụng malloc thì rất nhàm chán. – Kiểm tra – Thông báo lỗi kiểu như “out of memory” – Thoát. • Tự viết hàm safe_malloc và sử dụng hàm này thay vì dùng malloc có sẵn – Malloc – Kiểm tra – Thông báo lỗi kiểu như “out of memory” – Thoát. CuuDuongThanCong.com https://fb.com/tailieudientucntt safe_malloc #include #include void *safe_malloc (size_t); /* Bẫy lỗi khi dùng hàm malloc */ void *safe_malloc (size_t size) /* Cấp phát bộ nhớ hoặc báo lỗi và thoát */ { void *ptr; ptr= malloc(size); if (ptr == NULL) { fprintf (stderr, “Không đủ bộ nhớ để thực hiện dòng lệnh :%d file :%s\n, __LINE__, __FILE__); exit(-1); } return ptr; } CuuDuongThanCong.com https://fb.com/tailieudientucntt Tạo giao diện rõ ràng • Các LTV giỏi luôn tìm cách làm cho mã nguồn của họ trở nên hữu dụng với những LTV khác. • Cách tốt nhất để làm việc này là viết các hàm dễ hiểu, có khả năng tái sử dụng • Các hàm tốt không cần đến quá nhiều tham số truyền vào • Để viết tốt các hàm, cần tư duy theo hướng: – Cần truyền cái gì vào để thực hiện hàm ? – Có thể lấy được cái gì ra sau khi thực hiện hàm • Nếu LTV có khả năng viết được một giao diện rõ ràng thì các hàm tự bản thân nó trở nên hiệu quả: – Các hàm được cung cấp – Cách thức truy nhập chức năng muốn cung cấp CuuDuongThanCong.com https://fb.com/tailieudientucntt Ví dụ: giao diện thể hiện được cấu trúc của chương trình pay.h Header file - enums, structs, pay.cpp prototypes #include pay.h int main() update.cpp Lấy dữ liệu vào từ người #include pay.h dùng Gọi các chương trình con Tạo file mới cho mỗi NV mới hợp lý Ghi vào file đang có cho NV đã có tên printout.cpp fileio.cpp #include pay.h #include pay.h In bảng lương của tất cả các nhân Đọc các records khi được gọi viên Ghi vào các records In các bảng lương của từng nhân Tạo bản sao viên ...
Nội dung trích xuất từ tài liệu:
Bài giảng Kỹ thuật lập trình: Chương 4 - TS. Vũ Hương Giang • Với mỗi bài toán, làm thế nào để: – Thiết kế giải thuật nhằm giải quyết bài toán đó – Cài đặt giải thuật bằng một chương trình máy tính - Hãy làm cho chương trình chạy đúng trước khi tăng tính hiệu quả của chương trình - Hãy tăng tính hiệu quả của chương trình và đồng thời thể hiện tốt phong cách lập trình của cá nhân CuuDuongThanCong.com https://fb.com/tailieudientucntt CHƯƠNG IV. CÁC KỸ THUẬT KIỂM TRA TÍNH ĐÚNG ĐẮN VÀ TÍNH AN TOÀN CỦA CHƯƠNG TRÌNH PHẦN MỀM I. Bẫy lỗi (error handling) II. Lập trình phòng ngừa (defensive programming) III. Kiểm thử (Testing) IV. Gỡ rối (Debugging) CuuDuongThanCong.com https://fb.com/tailieudientucntt Mở đầu • Lỗi: chương trình chạy không đúng như đã định • Chuỗi kiểm tra chương trình – Bẫy lỗi (error handling) – Lập trình phòng ngừa (defensive programming) – Kiểm thử (testing) – Gỡ rối (debugging) • Phân biệt: – Bẫy lỗi: Prevent errors – Lập trình phòng ngừa: Detect problems as early as possible – Kiểm thử: finished code – Gỡ rối: fixing defects uncovered by testing CuuDuongThanCong.com https://fb.com/tailieudientucntt I. BẪY LỖI CuuDuongThanCong.com https://fb.com/tailieudientucntt Nguyên tắc • Khi lỗi xảy ra cần – Định vị nguồn gây lỗi – Kiểm soát lỗi • Luôn có ý thức đề phòng các lỗi hay xảy ra trong chương trình, nhất là khi đọc file, dữ liệu do người dùng nhập vào và cấp phát bộ nhớ. • Áp dụng các biện pháp phòng ngừa ngay cả khi điều đó có thể dẫn tới việc dừng chương trình • In các lỗi bằng stderr stream. fprintf (stderr,There is an error!\n); CuuDuongThanCong.com https://fb.com/tailieudientucntt Kiểm tra cái gì để phát hiện lỗi ? • Kiểm tra mọi thao tác có thể gây lỗi khi viết CT – Nhập dữ liệu – Sử dụng dữ liệu • Ví dụ: – Kiểm tra mỗi lần mở một tệp tin hay cấp phát các ô nhớ. – Kiểm tra các phương thức người dùng nhập dữ liệu vào cho đến khi không còn nguy cơ gây ra dừng chương trình – Trong trường hợp tràn bộ nhớ (out of memory), nên in ra lỗi kết thúc chương trình (-1: error exit); – Trong trường hợp dữ liệu do người dùng đưa vào bị lỗi, tạo cơ hội cho người dùng nhập lại dữ liệu (lỗi tên file cũng có thể do người dùng nhập sai) CuuDuongThanCong.com https://fb.com/tailieudientucntt Làm gì khi phát hiện lỗi ? • Cần có cách xử lý các lỗi mà ta chờ đợi sẽ xảy ra • Tùy theo tình huống cụ thể, ta có thể – Trả về 1 giá trị trung lập – Thay thế đoạn tiếp theo của dữ liệu hợp lệ – Trả về cùng giá trị như lần trước – Thay thế giá trị hợp lệ gần nhất – Ghi vết 1 cảnh báo vào tệp – Trả về 1 mã lỗi – Gọi 1 thủ tục hay đối tượng xử lý – Hiện thông báo lỗi – Tắt máy CuuDuongThanCong.com https://fb.com/tailieudientucntt Một số lỗi nhập dữ liệu phổ biến • Dữ liệu nhập vào quá lớn (ví dụ, vượt quá kích thước kích thước lưu trữ cho phép của mảng hay của biến) • Dữ liệu nhập vào sai kiểu, giá trị quá nhỏ hoặc giá trị âm • Lỗi chia cho số 0 (divide by zero) CuuDuongThanCong.com https://fb.com/tailieudientucntt Dùng hàm bao gói (Wrappered function) • Hàm bao gói = gọi hàm gốc + bẫy lỗi • Tại mọi thời điểm cần kiểm tra lỗi của hàm gốc, dùng hàm bao gói thay vì dùng hàm gốc • Ví dụ: • Nếu phải viết đoạn mã kiểm tra lỗi mỗi lần sử dụng malloc thì rất nhàm chán. – Kiểm tra – Thông báo lỗi kiểu như “out of memory” – Thoát. • Tự viết hàm safe_malloc và sử dụng hàm này thay vì dùng malloc có sẵn – Malloc – Kiểm tra – Thông báo lỗi kiểu như “out of memory” – Thoát. CuuDuongThanCong.com https://fb.com/tailieudientucntt safe_malloc #include #include void *safe_malloc (size_t); /* Bẫy lỗi khi dùng hàm malloc */ void *safe_malloc (size_t size) /* Cấp phát bộ nhớ hoặc báo lỗi và thoát */ { void *ptr; ptr= malloc(size); if (ptr == NULL) { fprintf (stderr, “Không đủ bộ nhớ để thực hiện dòng lệnh :%d file :%s\n, __LINE__, __FILE__); exit(-1); } return ptr; } CuuDuongThanCong.com https://fb.com/tailieudientucntt Tạo giao diện rõ ràng • Các LTV giỏi luôn tìm cách làm cho mã nguồn của họ trở nên hữu dụng với những LTV khác. • Cách tốt nhất để làm việc này là viết các hàm dễ hiểu, có khả năng tái sử dụng • Các hàm tốt không cần đến quá nhiều tham số truyền vào • Để viết tốt các hàm, cần tư duy theo hướng: – Cần truyền cái gì vào để thực hiện hàm ? – Có thể lấy được cái gì ra sau khi thực hiện hàm • Nếu LTV có khả năng viết được một giao diện rõ ràng thì các hàm tự bản thân nó trở nên hiệu quả: – Các hàm được cung cấp – Cách thức truy nhập chức năng muốn cung cấp CuuDuongThanCong.com https://fb.com/tailieudientucntt Ví dụ: giao diện thể hiện được cấu trúc của chương trình pay.h Header file - enums, structs, pay.cpp prototypes #include pay.h int main() update.cpp Lấy dữ liệu vào từ người #include pay.h dùng Gọi các chương trình con Tạo file mới cho mỗi NV mới hợp lý Ghi vào file đang có cho NV đã có tên printout.cpp fileio.cpp #include pay.h #include pay.h In bảng lương của tất cả các nhân Đọc các records khi được gọi viên Ghi vào các records In các bảng lương của từng nhân Tạo bản sao viên ...
Tìm kiếm theo từ khóa liên quan:
Bài giảng Kỹ thuật lập trình Kỹ thuật lập trình Chương trình phần mềm Kiểm tra chương trình phần mềm Lập trình phòng ngừaGợi ý tài liệu liên quan:
-
Kỹ thuật lập trình trên Visual Basic 2005
148 trang 247 0 0 -
NGÂN HÀNG CÂU HỎI TRẮC NGHIỆM THIẾT KẾ WEB
8 trang 188 0 0 -
Giới thiệu môn học Ngôn ngữ lập trình C++
5 trang 181 0 0 -
Bài giảng Nhập môn về lập trình - Chương 1: Giới thiệu về máy tính và lập trình
30 trang 147 0 0 -
Luận văn: Nghiên cứu kỹ thuật giấu tin trong ảnh Gif
33 trang 147 0 0 -
Báo cáo thực tập Công nghệ thông tin: Lập trình game trên Unity
27 trang 115 0 0 -
Giáo trình về phân tích thiết kế hệ thống thông tin
113 trang 113 0 0 -
LUẬN VĂN: Tìm hiểu kỹ thuật tạo bóng cứng trong đồ họa 3D
41 trang 104 0 0 -
Bài giảng Kỹ thuật lập trình - Chương 10: Tổng kết môn học (Trường Đại học Bách khoa Hà Nội)
67 trang 103 0 0 -
Giáo trình Nhập môn lập trình VB6: Phần 2
184 trang 84 0 0