Nguy nV nVLậ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í
Trang 1Bé m«n C«ng nghÖ phÇn mÒm- Khoa CNTT- §HCN
Email: vynv@coltech.vnu.vn
K ngh ph n m m
Software Engeneering
Trang 2Nguy 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¶
Trang 3Nguy 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
Trang 5Nguy 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
Khái niệm lập trình hiệu quả
Trang 7Nguy nV nV TiÕn hãa cña kü thuËt lËp tr×nh
Trang 8º độ 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,
Trang 9sö 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,
Trang 10Nguy 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
Trang 11Nguy 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
Trang 12Nguy 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
Trang 13noattack(X/Y, [X1/Y1 |
Trang 15Nguy 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)
Trang 16̇ sö dông c¸c tÝnh n¨ng chuÈn cña ng«n ng÷
̇ sö dông script khi cã thÓ
Trang 17Nguy 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
Trang 18º 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
Trang 20Nguy 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
Trang 21Nguy 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
Trang 22Nguy 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
Trang 23Nguy 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
Trang 24Nguy 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
Trang 25º không thể theo dõi đồng thời hoạt động
của nhiều biến
Trang 26º 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
Trang 27Nguy 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
Trang 29Nguy 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;
Trang 30º 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
Trang 32Nguy 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Ö };
Trang 33Nguy 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
Trang 34Nguy 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?"
Trang 35º 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
Trang 36º 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;
Trang 39Bộ nhớ động với C++
Trang 40Nguy 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;
Trang 41Nguy 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:
Trang 43Nguy 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
Trang 46}
Trang 47Nguy 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
Trang 48Nguy 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
Trang 49Nguy nV nV
N - version programming
version 1 version 2 version 3
Trang 50Nguy 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¶
Trang 51Nguy 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
Trang 52̇ 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¶
Trang 53Nguy 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
Trang 54Nguy 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
Trang 55Nguy 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
Trang 56Nguy 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)
Trang 58Nguy 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
Trang 60Nguy 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
Trang 62Nguy 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)
Trang 63Nguy 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 )
Trang 64printf(”year: %d, mon: %d, day: %d”,
d.year, d.mon, d.day);
}
Trang 66Nguy nV nV
.c o
.c o
date.h
Trang 70Nguy nV nV
#define Cube(x) (x*x*x)
void main() {
Trang 71Nguy nV nV
Pre-compile
#define DEBUG
int foo() {
Trang 76Nguy 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ì?
Trang 77Nguy 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?
Trang 78Nguy nV nV
C©u hái và th o lu n