Bài giảng Kỹ nghệ phần mềm - Bài 8: Lập trình - Nguyễn Văn Vỵ
Lập trình hiệu quả hơn, sản phẩm rẻ tiền hơn
? Tốc độ phát triển cao hơn
 năng lực biểu diễn cao hơn
 khả năng sử dụng lại cao hơn
? Dễ bảo trì hơn
 dễ hiểu, dễ sửa đổi, thích nghi
? Chất lượng cao hơn
 sử dụng các cấu trúc an toμn hơn
chương trình cần dễ hiểu
Khái niệm lập trình hiệ
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ nghệ phần mềm - Bài 8: Lập trình - Nguyễn Văn Vỵ", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
        
        Tóm tắt nội dung tài liệu: Bài giảng Kỹ nghệ phần mềm - Bài 8: Lập trình - Nguyễn Văn Vỵ

Bộ môn Công nghệ phần mềm- Khoa CNTT- ĐHCN Email: [email protected] Kỹ nghệ phần mềm Software Engeneering Nguyễn Văn Vỵ Bộ mụn Cụng nghệ phần mềm – ĐHCN 2 NguyễnVănVỵ Nội dung Bài 8: Lập trỡnh  Ngôn ngữ lập trình  Phong cách lập trình  Lập trình tránh lỗi  Lập trình h−ớng hiệu quả Bộ mụn Cụng nghệ phần mềm – ĐHCN 3 NguyễnVănVỵ TÀI LiỆU THAM KHẢO 1. Nguyễn Văn Vỵ, Nguyễn Việt Hà. Giỏo trỡnh kỹ nghệ phần mềm. Nhà xuất bản Đại học Quốc gia Hà nội, 2008 2. Grady Booch, James Rumbaugh, Ivar Jacobson. The Unified Modeling language User Guid. Addison-Wesley, 1998. 3. M. Ould. Managing Software Quality and Business Risk, John Wiley and Sons, 1999. 4. Roger S.Pressman, Software Engineering, a Practitioner’s Approach. Fifth Edition, McGraw Hill, 2001. 5. Ian Sommerville, Software Engineering. Sixth Edition, Addison- Wasley, 2001. 6. Nguyễn Văn Vỵ. Phõn tớch thiết kế hệ thống thụng tin hiện đại. Hướng cấu trỳc và hướng đối tượng, NXB Thống kờ, 2002, Hà Nội. Bộ mụn Cụng nghệ phần mềm – ĐHCN 4 NguyễnVănVỵ Khái niệm lập trình hiệu quả  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ả Bộ mụn Cụng nghệ phần mềm – ĐHCN 5 NguyễnVănVỵ Lập trình hiệu quả hơn, sản phẩm rẻ tiền hơn  Tốc độ phát triển cao hơn  năng lực biểu diễn cao hơn  khả năng sử dụng lại cao hơn  Dễ bảo trì hơn  dễ hiểu, dễ sửa đổi, thích nghi  Chất l−ợng cao hơn  sử dụng các cấu trúc an toμn hơn ch−ơng trình cần dễ hiểu Khái niệm lập trình hiệu quả Bộ mụn Cụng nghệ phần mềm – ĐHCN 6 NguyễnVănVỵ Tốc độ viết mã nguồn  Tốc độ phát triển cao ≠ lμm ngắn ch−ơng trình nguồn  Tốc độ không tỷ lệ thuận với số dòng lệnh  Câu lệnh phức tạp lμm giảm độ dễ hiểu  Ngôn ngữ mức cao (4GL)  năng lực biểu diễn cao  tốc độ phát triển nhanh Bộ mụn Cụng nghệ phần mềm – ĐHCN 7 NguyễnVănVỵ Tiến hóa của kỹ thuật lập trình  Lập trình tuần tự (tuyến tính)  Lập trình có cấu trúc (thủ tục)  Lập trình h−ớng chức năng  Lập trình h−ớng đối t−ợng  Kỹ thuật thế hệ thứ 4 Bộ mụn Cụng nghệ phần mềm – ĐHCN 8 NguyễnVănVỵ Lập trình tuần tự ■ không có/thiếu các lệnh có cấu trúc (for, while, do while) ■ lạm dụng các lệnh GOTO ■ thiếu khả năng khai báo biến cục bộ  độ ghép nối cao  ch−ơng trình khó hiểu, khó sửa, dễ sinh lỗi Ngôn ngữ dùng: thế hệ 1, 2: assembly, basic,... Bộ mụn Cụng nghệ phần mềm – ĐHCN 9 NguyễnVănVỵ Lập trình có cấu trúc ■ sử dụng các lệnh có cấu trúc (for, while, do while) ■ hạn chế/cấm dùng GOTO ■ sử dụng ch−ơng trình con, biến cục bộ dễ hiểu hơn, an toμn hơn Ngôn ngữ dùng: thế hệ 2, 3: Fortran, Pascal, C, Bộ mụn Cụng nghệ phần mềm – ĐHCN 10 NguyễnVănVỵ Lập trình h−ớng chức năng  Dựa trên nguyên tắc ghép nối dữ liệu  trao đổi dữ liệu bằng tham số vμ giá trị trả lại  loại bỏ hoμn toμn dữ liệu dùng chung  Loại bỏ các hiệu ứng phụ khi sửa đổi các mođun ch−ơng trình; nâng cao tính tái sử dụng  Ví dụ: Lisp Bộ mụn Cụng nghệ phần mềm – ĐHCN 11 NguyễnVănVỵ Lập trình h−ớng đối t−ợng ■ Bao gói & che dấu thông tin ■ thao tác với dữ liệu qua các giao diện xác định ■ kế thừa Ngôn ngữ h−ớng đối t−ợng: C++, Java, C#  cục bộ hơn  dễ tái sử dụng hơn  thuận tiện cho các ứng dụng lớn Bộ mụn Cụng nghệ phần mềm – ĐHCN 12 NguyễnVănVỵ Lập trình logic  Tách tri thức về bμi toán khỏi kỹ thuật lập trình  Mô tả tri thức  các qui tắc  các sự thực  mục tiêu  Hệ thống tự chứng minh  tìm đ−ờng đi đến mục tiêu  Ví dụ:Prolog Bộ mụn Cụng nghệ phần mềm – ĐHCN 13 NguyễnVănVỵ Ví dụ. Prolog: 8 hậu member(X,[X|L]). member(X,[Y|L]):-member(X,L). solution([]). solution([X/Y|Other]):- solution(Other), member(Y, [1,2,3,4,5,6,7,8]), noattack(X/Y, Other). noattack(_,[]). noattack(X/Y, [X1/Y1 | Other]):- Y =\= Y1, Y1-Y =\= X1-X, Y1-Y =\= X-X1, noattack(X/Y , Other). Bộ mụn Cụng nghệ phần mềm – ĐHCN 14 NguyễnVănVỵ Lựa chọn ngôn ngữ ■ Đặc tr−ng của ngôn ngữ  năng lực (kiểu biến, các cấu trúc)  tính khả chuyển  mức độ hỗ trợ của các công cụ ■ Miền ứng dụng của ngôn ngữ  lập trình hệ thống  nghiệp vụ, kinh doanh  khoa học kỹ thuật  trí tuệ nhân tạo ■ Năng lực, kinh nghiệm của nhóm phát triển ■ Yêu cầu của khách hμng Bộ mụn Cụng nghệ phần mềm – ĐHCN 15 NguyễnVănVỵ Năng lực của ngôn ngữ ■ Ngôn ngữ bậc cao:  có cấu trúc, câu lệnh phong phú  hỗ trợ nhiều kiểu dữ liệu  hỗ trợ con trỏ, đệ qui  hỗ trợ h−ớng đối t−ợng  th− viện phong phú nên dùng ngôn ngữ bậc cao (hơn) Bộ mụn Cụng nghệ phần mềm – ĐHCN 16 NguyễnVănVỵ Tính khả chuyển ■ Yếu tố quan trọng của ngôn ngữ, cần khi  thay đổi phần cứng  thay đổi OS  Java khả chuyển  Các ngôn ngữ thông dịch (script) khả chuyển  sử dụng các tính năng chuẩn của ngôn ngữ  sử dụng script khi có thể Bộ mụn Cụng nghệ phần mềm – ĐHCN 17 NguyễnVănVỵ Có công cụ hiệu quả ■ Trình biên dịch hiệu quả  biên dịch tốc độ cao  khả năng tối −u cao  khai thác các tập lệnh, kiến trúc phần cứng mới ■ Các công cụ trợ giúp hiệu quả  editor, debugger, linker, make...  IDE (Integrated Develop Environment)  môi tr−ờng Unix th−ờng không dùng IDE Bộ mụn Cụng nghệ phần mềm – ĐHCN 18 NguyễnVănVỵ Miền ứng dụng vμ ngôn ngữ ■ Phần mềm hệ thống:  hiệu quả, vạn năng, dễ mở rộng  C, C++ ■ Hệ thời gian thực: C, C++, Ada, Assembly ■ Phần mềm nhúng: C++, Java ■ Phần mềm khoa học kỹ thuật:  tính toán chính xác, th− viện toán học mạnh,dễ dμng song song hóa  Fortran vẫn phổ biến Bộ mụn Cụng nghệ phần mềm – ĐHCN 19 NguyễnVănVỵ Miền ứng dụng vμ ngôn ngữ (t) ■ Phần mềm nghiệp vụ:  CSDL: Oracle, DB2, SQL Server, MySQL...  ngôn ngữ: FoxPro, COBOL, VB, VC++ ■ Trí tuệ nhân tạo:  Lisp, Prolog, OPS5,... ■ Lập trình Web/CGI:  Perl, ASP, PHP, Java, Java script, Python... Bộ mụn Cụng nghệ phần mềm – ĐHCN 20 NguyễnVănVỵ Phong cách lập trình H−ớng tới phong cách lμm cho mã nguồn  dễ hiểu, dễ sửa đổi  an toμn (ít lỗi) ■ Bao gồm các yếu tố:  cách đặt tên hμm vμ biến  cách xây dựng câu lệnh, cấu trúc ch−ơng trình  cách viết chú thích Ng−ời khác có thể hiểu đ−ợc, bảo trì đ−ợc Bộ mụn Cụng nghệ phần mềm – ĐHCN 21 NguyễnVănVỵ Tại sao cần dễ hiểu Phần mềm luôn cần sửa đổi  sửa lỗi  nâng cấp kéo dμi tuổi thọ, nâng cao hiệu quả kinh tế Nếu không dễ hiểu  bảo trì tốn thời gian, chi phí cao  tác giả phải bảo trì suốt vòng đời của phần mềm  bản thân tác giả cũng không hiểu Bộ mụn Cụng nghệ phần mềm – ĐHCN 22 NguyễnVănVỵ Chú thích Mọi điều đ−ợc Chú thích trong ch−ơng trình ■ Mục đích sử dụng của các biến ■ Chức năng của khối lệnh, câu lệnh  các lệnh điều khiển  các lệnh phức tạp ■ Chú thích các mô đun  mục đích, chức năng của mô đun  tham số, giá trị trả lại (giao diện)  các mô đun thuộc cấp  cấu trúc, thuật toán  nhiệm vụ của các biến cục bộ  tác giả, ng−ời kiểm tra, thời gian Bộ mụn Cụng nghệ phần mềm – ĐHCN 23 NguyễnVănVỵ Đặt tên Đặt tên biến, tên hμm có nghĩa, gợi nhớ ■ Sử dụng các ký hiệu, từ tiếng Anh có nghĩa ■ Lμm cho dễ đọc  dùng DateOfBirth hoặc date_of_birth  không viết dateofbirth ■ Tránh đặt tên quá dμi  không đặt tên dμi với các biến cục bộ ■ Thống nhất cách dùng  i cho vòng lặp, tmp cho các giá trị tạm thời... Bộ mụn Cụng nghệ phần mềm – ĐHCN 24 NguyễnVănVỵ Câu lệnh ■ Các câu lệnh phải mô tả cấu trúc  tụt lề, dễ đọc, dễ hiểu ■ Lμm đơn giản các lệnh  mỗi lệnh trên một dòng  triển khai các biểu thức phức tạp  hạn chế truyền tham số lμ kết quả của hμm, biểu thức printf("%s", strcpy(des, src)); ■ Tránh các cấu trúc phức tạp:  các lệnh if lồng nhau  điều kiện phủ định if not Bộ mụn Cụng nghệ phần mềm – ĐHCN 25 NguyễnVănVỵ Hμm vμ biến cục bộ ■ Ch−ơng trình cần đ−ợc chia thμnh nhiều mô đun (hμm) ■ Không viết hμm quá dμi  không quá 2 trang mμn hình  tạo ra các hμm thứ cấp để giảm độ dμi từng hμm ■ Không dùng quá nhiều biến cục bộ  không thể theo dõi đồng thời hoạt động của nhiều biến (vd. không quá 7 biến cục bộ) Bộ mụn Cụng nghệ phần mềm – ĐHCN 26 NguyễnVănVỵ Xử lý lỗi ■ Có thể phát hiện lỗi trong khi thực hiện  lỗi chia 0  lỗi input/output, ■ Xử lý lỗi  nhất quán trong xử lý: phân loại lỗi; thống nhất định dạng thông báo,  phân biệt output vμ thông báo lỗi  các hμm th− viện nên tránh việc tự xử lý, tự đ−a ra thông báo lỗi Bộ mụn Cụng nghệ phần mềm – ĐHCN 27 NguyễnVănVỵ Output vμ thông báo (lỗi) ■ Output lμ dữ liệu, còn đ−ợc dùng để lμm input cho phần mềm khác ■ Thông báo (lỗi) lμ các thông tin nhất thời, trạng thái hệ thống, lỗi vμ cách khắc phục ■ Cần tách output vμ thông báo lỗi ■ OS th−ờng cung cấp 3 luồng dữ liệu chuẩn  stdin (cin): input chuẩn (bμn phím)  stdout (cout): output chuẩn (mμn hình)  stderr (cerr): luồng thông báo lỗi chuẩn (không định h−ớng lại đ−ợc) Bộ mụn Cụng nghệ phần mềm – ĐHCN 28 NguyễnVănVỵ void main() { int count = 0; char buf[128]; while (NULL != scanf(”%s”, buf)) { upcase(buf); printf(“%s”, buf); count += strlen(buf); } fprintf(stderr, ”number of chars: %d\n”, count); } #convert uppercase.txt number of chars: 678 convert.c Bộ mụn Cụng nghệ phần mềm – ĐHCN 29 NguyễnVănVỵ Xử lý lỗi trong hμm th− viện ■ Ng−ời viết vμ ng−ời sử dụng th− viện lμ khác nhau ■ Ng−ời sử dụng th−ờng muốn có cách xử lý riêng ■ Hμm th− viện trả lại trạng thái lỗi, không tự xử lý  trả trạng thái bằng giá trị trả lại  trả trạng thái bằng tham số  trả lại bằng ném ngoại lệ (trong các OOL) int lookup(int a[], int key, int& err_code){ if (not found) err_code = 0;else err_code =1;} Bộ mụn Cụng nghệ phần mềm – ĐHCN 30 NguyễnVănVỵ Ngoại lệ  Lμ cách thức xử lý lỗi tiến tiến trong các ngôn ngữ h−ớng đối t−ợng  môđun xử lý ném ra một ngoại lệ (đối t−ợng chứa thông tin lỗi)  môđun điều khiển bắt ngoại lệ (nếu có)  Tách phần xử lý lỗi khỏi phần cμi đặt thuật toán thông th−ờng, lμm cho ch−ơng trình dễ đọc hơn  Dễ dùng hơn, an toμn hơn Bộ mụn Cụng nghệ phần mềm – ĐHCN 31 NguyễnVănVỵ Ném ngoại lệ double MyDivide(double num, double denom) { if (denom == 0.0) { throw invalid_argument(”The denom cannot be 0.”); } else { return num / denom; } } Bộ mụn Cụng nghệ phần mềm – ĐHCN 32 NguyễnVănVỵ Bắt ngoại lệ try { result = MyDivide(x, y); } catch (invalid_argument& e) { cerr << e.what() << endl; ... // mã xử lý với ngoại lệ }; Bộ mụn Cụng nghệ phần mềm – ĐHCN 33 NguyễnVănVỵ Giao diện của mô đun ■ Thống nhất định dạng  thứ tự truyền tham số  strcpy(des, src) ■ Kiểm tra tính hợp lệ của dữ liệu  chỉ thực hiện xử lý với dữ liệu hợp lệ ■ Lμm đơn giản giao diện (giảm độ ghép nối)  không truyền thừa tham số  tìm cách kết hợp các khoản mục liên quan Bộ mụn Cụng nghệ phần mềm – ĐHCN 34 NguyễnVănVỵ Phong cách lập trình tốt ■ Tuân theo các chuẩn thông dụng ■ Chuẩn đ−ợc chấp nhận rộng rãi hơn dễ hiểu hơn ■ Chú giải đầy đủ mỗi khi không tuân theo chuẩn "Ng−ời khác có hiểu đ−ợc không?" Bộ mụn Cụng nghệ phần mềm – ĐHCN 35 NguyễnVănVỵ Kỹ thuật lập trình tránh lỗi Kỹ thuật lập trình tốt dựa trên các yếu tố  lập trình có cấu trúc  dùng các lệnh có cấu trúc  mođun hóa  hạn chế dùng các cấu trúc nguy hiểm  đóng gói/che dấu thông tin  xây dựng kiểu dữ liệu trừu t−ợng  hạn chế thao tác trực tiếp lên thuộc tính Bộ mụn Cụng nghệ phần mềm – ĐHCN 36 NguyễnVănVỵ Tránh các cấu trúc nguy hiểm  Số thực  các phép toán đ−ợc lμm tròn, kết quả không  chính xác tuyệt đối  so sánh (=) hai số thực lμ không khả thi  Con trỏ  khái niệm mức thấp  có khả năng gây lỗi nghiêm trọng  dễ nhầm double r; int* n = &r; Bộ mụn Cụng nghệ phần mềm – ĐHCN 37 NguyễnVănVỵ Tránh các cấu trúc nguy hiểm  Cấp phát bộ nhớ động  quên cấp phát  quên giải phóng  chỉ nên dùng với ngôn ngữ h−ớng đối t−ợng (C++)  Đệ qui  khó hiểu  dễ nhầm điều kiện dừng Bộ mụn Cụng nghệ phần mềm – ĐHCN 38 NguyễnVănVỵ Bộ nhớ động với C++  Tự động hóa cấp phát bộ nhớ  Tự động hóa giải phóng class Stack { private: int* buf; int pos; public: Stack (int size) { buf = new int[size]; } int push(int); int pop(); ~Stack() { delete[] buf; } } hμm khởi tạ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:
 bai_giang_ky_nghe_phan_mem_bai_8_lap_trinh_nguyen_van_vy.pdf bai_giang_ky_nghe_phan_mem_bai_8_lap_trinh_nguyen_van_vy.pdf




