Bài giảng Kỹ nghệ phần mềm - Nguyễn Văn Vỵ - Bài 8: Lập trình
?Sản phẩm phần mềm tốt khi
phân tích tốt
thiết kế tốt
lập trình tốt
kiểm thử chặt chẽ
?kỹ thuật lập trình tốt
chuyên nghiệp (tuân theo các chuẩn)
ổn định
hiệu quả
o đối t−ợng hμm hủy đối t−ợng Bộ mụn Cụng nghệ phần mềm – ĐHCN 39 NguyễnVănVỵ int use_stack() { int m; Stack s(10); ... s.push(m); ... return 0; } đối t−ợng s đ−ợc khởi tạo, hμm khởi tạo đ−ợc gọi tự động hết phạm vi sử dụng, đối t−ợng s đ−ợc hủy, hμm hủy đ−ợc gọi tự động Bộ nhớ động với C++ Bộ mụn Cụng nghệ phần mềm – ĐHCN 40 NguyễnVănVỵ Định kiểu dữ liệu Nhiều lỗi lập trình do gán dữ liệu sai kiểu Các ngôn ngữ bậc cao cung cấp nhiều kiểu dữ liệu vμ cho phép đặc tả miền dữ liệu Tên kiểu có nghĩa lμm cho ch−ơng trình dễ hiểu typedef enum {Green, Yellow, Red} TLColor; ... TLColor CurrentColor; CurrentColor = Red; CurrentColor = 4; phát hiện các lỗi sai kiểu khi biên dịch Bộ mụn Cụng nghệ phần mềm – ĐHCN 41 NguyễnVănVỵ Lớp/kiểu dữ liệu trừu t−ợng Mức cao hơn của định kiểu dữ liệu lμ xây dựng lớp đối t−ợng Kiểm tra động về tính đúng đắn của dữ liệu class PrimeNumber { private: int value; public: ... int set(int val, int& err_code) { // verify val // if val is not a prime number // set err_code = 1 ... } }; Bộ mụn Cụng nghệ phần mềm – ĐHCN 42 NguyễnVănVỵ ... PrimeNumber p; int n, err_code; err_code = 1; while (err_code) { cout << "input a prime number: "; cin >> n; p.set(n, err_code); } gán vμ kiểm tra tính hơp lệ tự động Lớp/kiểu dữ liệu trừu t−ợng Bộ mụn Cụng nghệ phần mềm – ĐHCN 43 NguyễnVănVỵ Lập trình phòng thủ (Defensive programming) Nhiều lệnh có khả năng sinh lỗi – lệnh vμo/ra – các phép toán – thao tác với bộ nhớ – truyền tham số sai kiểu Dự đoán khả năng xuất hiện lỗi Khắc phục lỗi – l−u trạng thái an toμn – quay lại trạng thái an toμn gần nhất Bộ mụn Cụng nghệ phần mềm – ĐHCN 44 NguyễnVănVỵ Lệnh vμo ra dữ liệu không hợp lệ trμn bộ đệm (kiểu ký tự) lỗi thao tác file (sai tên, ch−a đ−ợc mở,) Các phép toán lỗi chia 0 trμn số so sánh số thực (bằng nhau) Lập trình phòng thủ (Defensive programming) Bộ mụn Cụng nghệ phần mềm – ĐHCN 45 NguyễnVănVỵ Thao tác bộ nhớ quên cấp phát, quên giải phóng bộ nhớ thiếu bộ nhớ sai địa chỉ, trμn bộ nhớ Lập trình phòng thủ (Defensive programming) Bộ mụn Cụng nghệ phần mềm – ĐHCN 46 NguyễnVănVỵ Lập trình phòng thủ FILE* fp; fp = fopen("data", "r"); FILE* fp; if (NULL == (fp = fopen("data", "r")) { fprintf(stderr, "can not open file..."); ... } Bộ mụn Cụng nghệ phần mềm – ĐHCN 47 NguyễnVănVỵ Lập trình thứ lỗi Fault tolerance programming Không thể loại trừ hoμn toμn lỗi Cần có các hệ thống có độ tin cậy đặc biệt Dung thứ lỗi: chấp nhận sự xuất hiện lỗi lập trình Phát hiện, khắc phục lỗi Khởi nguyên từ thứ lỗi phần cứng Dựa trên nguyên tắc song song hóa chức năng Bộ mụn Cụng nghệ phần mềm – ĐHCN 48 NguyễnVănVỵ Nguyên lý thứ lỗi Song song hóa thiết bị Dùng thông tin d− thừa để khôi phục dữ liệu system 1 system 2 system N ... xác suất có lỗi α <1 xác suất cả hệ thống ngừng hoạt động αN Error Correction Code ECC parity check, check sum Bộ mụn Cụng nghệ phần mềm – ĐHCN 49 NguyễnVănVỵ N - version programming version 1 version 2 version 3 comparison sử dụng nhiều nhóm lập trình so sánh kết quả cùng thuật toán thì có xu h−ớng mắc cùng lỗi Bộ mụn Cụng nghệ phần mềm – ĐHCN 50 NguyễnVănVỵ Khối phục hồi (Recovery block) Thuật toán 1 sử dụng các thuật toán khác nhau kiểm tra tính hợp lệ của kết quả Kiểm thử chấp nhận Thuật toán 2 Thuật toán 3 quick sort bubble sort simple sort Bộ mụn Cụng nghệ phần mềm – ĐHCN 51 NguyễnVănVỵ Thứ lỗi dữ liệu (Data fault tolerance) Phục hồi lùi kiểm tra tính hợp lệ của dữ liệu mỗi khi biến đổi chỉ chấp nhận các dữ liệu hợp lệ Phục hồi tiến dùng dữ liệu d− thừa kiểm tra vμ khôi phục dữ liệu Bộ mụn Cụng nghệ phần mềm – ĐHCN 52 NguyễnVănVỵ H−ớng hiệu quả thực hiện Phần mềm ngμy cμng phức tạp, đa dạng mô phỏng ứng dụng thời gian thực phần mềm nhúng trò chơi Hiệu quả thực hiện luôn cần đ−ợc xem xét thuật toán hiệu quả kỹ thuật lập trình hiệu quả ngôn ngữ lập trình hiệu quả Bộ mụn Cụng nghệ phần mềm – ĐHCN 53 NguyễnVănVỵ Cải thiện tốc độ Tối −u hóa chu trình đ−a phép toán bất biến ra ngoμi chu trình tính sẵn giá trị đ−ợc sử dụng nhiều lần Hạn chế gọi hμm nhỏ với tần số cao phí tổn cho gọi hμm nhỏ dùng hμm inline, dùng macro Hạn chế truyền tham số trị lμ cấu trúc phức tạp tham số đ−ợc copy lên stack truyền tham số biến (tham chiếu) Bộ mụn Cụng nghệ phần mềm – ĐHCN 54 NguyễnVănVỵ Phí tổn cho gọi hμm/thủ tục Copy tham số lên stack Copy giá trị trả lại từ stack Chuyển điều khiển ch−ơng trình mất tính liên tục của dòng lệnh mất tính cục bộ của cache Bộ mụn Cụng nghệ phần mềm – ĐHCN 55 NguyễnVănVỵ Macro vμ hμm inline #define CUBE(x) (x*x*x) CUBE(n+1) inline int cube(int x) { return x*x*x;} không có kiểu không an toμn Bộ mụn Cụng nghệ phần mềm – ĐHCN 56 NguyễnVănVỵ Truyền tham số Tham số trị copy giá trị (bộ nhớ) của tham số lên stack không hiệu quả với biến kiểu cấu trúc lớn không an toμn với các cấu trúc phức tạp Tham số biến/tham chiếu copy địa chỉ của tham số lên stack địa chỉ có độ lớn cố định (4 bytes) nội dung có thể bị thay đổi (dùng từ khóa const) Bộ mụn Cụng nghệ phần mềm – ĐHCN 57 NguyễnVănVỵ Cải thiện tốc độ (tiếp) Tránh dùng mảng nhiều chiều Tránh dùng biến con trỏ Dùng các kiểu dữ liệu đơn giản double --> float Rút gọn các biểu thức Dùng các phép toán nhanh ++i; n<<2; Bộ mụn Cụng nghệ phần mềm – ĐHCN 58 NguyễnVănVỵ Cải thiện tốc độ (tránh lệnh rẽ nhánh) Tránh gọi hμm (ch−ơng trình con) Tránh vòng lặp Tránh điều kiện (if) tận dụng hiệu quả pipeline Bộ mụn Cụng nghệ phần mềm – ĐHCN 59 NguyễnVănVỵ Pipeline F D R E W F D R E W F D R E W F D R E W F D R E W lệnh i lệnh i+1 time lệnh i+2 lệnh i+3 lệnh i+4 Bộ mụn Cụng nghệ phần mềm – ĐHCN 60 NguyễnVănVỵ Hiệu quả vμo/ra Tối thiểu các yêu cầu input/output tốc độ thiết bị ngoại vi chậm loại bỏ các inp/out không cần thiết for (i=0; i<10000000; i++) { ... printf("i = %d\n", i); } Input/Output theo khối tối thiểu số lần gọi th− viện input/output tận dụng hiệu quả bộ đệm input/output Bộ mụn Cụng nghệ phần mềm – ĐHCN 61 NguyễnVănVỵ Person a[N]; ... for (i=0; i<N; i++) { fread(&a[i], sizeof(Person), 1, fp); ... } fread(a, sizeof(Person), N, fp); for (i=0; i<N; i++) { ... } Bộ mụn Cụng nghệ phần mềm – ĐHCN 62 NguyễnVănVỵ Phong cách lập trình với C/C++ Phần mềm đ−ợc cấu thμnh bởi nhiều tệp, các tệp th−ờng đ−ợc biên dịch riêng rẽ .c: khai báo dữ liệu, hμm .h: định nghĩa các kiểu dữ liệu dùng chung Không khai báo dữ liệu, định nghĩa hμm trong các tệp header (.h) Bộ mụn Cụng nghệ phần mềm – ĐHCN 63 NguyễnVănVỵ Các b−ớc xây dựng phần mềm trên C/C++ Soạn thảo (edit) Tiền biên dịch (pre-compile) Biên dịch (compile) Kết nối (link) Thực hiện (execute) Bộ mụn Cụng nghệ phần mềm – ĐHCN 64 NguyễnVănVỵ date.h typedef struct { int year, mon, day; } Date; Date my_birthday; void print_date(Date d) { printf(”year: %d, mon: %d, day: %d”, d.year, d.mon, d.day); } Bộ mụn Cụng nghệ phần mềm – ĐHCN 65 NguyễnVănVỵdate.h typedef struct { int year, mon, day; } Date; void print_date(Date); #include ”date.h” void print_date(Date d) { printf(”year: %d, mon: %d, day: %d”, d.year, d.mon, d.day); } date.c date.h Bộ mụn Cụng nghệ phần mềm – ĐHCN 66 NguyễnVănVỵ .c .o .c .o ... .exe compile link source object include header.h date.h Bộ mụn Cụng nghệ phần mềm – ĐHCN 67 NguyễnVănVỵ calender.c calender.o date.h tools.c tools.o print_date() print_date() print_date() link error date.h Bộ mụn Cụng nghệ phần mềm – ĐHCN 68 NguyễnVănVỵ calender. c calender.o date.h tools.c tools.o calender.exe date.c date.o print_date() print_date() print_date() date.h Bộ mụn Cụng nghệ phần mềm – ĐHCN 69 NguyễnVănVỵ Pre-compile Chỉ thị ch−ơng trình dịch (tiền biên dịch) Tạo ra các macro Tạo ra các phiên bản phần mềm khác nhau Quản lí các tệp header #include #define #ifdef #ifndef #endif Bộ mụn Cụng nghệ phần mềm – ĐHCN 70 NguyễnVănVỵ #define Cube(x) (x*x*x) ... void main() { ... m = Cube(n); ... } Pre-compile Bộ mụn Cụng nghệ phần mềm – ĐHCN 71 NguyễnVănVỵ Pre-compile #define DEBUG ... int foo() { #ifdef DEBUG fprintf(stderr, "foo() called"); #endif ... } Tạo các phiên bản phần mềm khác nhau Bộ mụn Cụng nghệ phần mềm – ĐHCN 72 NguyễnVănVỵ Header & Precompile Date.h Calender.h Schedule.h JobManager.c include include Bộ mụn Cụng nghệ phần mềm – ĐHCN 73 NguyễnVănVỵ date.h #ifndef DATE_H #define DATE_H typedef struct { int year, mon, day; } Date; void print_date(Date); #endif Header & Precompile Bộ mụn Cụng nghệ phần mềm – ĐHCN 74 NguyễnVănVỵ #ifndef CALENDER_H #define CALENDER_H #include ”date.h” ... #endif calender.h #ifndef SCHEDULE_H #define SCHEDULE_H #include ”date.h” ... #endif schedule.h Header & Precompile Bộ mụn Cụng nghệ phần mềm – ĐHCN 75 NguyễnVănVỵ #include ”calender.h” #include ”schedule.h” ... void main() { ... } JobManager.c Header & Precompile Bộ mụn Cụng nghệ phần mềm – ĐHCN 76 NguyễnVănVỵ Câu hỏi ôn tập 1. Kỹ thật lập trình tốt thể hiện ở chỗ nμo? Hệ quả của nó? 2. Nêu các kỹ thuật lập trình đã có? đặc tr−ng của mỗi loại lμ gì? 3. Tiêu chuẩn lựa chọn ngôn ngữ lập trình? 4. Thế nμo lμ ngôn ngữ khả chuyển? Cho ví dụ? 5. Nêu các miền ứng ứng dụng vμ ngôn ngữ thích hợp với nó? 6. Các yêu tố tạo ra phong cách lập trình lμ gi? Nó h−ớng tới phần mềm có đặc tr−ng gì? Bộ mụn Cụng nghệ phần mềm – ĐHCN 77 NguyễnVănVỵ Câu hỏi ôn tập 7. GiảI thích cách lμm: chú thích?, đặt tên?, viết câu lệnh?, đặt hμm vμ biến cục bộ?, xử lý lỗi vμ thông báo? Xử lý lỗi trong th− viện? Xử lý ngoại lệ? 8. Tiêu chuẩn cho phong cách lập trình tôt? Bộ mụn Cụng nghệ phần mềm – ĐHCN 78 NguyễnVănVỵ Câu hỏi và thảo luận
File đính kèm:
- Bài giảng Kỹ nghệ phần mềm - Nguyễn Văn Vỵ - Bài 8 Lập trình.pdf