Kỹnghệphần mềm
Software Engeneering
NguyÔn V¨n Vþ
Bém«n C«ng nghÖphÇn mÒm-Khoa CNTT-§HCN
Email: vynv@coltech.vnu.vn
Bài 8: Lập trình
NguyễnVănVỵ
Nội dung
(cid:132) Ng«n ng÷ lËp tr×nh
(cid:132) Phong c¸ch lËp tr×nh
(cid:132) LËp tr×nh tr¸nh lçi
(cid:132) LËp tr×nh h−íng hiÖu qu¶
Bộ môn Công nghệ phần mềm – ĐHCN 2
TÀI LiỆU THAM KHẢO
NguyễnVănVỵ
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
5.
Approach. Fifth Edition, McGraw Hill, 2001.
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 3
Kh¸i niÖm lËp tr×nh hiÖu qu¶
NguyễnVănVỵ
(cid:132) S¶n phÈm phÇn mÒm tèt khi
(cid:144) ph©n tÝch tèt
(cid:144) thiÕt kÕ tèt
(cid:144) lËp tr×nh tèt
(cid:144) kiÓm thö chÆt chÏ
(cid:132) kü thuËt lËp tr×nh tèt
(cid:144) chuyªn nghiÖp (tu©n theo c¸c chuÈn)
(cid:144) æn ®Þnh
(cid:144) hiÖu qu¶
Bộ môn Công nghệ phần mềm – ĐHCN 4
Kh¸i niÖm lËp tr×nh hiÖu qu¶
NguyễnVănVỵ
LËp tr×nh hiÖu qu¶ h¬n, s¶n phÈm rÎ tiÒn h¬n
(cid:132) Tèc ®é ph¸t triÓn cao h¬n
(cid:144) n¨ng lùc biÓu diÔn cao h¬n
(cid:144) kh¶ n¨ng sö dông l¹i cao h¬n
(cid:132) DÔ b¶o tr× h¬n
(cid:144) dÔ hiÓu, dÔ söa ®æi, thÝch nghi
(cid:132) ChÊt l−îng cao h¬n
(cid:144) sö dông c¸c cÊu tróc an toμn h¬n
ch−¬ng tr×nh cÇn dÔ hiÓu
Bộ môn Công nghệ phần mềm – ĐHCN 5
Tèc ®é viÕt m· nguån
NguyễnVănVỵ
(cid:132) Tèc ®é ph¸t triÓn cao ≠ lμm ng¾n ch−¬ng tr×nh nguån
(cid:144) Tèc ®é kh«ng tû lÖ thuËn víi sè dßng lÖnh
(cid:144) C©u lÖnh phøc t¹p lμm gi¶m ®é dÔ hiÓu
(cid:132) Ng«n ng÷ møc cao (4GL)
(cid:144) n¨ng lùc biÓu diÔn cao
(cid:144) tèc ®é ph¸t triÓn nhanh
Bộ môn Công nghệ phần mềm – ĐHCN 6
TiÕn hãa cña kü thuËt lËp tr×nh
NguyễnVănVỵ
(cid:132) LËp tr×nh tuÇn tù (tuyÕn tÝnh)
(cid:132) LËp tr×nh cã cÊu tróc (thñ tôc)
(cid:132) LËp tr×nh h−íng chøc n¨ng
(cid:132) LËp tr×nh h−íng ®èi t−îng
(cid:132) Kü thuËt thÕ hÖ thø 4
Bộ môn Công nghệ phần mềm – ĐHCN 7
LËp tr×nh tuÇn tù
NguyễnVănVỵ
■ 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é
(cid:144) ®é ghÐp nèi cao
(cid:144) 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 8
LËp tr×nh cã cÊu tróc
NguyễnVănVỵ
■ 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,(cid:31)
Bộ môn Công nghệ phần mềm – ĐHCN 9
LËp tr×nh h−íng chøc n¨ng
NguyễnVănVỵ
(cid:132) Dùa trªn nguyªn t¾c ghÐp nèi d÷ liÖu
(cid:144) trao ®æi d÷ liÖu b»ng tham sè vμ gi¸ trÞ tr¶ l¹i
(cid:144) lo¹i bá hoμn toμn d÷ liÖu dïng chung
(cid:132) 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
(cid:132) VÝ dô: Lisp
Bộ môn Công nghệ phần mềm – ĐHCN 10
LËp tr×nh h−íng ®èi t−îng
NguyễnVănVỵ
■ 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
(cid:144) côc bé h¬n
(cid:144) dÔ t¸i sö dông h¬n
(cid:144) thuËn tiÖn cho c¸c øng dông lín
Ng«n ng÷ h−íng ®èi t−îng: C++, Java, C#
Bộ môn Công nghệ phần mềm – ĐHCN 11
LËp tr×nh logic
NguyễnVănVỵ
(cid:132) T¸ch tri thøc vÒ bμi to¸n khái kü thuËt lËp tr×nh
(cid:132) M« t¶ tri thøc
(cid:144) c¸c qui t¾c
(cid:144) c¸c sù thùc
(cid:144) môc tiªu
(cid:132) HÖ thèng tù chøng minh
(cid:144) t×m ®−êng ®i ®Õn môc tiªu
(cid:132) VÝ dô:Prolog
Bộ môn Công nghệ phần mềm – ĐHCN 12
VÝ dụ. Prolog: 8 hËu
NguyễnVănVỵ
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 13
Lùa chän ng«n ng÷
NguyễnVănVỵ
■ §Æc tr−ng cña ng«n ng÷
(cid:144) n¨ng lùc (kiÓu biÕn, c¸c cÊu tróc)
(cid:144) tÝnh kh¶ chuyÓn
(cid:144) møc ®é hç trî cña c¸c c«ng cô
■ MiÒn øng dông cña ng«n ng÷
(cid:144) lËp tr×nh hÖ thèng
(cid:144) nghiÖp vô, kinh doanh
(cid:144) khoa häc kü thuËt
(cid:144) 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 14
N¨ng lùc cña ng«n ng÷
NguyễnVănVỵ
■ Ng«n ng÷ bËc cao:
(cid:144) cã cÊu tróc, c©u lÖnh phong phó
(cid:144) hç trî nhiÒu kiÓu d÷ liÖu
(cid:144) hç trî con trá, ®Ö qui
(cid:144) hç trî h−íng ®èi t−îng
(cid:144) 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 15
TÝnh kh¶ chuyÓn
NguyễnVănVỵ
■ YÕu tè quan träng cña ng«n ng÷, cÇn khi
(cid:131) thay ®æi phÇn cøng
(cid:131) thay ®æi OS
(cid:144) Java kh¶ chuyÓn
(cid:144) C¸c ng«n ng÷ th«ng dÞch (script) kh¶ chuyÓn
(cid:131) sö dông c¸c tÝnh n¨ng chuÈn cña ng«n ng÷
(cid:131) sö dông script khi cã thÓ
Bộ môn Công nghệ phần mềm – ĐHCN 16
Cã c«ng cô hiÖu qu¶
NguyễnVănVỵ
■ Tr×nh biªn dÞch hiÖu qu¶
(cid:144) biªn dÞch tèc ®é cao
(cid:144) kh¶ n¨ng tèi −u cao
(cid:144) 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¶
(cid:144) editor, debugger, linker, make...
(cid:144) IDE (Integrated Develop Environment)
(cid:144) m«i tr−êng Unix th−êng kh«ng dïng IDE
Bộ môn Công nghệ phần mềm – ĐHCN 17
MiÒn øng dông vμ ng«n ng÷
NguyễnVănVỵ
■ PhÇn mÒm hÖ thèng:
(cid:144) hiÖu qu¶, v¹n n¨ng, dÔ më réng
(cid:144) 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:
(cid:144) tÝnh to¸n chÝnh x¸c, th− viÖn to¸n häc
m¹nh,dÔ dμng song song hãa
(cid:144) Fortran vÉn phæ biÕn
Bộ môn Công nghệ phần mềm – ĐHCN 18
MiÒn øng dông vμ ng«n ng÷ (t)
NguyễnVănVỵ
■ PhÇn mÒm nghiÖp vô:
(cid:144) CSDL: Oracle, DB2, SQL Server, MySQL...
(cid:144) ng«n ng÷: FoxPro, COBOL, VB, VC++
■ TrÝ tuÖ nh©n t¹o:
(cid:144) Lisp, Prolog, OPS5,...
■ LËp tr×nh Web/CGI:
(cid:144) Perl, ASP, PHP, Java, Java script, Python...
Bộ môn Công nghệ phần mềm – ĐHCN 19
Phong c¸ch lËp tr×nh
NguyễnVănVỵ
■ Bao gåm c¸c yÕu tè:
(cid:144) c¸ch ®Æt tªn hμm vμ biÕn
(cid:144) c¸ch x©y dùng c©u lÖnh, cÊu tróc ch−¬ng tr×nh
(cid:144) c¸ch viÕt chó thÝch
H−íng tíi phong c¸ch lμm cho m· nguån
(cid:144) dÔ hiÓu, dÔ söa ®æi
(cid:144) an toμn (Ýt lçi)
Ng−êi kh¸c cã thÓ hiÓu ®−îc, b¶o tr× ®−îc
Bộ môn Công nghệ phần mềm – ĐHCN 20
T¹i sao cÇn dÔ hiÓu
NguyễnVănVỵ
PhÇn mÒm lu«n cÇn söa ®æi
(cid:144) söa lçi
(cid:144) 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
(cid:144) b¶o tr× tèn thêi gian, chi phÝ cao
(cid:144) t¸c gi¶ ph¶i b¶o tr× suèt vßng ®êi cña phÇn mÒm
(cid:144) b¶n th©n t¸c gi¶ còng kh«ng hiÓu
Bộ môn Công nghệ phần mềm – ĐHCN 21
Chó thÝch
NguyễnVănVỵ
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
(cid:144) c¸c lÖnh ®iÒu khiÓn
(cid:144) c¸c lÖnh phøc t¹p
■ Chó thÝch c¸c m« ®un
(cid:144) môc ®Ých, chøc n¨ng cña m« ®un
(cid:144) tham sè, gi¸ trÞ tr¶ l¹i (giao diÖn)
(cid:144) c¸c m« ®un thuéc cÊp
(cid:144) cÊu tróc, thuËt to¸n
(cid:144) nhiÖm vô cña c¸c biÕn côc bé
(cid:144) t¸c gi¶, ng−êi kiÓm tra, thêi gian
Bộ môn Công nghệ phần mềm – ĐHCN 22
§Æt tªn
NguyễnVănVỵ
§Æ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
(cid:144) dïng DateOfBirth hoÆc date_of_birth
(cid:144) kh«ng viÕt dateofbirth
■ Tr¸nh ®Æt tªn qu¸ dμi
(cid:144) kh«ng ®Æt tªn dμi víi c¸c biÕn côc bé
■ Thèng nhÊt c¸ch dïng
(cid:144) 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 23
C©u lÖnh
NguyễnVănVỵ
■ C¸c c©u lÖnh ph¶i m« t¶ cÊu tróc
(cid:144) tôt lÒ, dÔ ®äc, dÔ hiÓu
■ Lμm ®¬n gi¶n c¸c lÖnh
(cid:144) mçi lÖnh trªn mét dßng
(cid:144) triÓn khai c¸c biÓu thøc phøc t¹p
(cid:144) 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:
(cid:144) c¸c lÖnh if lång nhau
(cid:144) ®iÒu kiÖn phñ ®Þnh if not
Bộ môn Công nghệ phần mềm – ĐHCN 24
Hμm vμ biÕn côc bé
NguyễnVănVỵ
■ 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
(cid:144) kh«ng qu¸ 2 trang mμn h×nh
(cid:144) 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é
(cid:144) 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 25
Xö lý lçi
NguyễnVănVỵ
■ Cã thÓ ph¸t hiÖn lçi trong khi thùc hiÖn
(cid:144) lçi chia 0
(cid:144) lçi input/output,
■ Xö lý lçi
(cid:144) nhÊt qu¸n trong xö lý: ph©n lo¹i lçi; thèng nhÊt
®Þnh d¹ng th«ng b¸o,
(cid:144) ph©n biÖt output vμ th«ng b¸o lçi
(cid:144) 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 26
Output vμ th«ng b¸o (lçi)
NguyễnVănVỵ
■ 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
(cid:144) stdin (cin): input chuÈn (bμn phÝm)
(cid:144) stdout (cout): output chuÈn (mμn h×nh)
(cid:144) 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 27
convert.c
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 < normal.txt > uppercase.txt
number of chars: 678
Bộ môn Công nghệ phần mềm – ĐHCN 28
Xö lý lçi trong hμm th− viÖn
NguyễnVănVỵ
■ 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ý
(cid:144) tr¶ tr¹ng th¸i b»ng gi¸ trÞ tr¶ l¹i
(cid:144) tr¶ tr¹ng th¸i b»ng tham sè
(cid:144) 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 29
Ngo¹i lÖ
NguyễnVănVỵ
(cid:132) Lμ c¸ch thøc xö lý lçi tiÕn tiÕn trong c¸c ng«n ng÷
h−íng ®èi t−îng
(cid:144) m«®un xö lý nÐm ra mét ngo¹i lÖ (®èi t−îng chøa
th«ng tin lçi)
(cid:144) m«®un ®iÒu khiÓn b¾t ngo¹i lÖ (nÕu cã)
(cid:132) 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
(cid:132) DÔ dïng h¬n, an toμn h¬n
Bộ môn Công nghệ phần mềm – ĐHCN 30
NÐm ngo¹i lÖ
NguyễnVănVỵ
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 31
B¾t ngo¹i lÖ
NguyễnVănVỵ
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 32
Giao diÖn cña m« ®un
NguyễnVănVỵ
■ Thèng nhÊt ®Þnh d¹ng
(cid:144) thø tù truyÒn tham sè
(cid:144) strcpy(des, src)
■ KiÓm tra tÝnh hîp lÖ cña d÷ liÖu
(cid:144) 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)
(cid:144) kh«ng truyÒn thõa tham sè
(cid:144) 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 33
Phong c¸ch lËp tr×nh tèt
NguyễnVănVỵ
■ 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 34
Kü thuËt lËp tr×nh tr¸nh lçi
NguyễnVănVỵ
Kü thuËt lËp tr×nh tèt dùa trªn c¸c yÕu tè
(cid:132) lËp tr×nh cã cÊu tróc
(cid:144) dïng c¸c lÖnh cã cÊu tróc
(cid:144) mo®un hãa
(cid:144) h¹n chÕ dïng c¸c cÊu tróc nguy hiÓm
(cid:132) ®ãng gãi/che dÊu th«ng tin
(cid:144) x©y dùng kiÓu d÷ liÖu trõu t−îng
(cid:144) 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 35
Tr¸nh c¸c cÊu tróc nguy hiÓm
NguyễnVănVỵ
(cid:132) Sè thùc
(cid:144) c¸c phÐp to¸n ®−îc lμm trßn, kÕt qu¶ kh«ng
(cid:144) chÝnh x¸c tuyÖt ®èi
(cid:144) so s¸nh (=) hai sè thùc lμ kh«ng kh¶ thi
(cid:132) Con trá
(cid:144) kh¸i niÖm møc thÊp
(cid:144) cã kh¶ n¨ng g©y lçi nghiªm träng
(cid:144) dÔ nhÇm
double r;
int* n = &r;
Bộ môn Công nghệ phần mềm – ĐHCN 36
Tr¸nh c¸c cÊu tróc nguy hiÓm
NguyễnVănVỵ
(cid:132) CÊp ph¸t bé nhí ®éng
(cid:144) quªn cÊp ph¸t
(cid:144) quªn gi¶i phãng
(cid:144) chØ nªn dïng víi ng«n ng÷ h−íng ®èi t−îng
(C++)
(cid:132) §Ö qui
(cid:144) khã hiÓu
(cid:144) dÔ nhÇm ®iÒu kiÖn dõng
Bộ môn Công nghệ phần mềm – ĐHCN 37
Bé nhí ®éng víi C++
NguyễnVănVỵ
(cid:131) Tù ®éng hãa cÊp ph¸t bé nhí
(cid:131) Tù ®éng hãa gi¶i phãng
class Stack {
private:
hμm khëi t¹o ®èi t−îng
int* buf;
int pos;
public:
Stack (int size) { buf = new int[size]; }
int push(int);
int pop();
~Stack() { delete[] buf; }
}
hμm hñy ®èi t−îng
Bộ môn Công nghệ phần mềm – ĐHCN 38
Bé nhí ®éng víi C++
NguyễnVănVỵ
®èi t−îng s ®−îc khëi t¹o,
hμm khëi t¹o ®−îc gäi tù ®éng
int use_stack()
{
int m;
Stack s(10);
...
s.push(m);
...
return 0;
}
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ộ môn Công nghệ phần mềm – ĐHCN 39
§Þnh kiÓu d÷ liÖu
NguyễnVănVỵ
(cid:131) NhiÒu lçi lËp tr×nh do g¸n d÷ liÖu sai kiÓu
(cid:131) 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
(cid:131) 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 40
Líp/kiÓu d÷ liÖu trõu t−îng
NguyễnVănVỵ
(cid:131) Møc cao h¬n cña ®Þnh kiÓu d÷ liÖu lμ x©y dùng líp ®èi t−îng
(cid:131) 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
41
Líp/kiÓu d÷ liÖu trõu t−îng
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
Bộ môn Công nghệ phần mềm – ĐHCN 42
LËp tr×nh phßng thñ (Defensive programming)
NguyễnVănVỵ
(cid:131) 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
(cid:131) Dù ®o¸n kh¶ n¨ng xuÊt hiÖn lçi
(cid:131) 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 43
LËp tr×nh phßng thñ (Defensive programming)
NguyễnVănVỵ
(cid:131) LÖnh vμo ra
(cid:144) d÷ liÖu kh«ng hîp lÖ
(cid:144) trμn bé ®Öm (kiÓu ký tù)
(cid:144) lçi thao t¸c file (sai tªn, ch−a ®−îc më,(cid:31))
(cid:131) C¸c phÐp to¸n
(cid:144) lçi chia 0
(cid:144) trμn sè
(cid:144) so s¸nh sè thùc (b»ng nhau)
Bộ môn Công nghệ phần mềm – ĐHCN 44
LËp tr×nh phßng thñ (Defensive programming)
NguyễnVănVỵ
(cid:131) Thao t¸c bé nhí
(cid:144) quªn cÊp ph¸t, quªn gi¶i phãng bé nhí
(cid:144) thiÕu bé nhí
(cid:144) sai ®Þa chØ, trμn bé nhí
Bộ môn Công nghệ phần mềm – ĐHCN 45
LËp tr×nh phßng thñ
NguyễnVănVỵ
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 46
LËp tr×nh thø lçi
Fault tolerance programming
NguyễnVănVỵ
(cid:160) Kh«ng thÓ lo¹i trõ hoμn toμn lçi
(cid:160) CÇn cã c¸c hÖ thèng cã ®é tin cËy ®Æc biÖt
(cid:160) Dung thø lçi: chÊp nhËn sù xuÊt hiÖn lçi lËp tr×nh
(cid:160) Ph¸t hiÖn, kh¾c phôc lçi
(cid:160) Khëi nguyªn tõ thø lçi phÇn cøng
(cid:160) 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 47
Nguyªn lý thø lçi
NguyễnVănVỵ
(cid:131) Song song hãa thiÕt bÞ
x¸c suÊt cã lçi α <1
system 1
system 2
...
system N
x¸c suÊt c¶ hÖ thèng
ngõng ho¹t ®éng
αN
(cid:131) Dïng th«ng tin d− thõa ®Ó kh«i phôc d÷ liÖu
(cid:144) Error Correction Code (cid:31) ECC
(cid:144) parity check, check sum
Bộ môn Công nghệ phần mềm – ĐHCN 48
N - version programming
NguyễnVănVỵ
(cid:131) sö dông nhiÒu nhãm lËp tr×nh
(cid:131) so s¸nh kÕt qu¶
(cid:131) cïng thuËt to¸n th× cã xu h−íng m¾c cïng lçi
version 1
version 2
comparison
version 3
Bộ môn Công nghệ phần mềm – ĐHCN 49
Khối phục hồi (Recovery block)
NguyễnVănVỵ
(cid:131) sö dông c¸c thuËt to¸n kh¸c nhau
(cid:131) kiÓm tra tÝnh hîp lÖ cña kÕt qu¶
KiÓm thö chÊp nhËn
ThuËt to¸n 1
quick sort
ThuËt to¸n 2
ThuËt to¸n 3
simple sort
bubble sort
Bộ môn Công nghệ phần mềm – ĐHCN 50
Thø lçi d÷ liÖu (Data fault tolerance)
NguyễnVănVỵ
(cid:131) Phôc håi lïi
(cid:144) kiÓm tra tÝnh hîp lÖ cña d÷ liÖu mçi khi biÕn ®æi
(cid:144) chØ chÊp nhËn c¸c d÷ liÖu hîp lÖ
(cid:131) Phôc håi tiÕn
(cid:144) dïng d÷ liÖu d− thõa
(cid:144) kiÓm tra vμ kh«i phôc d÷ liÖu
Bộ môn Công nghệ phần mềm – ĐHCN 51
H−íng hiÖu qu¶ thùc hiÖn
NguyễnVănVỵ
(cid:131) PhÇn mÒm ngμy cμng phøc t¹p, ®a d¹ng
(cid:144) m« pháng
(cid:144) øng dông thêi gian thùc
(cid:144) phÇn mÒm nhóng
(cid:144) trß ch¬i
(cid:131) HiÖu qu¶ thùc hiÖn lu«n cÇn ®−îc xem xÐt
(cid:144) thuËt to¸n hiÖu qu¶
(cid:144) kü thuËt lËp tr×nh hiÖu qu¶
(cid:144) ng«n ng÷ lËp tr×nh hiÖu qu¶
Bộ môn Công nghệ phần mềm – ĐHCN 52
C¶i thiÖn tèc ®é
NguyễnVănVỵ
(cid:131) Tèi −u hãa chu tr×nh
(cid:144) ®−a phÐp to¸n bÊt biÕn ra ngoμi chu tr×nh
(cid:144) tÝnh s½n gi¸ trÞ ®−îc sö dông nhiÒu lÇn
(cid:131) H¹n chÕ gäi hμm nhá víi tÇn sè cao
(cid:144) phÝ tæn cho gäi hμm nhá
(cid:144) dïng hμm inline, dïng macro
(cid:131) H¹n chÕ truyÒn tham sè trÞ lμ cÊu tróc phøc t¹p
(cid:144) tham sè ®−îc copy lªn stack
(cid:144) truyÒn tham sè biÕn (tham chiÕu)
Bộ môn Công nghệ phần mềm – ĐHCN 53
PhÝ tæn cho gäi hμm/thñ tôc
NguyễnVănVỵ
(cid:131) Copy tham sè lªn stack
(cid:131) Copy gi¸ trÞ tr¶ l¹i tõ stack
(cid:131) ChuyÓn ®iÒu khiÓn ch−¬ng tr×nh
(cid:144) mÊt tÝnh liªn tôc cña dßng lÖnh
(cid:144) mÊt tÝnh côc bé cña cache
Bộ môn Công nghệ phần mềm – ĐHCN 54
Macro vμ hμm inline
NguyễnVănVỵ
(cid:144) kh«ng cã kiÓu
(cid:144) kh«ng an toμn
#define CUBE(x) (x*x*x)
CUBE(n+1)
inline int cube(int x)
{
return x*x*x;
}
Bộ môn Công nghệ phần mềm – ĐHCN 55
TruyÒn tham sè
NguyễnVănVỵ
(cid:131) Tham sè trÞ
(cid:144) copy gi¸ trÞ (bé nhí) cña tham sè lªn stack
(cid:144) kh«ng hiÖu qu¶ víi biÕn kiÓu cÊu tróc lín
(cid:144) kh«ng an toμn víi c¸c cÊu tróc phøc t¹p
(cid:131) Tham sè biÕn/tham chiÕu
(cid:144) copy ®Þa chØ cña tham sè lªn stack
(cid:144) ®Þa chØ cã ®é lín cè ®Þnh (4 bytes)
(cid:144) 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 56
C¶i thiÖn tèc ®é (tiÕp)
NguyễnVănVỵ
(cid:131) Tr¸nh dïng m¶ng nhiÒu chiÒu
(cid:131) Tr¸nh dïng biÕn con trá
(cid:131) Dïng c¸c kiÓu d÷ liÖu ®¬n gi¶n
double --> float
(cid:131) Rót gän c¸c biÓu thøc
(cid:131) Dïng c¸c phÐp to¸n nhanh
++i;
n<<2;
Bộ môn Công nghệ phần mềm – ĐHCN 57
C¶i thiÖn tèc ®é (tr¸nh lÖnh rÏ nh¸nh)
NguyễnVănVỵ
(cid:131) Tr¸nh gäi hμm (ch−¬ng tr×nh con)
(cid:131) Tr¸nh vßng lÆp
(cid:131) 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 58
Pipeline
NguyễnVănVỵ
F
E W
D
R
lÖnh i
F
D
E W
R
lÖnh i+1
F
E W
D
R
lÖnh i+2
F
D
R
E W
lÖnh i+3
F
D
R
E W
lÖnh i+4
time
Bộ môn Công nghệ phần mềm – ĐHCN 59
HiÖu qu¶ vμo/ra
NguyễnVănVỵ
(cid:160) Tèi thiÓu c¸c yªu cÇu input/output
(cid:144) tèc ®é thiÕt bÞ ngo¹i vi chËm
(cid:144) lo¹i bá c¸c inp/out kh«ng cÇn thiÕt
for (i=0; i<10000000; i++) {
...
printf("i = %d\n", i);
}
(cid:160) Input/Output theo khèi
(cid:144) tèi thiÓu sè lÇn gäi th− viÖn input/output
(cid:144) tËn dông hiÖu qu¶ bé ®Öm input/output
Bộ môn Công nghệ phần mềm – ĐHCN 60
NguyễnVănVỵ
Person a[N];
...
for (i=0; i
fread(&a[i], sizeof(Person), 1, fp);
...
}
fread(a, sizeof(Person), N, fp);
for (i=0; i
...
}
Bộ môn Công nghệ phần mềm – ĐHCN 61
Phong c¸ch lËp tr×nh víi C/C++
NguyễnVănVỵ
(cid:131) 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Ï
(cid:144) .c: khai b¸o d÷ liÖu, hμm
(cid:144) .h: ®Þnh nghÜa c¸c kiÓu d÷ liÖu dïng chung
(cid:131) 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 62
C¸c b−íc x©y dùng phÇn mÒm trªn C/C++
NguyễnVănVỵ
(cid:131) So¹n th¶o (edit)
(cid:131) TiÒn biªn dÞch (pre-compile)
(cid:131) Biªn dÞch (compile)
(cid:131) KÕt nèi (link)
(cid:131) Thùc hiÖn (execute)
Bộ môn Công nghệ phần mềm – ĐHCN 63
date.h
NguyễnVănVỵ
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 64
date.h
NguyễnVănVỵ
date.h
typedef struct {
int year, mon, day;
} Date;
void print_date(Date);
date.c
#include ”date.h”
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
date.h
NguyễnVănVỵ
.h
header
include
.c
.c
source
...
compile
.o
.o
object
link
.exe
Bộ môn Công nghệ phần mềm – ĐHCN 66
date.h
NguyễnVănVỵ
print_date()
date.h
calender.c
tools.c
calender.o
tools.o
print_date()
print_date()
link error
Bộ môn Công nghệ phần mềm – ĐHCN 67
date.h
NguyễnVănVỵ
date.h
tools.c
date.c
print_date()
calender.
c
tools.o
date.o
print_date()
calender.o
print_date()
calender.exe
Bộ môn Công nghệ phần mềm – ĐHCN 68
Pre-compile
NguyễnVănVỵ
(cid:131) ChØ thÞ ch−¬ng tr×nh dÞch (tiÒn biªn dÞch)
(cid:131) T¹o ra c¸c macro
(cid:131) T¹o ra c¸c phiªn b¶n phÇn mÒm kh¸c nhau
(cid:131) Qu¶n lÝ c¸c tÖp header
#include
#define
#ifdef
#ifndef
#endif
Bộ môn Công nghệ phần mềm – ĐHCN 69
Pre-compile
NguyễnVănVỵ
#define Cube(x) (x*x*x)
...
void main()
{
...
m = Cube(n);
...
}
Bộ môn Công nghệ phần mềm – ĐHCN 70
Pre-compile
NguyễnVănVỵ
T¹o c¸c phiªn b¶n phÇn mÒm kh¸c nhau
#define DEBUG
...
int foo()
{
#ifdef DEBUG
fprintf(stderr, "foo() called");
#endif
...
}
Bộ môn Công nghệ phần mềm – ĐHCN 71
Header & Precompile
NguyễnVănVỵ
Date.h
include
Calender.h
Schedule.h
include
JobManager.c
Bộ môn Công nghệ phần mềm – ĐHCN 72
Header & Precompile
NguyễnVănVỵ
date.h
#ifndef DATE_H
#define DATE_H
typedef struct {
int year, mon, day;
} Date;
void print_date(Date);
#endif
Bộ môn Công nghệ phần mềm – ĐHCN 73
Header & Precompile
NguyễnVănVỵ
calender.h
schedule.h
#ifndef CALENDER_H
#define CALENDER_H
#ifndef SCHEDULE_H
#define SCHEDULE_H
#include ”date.h”
...
#include ”date.h”
...
#endif
#endif
Bộ môn Công nghệ phần mềm – ĐHCN 74
Header & Precompile
NguyễnVănVỵ
JobManager.c
#include ”calender.h”
#include ”schedule.h”
...
void main()
{
...
}
Bộ môn Công nghệ phần mềm – ĐHCN 75
C©u hái «n tËp
NguyễnVănVỵ
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 76
C©u hái «n tËp
NguyễnVănVỵ
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 77
C©u hái và thảo luận
NguyễnVănVỵ
Bộ môn Công nghệ phần mềm – ĐHCN 78