Chuong5 Defensive Programming

You might also like

Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1of 53

Chuong V Defensive Programming

Khai niem : DEFENSIVE PROGRAMMING


Xut pht t khi nim defensive driving. Khi li xe bn lun phi tm nim rng bn khng bao gi bit chc c ngi li xe khc s lm g. Bng cch , bn c th chc chn rng khi h lm iu g nguy him, th bn s khng b nh hng ( tai nn). Bn c trch nhim bo v bn thn, ngay c khi ngi khc c li Trong defensive programming, tng chnh l nu chng trnh ( con) c truyn d liu ti, n cng khng sao, k c khi vi CT khc th s b fault. Mt cch tng qut, lp trnh phng th ngha l : lm th no t bo v mnh khi th gii lnh lng,tn nhn ca d liu khng hp l, cc s kin m c th "khng bao gi" xy ra, v cc lp trnh vin khc sai lm

1. Bo v CT khi cc Invalid Inputs


Trong thc tin :Garbage in, garbage out. Trong lp trnh rc ri vo rc ri ra l iu khng chp nhn Mt CT tt khng bao gi sn xut ra rc ri, bt k u va l g ! Vi 1 CT tt th :rc ri vo, khng c g ra, rc ri vo, c thng bo li hoc khng cho php rc ri vo. Theo tiu chun ngy nay, garbage in, garbage out l du hiu ca nhng CT ti, khng an ton

Quan sat va cho nhan xet ve doan code sau


switch(value1) { case 1: value2 = 1; break; case 2: value2 = 4; break; } return(1 / value2);

for (int i = 0; i != limit; i++) {...} for (double i = 0; i != 10.0; i += 1) // safe neu I khong bi thay doi trong than vonglap for (double i = 0; i != 1.0; i += 0.1) // not ok ?

3 cch x l rc vo.
Kim tra gi tr ca mi d liu t ngun bn ngoi
Khi nhn d liu t file, bn phm, mng, hoc t cc ngun ngoi khc, hy kim tra m bo rng d liu nm trong gii hn cho php. Hy m bo rng gi tr s nm trong dung sai v xu phi ngn x l , Nu mt chui c d nh i din cho mt phm vi gii hn ca cc gi tr (nh mt ID giao dch ti chnh hoc mt ci g tng t), hy chc chn rng cc chui l hp l cho mc ch ca n; nu khng t chi . Nu bn lm vic trn 1 ng dng bo mt, hy c bit lu n nhng d liu c th tn cng h thng : C lm trn b nh , injected SQL commands, injected html hay XML code, trn s

3 cch x l rc vo
Check the values of all routine input parameters
Kim tra gi tr ca tt c cc tham s truyn vo cc hm cng cn nh kim tra d liu nhp t ngun ngoi khc

Decide how to handle bad inputs


Khi pht hin 1 tham s hay 1 d liu khng hp l, bn cn lm g vi n? Ty thuc tnh hung, bn c th chn 1 trong cc phng n c m t chi tit cc phn sau .

2 Assertions
1 macro hay 1 CT con dng trong qu trnh pht trin ng dng , cho php CT t kim tra khi chy. Return true >> OK, false >> c 1 li g trong CT. VD : Nu h thng cho rng file d liu v khch hng khng bao gi vt qu 50 000 bn ghi, CT c th cha 1 assertion rng s bn ghi l <= 50 000. Khi m s bn ghi <= 50,000, assertion s khng c phn ng g. Nu m c hn 50 000 bn ghi, n s ln ting khng nh rng c 1 li trong CT

S dng assertions ghi li nhng gi thit c a ra trong code v loi b nhng iu kin khng mong i. Assertions c th c dng kim tra cc gi thit nh :
Cc tham s u vo nm trong phm vi mong i (tng t vi cc tham s u ra) file hay stream ang c m (hay ng) khi 1 CTC bt u thc hin (hay kt thc) 1 file hay stream ang bn ghi u tin (hay cui cng) khi 1 CTC bt u ( hay kt thc) thc hin 1 file hay stream c m c, ghi, hay c c v ghi Gi tr ca 1 tham s u vo l khng thay i bi 1 CTC 1 pointer l non-NULL 1 mng c truyn vo CTC c th cha t nht X phn t 1 bng c khi to cha cc gi tr thc 1 danh sch l rng (hay y) lkhi 1 CTC bt u (hay kt thc) thc hin

End users khng cn thy cc thng bo ca assertion ; Assertions ch yu c dng trong qu trnh pht trin hay bo dng ng dng. Dch thnh code khi pht trin, loi b khi code trong sn phm >>performance

Rt nhiu NNLT h tr assertions : C++, Java v Visual Basic. K c khi NNLT khng h tr, th cng c th d rng xd VD: #define ASSERT( condition, message ) { if ( !(condition) ) { cout << "Assertion << condition <<message; exit( EXIT_FAILURE ); } }

Typical definition of assert:

#ifdef DEBUG #define asssert(EXP) \ (void)((EXP) || ( assert(#EXP, FILE , \ LINE ),\ 0)) #else #define assert(EXP) ((void) 0) #endif void assert(const char *cond, const char *fn, int ln) {fflush(stdout); fprintf(stderr,%s failed at File: %s, Line: %d, cond, fn, ln); fflush(stderr); /* Version of strlen with assert */ exit(1); }

void strlen(char *inp) { int i=0; assert(inp != (char *) NULL); while (inp[i] != 0) { i++; assert(i <= MAXSTRINGSIZE); } assert(inp[i] == 0); return (i);

Guidelines for Using Assertions


S dng code x l li vi nhng iu kin ta ch i s xy ra; Dng assertions cho cc K khng mong i ( khng bao gi xy ra)
Error-handling : checks for bad input data Assertions : check for bugs in the code. Error handling hng ti vic x l li, cn assertion th hng n vic hiu chnh chng trnh , to ra new version of software

Trnh a code x l vo trong assertions


iu g xy ra khi ta turn off the assertions ?

Guidelines for Using Assertions(tt)


Vi cc h thng ln, assert, v sau x l li
Vi 1 nguyn nhn gy li xc nh, hoc l dng assertion hoc error-handling , nhng khng dng c 2. ?

Vi cc HT ln, nhiu ngi cng Pt v ko di 5-10 nm, hoc hn na ?


C assertions v error handling code c th c dng cho cng 1 li. V d trong source code cho Microsoft Word, nhng iu kin lun tr v true th c dng assertion, nhng ng thi cng c x l.

Vi cc h thng cc ln, ( VD Word) , assertions l rt c li v n gip loi b rt nhiu li trong qu trnh PT HT

3. K thut x l li Error Handling Techniques


Error handling dng x l cc li m ta ch i s xy ra Ty theo tnh hung c th, ta c th tr v :
1 gi tr trung lp thay th on tip theo ca d liu hp l tr v cng gi tr nh ln trc thay th gi tr hp l gn nht Ghi vt 1 cnh bo vo tp tr v 1 m li gi 1 th tc hay i tng x l hin 1 tbao hay tt my

Chc chn thay v chnh xc Gi s mt ng dng hin th thng tin ha trn mn hnh. Mt vi im nh gc ta di bn phi hin th mu sai. Ngy tip theo, mn hnh s lm mi, li khng cn.Phng php x l li tt nht l g? Chnh xc c ngha l khng bao gi gp li li Chc chn c ngha l phn mm lun chy thng, k c khi c li u tin tnh chc chn c tnh chnh xc. Bt c kt qu no bao gi cng thng l tt hn so vi Shutdown. Thnh thong trong cc trnh x l vn hin th mt phn ca mt dng vn bn pha di mn hnh. Khi ta mun tt CT ? Ch cn nhn PgUp hoc PgDn, mn hnh s lm mi => hin th bnh thng.
i khi, loi b 1 li nh, li rt tn km. Nu li chc chn khng nh hng n mc ch c bn ca ng dng, khng lm CT b die, hoc lm sai lch kt qu chnh, ngi ta c th b qua, m khng c sa c th gp phi cc nguy c khc. Phn mm chu li ? : phn mm sng chung vi li, m bo tnh lin tc, n nh

4. X l ngoi l - Exceptions
Exception : bt cc tnh hung bt thng v phc hi chng v trng thi trc . Dng Ngoi l thng bo cho cc b phn khc ca chng trnh v li khng nn b qua
Li ch ca ngoi l l kh nng bo hiu iu kin li . Phng php tip cn khc x l cc li to ra kh nng m mt iu kin li c th truyn b thng qua mt c s m khng b pht hin. Ngoi l c th loi tr kh nng .

Ch dng ngoi l cho nhng iu kin thc s ngoi l


Exceptions c dng trong nhng tnh hung ging assertions cho cc s kin khng thng xuyn, nhng c th khng bao gi xy ra Exception c th b lm dng v ph v cc cu trc, iu ny d gy ra li, v lm sai lch lung iu khin

V d : trong cc PM ng dng, khi x l d liu ( C#) try { cmd.ExecuteNonQuery(); ErrorsManager.SetError(ErrorIDs.KhongCoLoi); } catch { ErrorsManager.SetError(ErrorIDs.SQLThatBai, database.DbName,ten_strore"); } VB.NET Try Return CBO.FillCollection(CType(SqlHelper.ExecuteReader(ConStr, "TimHDon", iSoHoaDon), IDataReader),GetType(ThanhToan.ChiTietHDInfo)) Catch ex As Exception mesagebox.show(ex.message) End Try

Dim tran As SqlTransaction Try conn.Open() tran = conn.BeginTransaction() SqlHelper.ExecuteNonQuery(tran, "ThemHDon",_ HDInfo.SoHoaDonTC, HDInfo.TenKhach, _ HDInfo.PhuongThucTT) iMaHD = GetMaHoaDon_Integer(tran) For Each objCT In arrDSCT SqlHelper.ExecuteNonQuery(tran, "ThemCTHD", objCT.ChiTiet, _ objCT.SoTienVND, iMaHDP) Next tran.Commit() Catch ex As Exception tran.Rollback() End Try

Phc hi ti nguyn khi xy ra li ?


Thng th khng phc hi ti nguyn Nhng s hu ch khi thc hin cc cng vic nhm m bo cho thng tin trng thi r rng v v hi nht c th Nu cc bin vn cn c truy xut th chng nn c gn cc gi tr hp l Trng hp thc thi vic cp nht d liu, nht l trong 1 phin transaction lin quan ti nhiu bng chnh, ph, th vic khi phc khi c ngoi l l v cng cn thit. ( rollback )

5.G ri - debbuging
Cc chng trnh vit c th c nhiu li ? ti sao phn mm li phc tp vy ? S phc tp ca Ct lin quan n cch thc tng tc ca cc thnh phn ca ct , m 1 phn mm li bao gm nhiu thnh phn v cc tng tc gia chng Nhiu k thut lm gim s lng cc thnh phn tng tc :
Che giu thng tin Tru tng ha

C cc k thut nhm m bo tnh ton vn thit k phn mm


Documentation Lp m hnh Phn tch cc yu cu Kim tra hnh thc

Nhng cha c 1 k thut no lm thay i cch thc xy dng phn mm => lun xut hin li khi test, phai loi b = g ri !

Ngay LTV chuyn nghip cng tn nhiu thi gian cho g ri ! Lun rt kinh nghim t cc li trc Vit code v gy li l iu bnh thng vn l lm sao khng lp li LTV gii l ngi gii g ri G ri khng n gin, tn thi gian => cn trnh gy ra li. Cc cch lm gim thi gian g ri l :
Thit k tt Phong cch LT tt Kim tra cc K bin Kim tra cc khng nh assertion v tnh ng n trong m ngun Thit k giao tip tt, gii hn vic s dng d liu ton cc Dng cc cng c kim tra

Phng bnh hn cha bnh !!

ng lc chnh cho vic ci tin cc ngn ng LT l c gng ngn chn cc li thng qua cc c trng ngn ng nh :
Kim tra cc gii hn bin ca cc ch s Hn ch khng dng con tr, b dn dp, cc kiu d liu chui Xc nh kiu nhp/xut Kim tra d liu cht ch.

Mi ngn ng cng c nhng c tnh d gy li : lnh goto, bin ton cc, con tr tr ti vng khng xc nh, chuyn kiu t ng LTV cn bit trc nhng c th trnh cc li tim n, ng thi cn kch hot mi kh nng kim tra ca trnh bin dch v quan tm n cc cnh bo V d : so snh C,Pascal, VB

Debugging Heuristic
Debugging Heuristic (1) Understand error messages (2) Think before writing (3) Look for familiar bugs (4) Divide and conquer (5) Add more internal tests (6) Display output (7) Use a debugger (8) Focus on recent changes When Applicable Build-time

Run-time

Understand Error Messages


G ri khi build-time d hn lc run-time, khi v ch khi ta (1) Hiu c cc thng bo li!!!
Mt s l t preprocessor
#include <stdioo.h> int main(void) /* Print "hello, world" to stdout and return 0. { printf("hello, world\n"); return 0; }

Misspelled #include file

Missing */

$ gcc217 hello.c -o hello hello.c:1:20: stdioo.h: No such file or directory hello.c:3:1: unterminated comment hello.c:2: error: syntax error at end of input

Understand Error Messages (tt)


(1) Hiu c cc thng bo li!!!
Mt s l t compiler
#include <stdio.h> int main(void) /* Print "hello, world" to stdout and return 0. */ { printf("hello, world\n") retun 0; }

Misspelled keyword

$ gcc217 hello.c -o hello hello.c: In function `main': hello.c:7: error: `retun' undeclared (first use in this function) hello.c:7: error: (Each undeclared identifier is reported only once hello.c:7: error: for each function it appears in.) hello.c:7: error: syntax error before numeric constant

Understand Error Messages (tt)


(1) Hiu c cc thng bo li!!!
Mt s l t linker
#include <stdio.h> int main(void) /* Print "hello, world" to stdout and return 0. */ { prinf("hello, world\n") return 0; }

Misspelled function name

Compiler warning (not error): prinf() is called before declared

Linker error: Cannot find definition of prinf()

$ gcc217 hello.c -o hello hello.c: In function `main': hello.c:6: warning: implicit declaration of function `prinf' /tmp/cc43ebjk.o(.text+0x25): In function `main': : undefined reference to `prinf' collect2: ld returned 1 exit status

Cc phng php g ri
Trnh g ri :
IDE : kt hp son tho,bin dch, g ri Cc trnh g ri vi giao din ha cho php chy chng trnh tng bc qua tng lnh hoc tng hm, dng nhng dng lnh c bit hay khi xut hin nhng k c bit, bn canh c cc cng c cho php nh dng v hin th gi tr cc bin, biu thc Trnh g ri c th c kch hot trc tip khi c li. Thng tm ra li , ta phi xem xt th t cc hm c kch hot ( theo vt) v hin th cc gi tr cc bin lin quan Nu vn khng pht hin c li : dng cc BreakPoint hoc chy tng bc step by step C nhiu cng c g ri mnh v hiu qu, ti sao ta vn mt nhiu thi gian v tr lc g ri ? Nhiu khi cc cng c khng th gip d rng tm li, nu a ra 1 cu hi sai, trnh g ri s cho 1 cu tr li, nhng ta c th khng bit l n ang b sai

Cc phng php g ri
C u mi , pht hin d rng :
Khi c li, ta thng cho trnh dch, th vin hay bt c nguyn nhn no khc tuy nhin, cui cng th li vn thuc v CT Rt may l hu ht cc li thng n gin v d tm. Hy kho st cc u mi ca vic xut ra kq c li v c gng suy ra nguyn nhn gy ra n Khi c c 1 s thng tin v li v ni xy ra li, hy tm dng ngm ngh xem li xy ra ntn. Suy lun ngc tr li trng thi ca CT b hng x nguyn nhn gy ra li G ri lin quan n vic lp lun li, ging nh tm kim cc b mt ca 1 v n. 1 s v khng th xy ra v ch c nhng thng tin xc thc mi ng tin cy. => phi i ngc t kt qu khm ph nguyn nhn, khi c li gii thch y , ta s bit c vn cn sa v c th pht hin ra 1 s v khc

Cc phng php g ri
Tm cc li tng t :
Khi gp v, hy lin tng n nhng trng hp tng t gp Vd1 : int n; scanf(%d,n); ? Vd2 : int n=1; double d=PI; printf(%d %f \n,d,n); ?? Khng khi to bin ( vi C) cng s gy ra nhng li kh lng.

Cc phng php g ri
Kim tra s thay i mi nht
Li thng xy ra nhng on CT mi c b xung Nu phin bn c OK, phin bn mi c li => li chc chn nm nhng on CT mi Lu , khi sa i, nng cp : hy gi li phin bn c n gin l comment li on m c c bit, vi cc h thng ln, lm vic nhm th vic s dng cc h thng qun l phin bn m ngun v cc c ch lu li qu trnh sa i l v cng hu ch ( source safe )

Cc phng php g ri
Trnh mc cng 1 li 2 ln : Sau khi sa 1 li, hy suy ngh xem c li tng t ni no khc khng. VD : for (i=1;i<argc;i++) { if (argv[i][0] !=-) break; switch (argv[i][1]) { case o : /* tn tp ouput -0Data */ outname = argv[i]; break; case f : /* Gi tr bin t -f100 */ from = atoi(argv[i]); break; case t : /* n -t500 */ to = atoi(argv[i]); break; } } Tp tin sai, v lun c o trc tn => outname= &agrv[i][2]; Tng t ? Ch : nu n gin c th vit code khi ng th cng ng ng gt khi vit code

Cc phng php g ri
G ri ngay khi gp
Khi pht hin li, hy sa ngay, ng sau mi sa, v c th li khng xut hin li ( do tnh hung) Cng ng qu vi vng, khng suy ngh chn chn, k cng, v c th vic sa cha ny nh hng ti cc tnh hung khc

Cc phng php g ri
c trc khi g vo
ng vi vng, khi khng r iu g thc s gy ra li v sa khng ng ch s c nguy c gy ra li khc C th vit on code gy li ra giy=> to cch nhn khc, v to c hi ngh suy ng min man chp c on khng c nguy c gy li, hoc in ton b code ra giy in => ph v cy cu trc

Cc phng php g ri
Gii thch cho ngi khc v on code
To k ngm ngh Thm ch c th gii thch cho ngi khng phi LTV Extrem programming : lm vic theo cp, pair programming, ngi ny LT, ngi kia kim tra, v ngc li Khi gp vn , kh khn, chm tin , lp tc thay i cng vic => rt ra khi lung qun tnh sai lm

Cc phng php g ri
Lm cho li xut hin li
C gng lm cho li c th xut hin li khi cn Nu khng c, th th tm nguyn nhn ti sao li khng c

Chia tr
Thu hp phm vi Tp trung vo d liu gy li

Cc phng php g ri
Hin th kt qu nh v khu vc gy li
Thm vo cc dng lnh in gi tr cc bin lin quan, hoc n gin xc nh tin trnh thc hin : n y 1

Vit m t kim tra


Vit thm 1 hm kim tra, gn vo trc v sau on c nguy c, comment li sau khi x l li

To log file Lu vt
Gip ghi nh c cc vn xy ra, v gii quyt cc v tng t sau ny, cng nh khi chuyn giao CT cho ngi khc..

Hin th KQ ..
In cc gi tr ti cc im nhy cm
Poor:
printf("%d", keyvariable);

Maybe better:
printf("%d\n", keyvariable);

stdout is buffered; CT c th c li trc khi hin ra output In '\n' s xa b nh m stdout , nhng s khng xa khi in ra file Gi fflush() lm sch buffer 1 cch tng minh

Better:
printf("%d", keyvariable); fflush(stdout);

Hin th KQ (cont.)
Maybe even better:
fprintf(stderr, "%d", keyvariable);

In debugging output ra stderr; debugging output c th tch bit vi cc in n ca CT Ngoi ra: stderr khng dng buffer Ghi ra 1 a log file

Maybe better still:


FILE *fp = fopen("logfile", "w"); fprintf(fp, "%d", keyvariable); fflush(fp);

Cc phng php g ri
Phng sch cui cng
Dng 1 trnh g ri chy tng bc Nhiu khi vn tng qu n gin nhng li khng pht hin c, v d cc ton t so snh trong pascal va VB c u tin ngang nhau, nhng vi C ? ( == v != nh hn <,<=,>,>= !) Th t cc i s ca li gi hm : v d : strcpy(s1,s2) Th t thc hin cc php ton int m[6]={1,2,3,4,5,6}, *p,*q; p=m; q=p+2; *p++ =*q++; *p=*q; ??? Li loi ny kh tm v bn thn ngh ca ta vch ra 1 hng suy ngh sai lch : coi iu khng ng l ng i khi li l do nguyn nhn khch quan : Trnh bin dch, th vin hay h iu hnh, hoc li phn cng : 1994 li x l du chm ng trong b x l Pentium

Cc li xut hin tht thng :


Kh gii quyt Thng gn cho li ca my tnh, h iu hnh Thc ra l do thng tin ca chnh CT : khng phi do thut ton, m do thng tin b thay i qua mi ln chy Cc bin c khi to ht cha ? Li cp pht b nh ? Vd : char *vd( char *s) { char m[101]; strncpy(m,s,100) return m; } - Gii phng b nh ng ? for (p=listp; p!=NULL; p=p->next) free(p) ; ???

Tm li
G ri l 1 ngh thut m ta phi luyn tp thng xuyn Nhng l ngh thut m ta khng m c M ngun vit tt c t li hn v d tm hn u tin phi ngh n ngun gc sinh ra li Hy suy ngh k cng, c h thng nh v khu vc gy li Khng g bng hc t chnh li ca mnh iu ny cng ng i vi LTV

Thm Nhng li thng gp vi C, C++


1. Array as a parameter handled improperly Tham s mng c x l khng ng cch 2. Array index out of bounds Vt ra ngoi phm vi ch s mng 3. Call-by-value used instead of call-by reference for function parameters to be modified Gi theo gi tr, thay v gi theo tham chiu cho hm sa 4. Comparison operators misused Cc ton t so snh b dng sai 5. Compound statement not used - Lnh phc hp khng c dng 6. Dangling else - nhnh else khong hp l 7. Division by zero attempted - Chia cho 0 8. Division using integers so quotient gets truncated Dng php chia s nguyn nn phn thp phn b ct 9. Files not closed properly (buffer not flushed) - File khng c ng ph hp ( buffer khng b dp) 10. Infinite loop - lp v hn 11. Global variables used dng bin tng th

12. IF-ELSE not used properly dng if-else khng chun 13. Left side of assignment not an L-value - pha tri php gn khng phi bin 14. Loop has no body vng lp khng c thn 15. Missing "&" or missing "const" with a call-by-reference function parameter thiu du & hay t kha const vi li gi tham s hm theo tham chiu 16. Missing bracket for body of function or compound statement Thiu cp {} cho thn ca hm hay nhm lnh 17. Mission reference to namespace - Thiu tham chiu ti tn min 18. Missing return statement in a value-returning function Thiu return 19. Missing semi-colon in simple statement, function prototypes, struct definitions or class definitions thiu du ; trong lnh n 20. Mismatched data types in expressions kiu d liu khng hp 21. Operator precedence misunderstood - Hiu sai th t cc php ton

22. Off-by-one error in a loop Thot khi bi 1 li trong vng lp 23. Overused (overloaded) local variable names - Trng tn bin cc b 24. Pointers not set properly or overwritten in error Con tr khng c xc nh ng hoc tr vo 1 v tr khng c 25. Return with value attempted in void function tr v 1 gi tr trong 1 hm void 26. Undeclared variable name khng khai bo bin 27. Un-initialized variables Khng khi to gi tr 28. Unmatched parentheses thiu } 29. Un-terminated strings - xu khng kt thc , thiu 30. Using "=" when "= =" is intended or vice versa 31. Using "&" when "&&" is intended or vice versa 32. "while" used improperly instead of "if while c dng thay v if

Doan store sau tra ve soHD co gia tri bang sohd duoc tao ra gan day nhat +1 ( de tao soHD ngam dinh cho hoa don moi). SoHD nay khong bao gio vuot qua gioi han int, vi moi dot nguoi ta in 1 so gioi han hoa don ( khoang 10 000 hoac 20 000 HD), danh so tu 1. Het dot cu, in dot moi, va so lai quay ve 1.Hoa don goc thi chi 1 loai, nhung 1 so duoc in tu may tinh, 1 so viet tay, vi vay duoc luu vao may tinh trong 2 bang ( HoaDon va HoaDoanPhu) Store va chuong trinh tao hoa don chay tot tu nam 2005, gan day, tu nhien xuat hien loi : timeout. Sau gan 1 tuan ra soat, tim hieu, LTV xac dinh loi la tai store nay. Tim hieu nguyen nhan va cach xu ly !
ALTER Proc [dbo].[GetSoHDTC_Integer] as SELECT top 1 (a.SoHDTC+1) as SoHDTC FROM (SELECT CAST(SoHoaDonTC AS int)as SoHDTC,ngay as ngaylap FROM HoaDon union all SELECT CAST(SoHoaDonTC AS int)as SoHDTC ,ngaylap FROM HoaDonPhu ) a order by ngaylap desc

Phong benh hon chua benh : Cac ky thuat viet code chat luong
Viet code co chat luong nham tranh gay ra loi
1. Think before coding 2. Fix bugs immediately 3. Test individual functional elements 4. Test complete puzzle ( ng tng test tng hm l xong ) 5. Write robust code components (ng lm vic na chng )

6. Fail as early as possible (Pht hin v ngn chn li ngay t u=> tit kim ..) 7. Prefer strong typing over dynamic binding 8. Write self-explanatory code 9. Avoid sophisticated code 10. Use good programming style 11. Avoid magic constants ( ng dng cc hng trc tip trong code !) 12.Keep related code close together 13. Build a house, not an empire (K.I.S.S. principle (Keep it simple, stupid) and the YAGNI principle (You aren't gonna need it) )

Phu luc
Da nang hoa toan tu +,*, +=,*= cua lop matrix

#include <iostream.h> class Matrix { private: int R,C; double **Data; public: Matrix(int M=2,int N=2, double V=0); ~Matrix(); void Print() const; double & operator () (int M,int N); Matrix operator +(Matrix m); Matrix operator +=(Matrix m); Matrix operator *(Matrix m); Matrix operator *=(Matrix m); void Nhapsl(); };

Matrix::Matrix(int M,int N,int V) { // Hm khi to int I,J; R=M; C=N; Data = new double *[R]; double *Temp=new double[R*C]; for(I=0;I<R;++I) { Data[I]=Temp; Temp+=C; } for(I=0;I<R;++I) for(J=0;J<C;++J) Data[I][J]=V; } Matrix::~Matrix() { // Hm hy delete [] Data[0]; delete [] Data; }

void Matrix::Print() const { for(int I=0;I<R;++I) { for(int J=0;J<C;++J) { cout.width(5); // canh l phi chiu di 5 k t cout<<Data[I][J]; } cout<<endl; } } int & Matrix::operator () (int M,int N) { return Data[M][N]; }

Matrix Matrix::operator +(Matrix m) { if(R !=m.R || C !=m.C) { cout << Khng th cng 2 ma trn \n; return 1; } Matrix T(R,C); for ( int i=0;i<R;i++) for (int j=0;j<C;j++) T.Data[i][j] = Data[i][j]+m.Data[i][j]; return T; } Matrix operator +=(Matrix m) { ??? Tai sao toan tu += phai tra ve 1 matrix ? Khi tra ve 1 doi tuong co thanh vien du lieu dc cap phat dong, dieu gi se xay ra ??? Can hoan thien ct the nao ? ( dinh nghia lai toan tu gan ) }

Matrix Matrix::operator *(Matrix m) { if(C !=m.R ) { cout << Khng th nhn 2 ma trn \n; return 1; } Matrix T(R,m.C); for ( int i=0;i<R;i++) for (int j=0;j<m.C;j++) for (int k =0;k<C;k++) T.Data[i][j] += Data[i][k] * m.Data[k][j]; return T; } Matrix Matrix::operator *(Matrix m) { ???} void Matrix::nhapsl( ){???}

You might also like