Lp trình trc quan
136
BÀI 17. DEBUG
Bugs là nhng li ca chương trình mà ta phát hin khi chy nó. Debug là công vic loi tt
c nhng lm trong chương trình để nó chy êm xuôi trong mi tình hung.
Thông thường mun sa mt cái bug nào trước hết ta phi tìm hiu lý do khiến nó xut
hin. Mt khi đã biết được duyên c ri ta s nghĩ ra cách gii quyết. Nói chung, có hai loi
bugs : hoc là chương trình không làm đúng chuyn cn phi làm vì lp trình viên hiu lm
Specifications hay được cho tin tc sai lc, hoc là chương trình b sót chi tiết cn phi có.
Trường hp này ta gii quyết bng cách gim thiu s hiu lm qua s nâng cp kh năng
truyn thông.
Chương trình không thc hin đúng như ý lp trình viên mun, tc là lp trình viên mun
mt đàng mà bo chương trình làm mt ngã vì vô tình không viết chương trình đúng cách.
Trường hp này ta gii quyết bng cách dùng nhng Software Tools (k c ngôn ng lp
trình) thích hp, và có nhng quá trình làm vic có h thng.
Có nhiu yếu t nh hưởng đến cht lượng ca mt chương trình như chc năng ca
chương trình, cu trúc ca các b phn, k thut lp trình và phương pháp debug. Debug
không hn nm giai đon cui ca d án mà tùy thuc rt nhiu vào các yếu t k trên trong
mi giai đon trin khai.
17.1. Đặc t chương trình (Program Specifications)
Du chương trình ln hay nh, trước hết ta phi xác định rõ ràng và t m nó cn phi làm
gì, bao nhiêu người dùng, mng như thế nào, database ln bao nhiêu, phi chy nhanh đến
mc nào .v.v..
Có nhiu chương trình phi b thay đổi na chng vì lp trình viên hiu lm điu khách
hàng mun. Do đó trong s liên h vi khách hàng ta cn phi hi đi, hi li, phn hi vi
khách hàng nhiu ln điu ta hiu bng thư t, tài liu, để khách xác nhn là ta biết đúng ý h
trước khi xúc tiến vic thiết kế chương trình. Nếu sau này khách đổi ý, đó là quyn ca h,
nhưng h phi tr tin thay đổi (variation).
Lp trình trc quan
137
17.1.1 Cu trúc các b phn
Chương trình nào cũng có mt kiến trúc tương t như mt c máy. Mi b phn càng đơn
gin càng tt và cách ráp các b phn phi như thếo để ta d th. Trong khi thiết kế ta phi
biết trước nhng yếu đim ca mi b phn nm đâu để ta chun b cách th chúng. Ta s
không h tin b phn nào hoàn ho cho đến khi đã th nó, dù nó đơn gin đến đâu.
Nếu ta mun dùng mt k thut gì trong mt hoàn cnh nào mà ta không biết chc nó chy
không thì nên th riêng r nó trước. Phương pháp y đưc gi là Prototype.
Ngoài ra, ta cũng nên xây dng nhng kch bn test cho nhng trường hp đặc bit, đin
hình là bad data - khi người s dng bm lung tung hay database cha nhiu rác.
Nếu chương trình chy trong real-time (tc là data thu nhp qua Serial Com Port, Data
Acquisition Card hay mng), chúng ta cn phi lưu ý nhng trường hp khác nhau tùy theo
vic gì xy ra trước, vic gì xy ra sau. Lúc by gi Logic ca chương trình s tùy thuc vào
trng thái (State) ca data. Tt nht là nghĩ đến nhng Scenarios để có th th tng giai đon
và tình hung.
Ngày nay vi k thut hướng đối tượng, giai đon thiết kế này là lúc quyết định các Data
Structures (tables, records ..v.v.) và con s Forms vi Classes. Nh rng mi Class gm có
mt Data Structure và nhng Subs/Functions/Properties làm vic (operate) trên data y. Data
structure phi cha đầy đủ nhng chi tiết (data fields, variables) ta cn. Kế đó là nhng cách
chương trình process data. Subs/Functions nào có th cho bên ngoài gi thì ta cho nó Public,
còn nhng Subs/Functions khác hin hu để phc v bên trong class thì ta cho nó Private.
17.1.2 K thut lp trình
Kiến thc cơ bn ca lp trình viên và các thói quen ca h rt quan trng. Nói chung,
nhng người hp tp, nhy vào viết chương trình trước khi suy nghĩ hay cân nhc chín chn
thì sau này bugs xut hin nhiu là điu t nhiên.
17.1.3 Dùng Subs và Functions
Nếu giai đon thiết kế kiến trúc ca chương trình ta chia ra tng Class, thì khi lp trình ta
li thiết kế chi tiết v Subs, Functions .v.v.., mi th s cn phi th như thế nào. Nếu ta có th
chia công vic ra tng giai đon thì mi giai đon có th mà mt call đến mt Sub. Th gì cn
phi tính ra hay ly t nơi khác thì có th được thc hin bng mt Function.
Lp trình trc quan
138
Nh rng đim khác bit chính gia mt Sub và mt Function là Function cho ta mt kết
qu mà không làm thay đổi nhng parameters ta đưa cho nó. Trong khi đó, du rng Sub
không cho ta gì mt cách rõ ràng nhưng nó có th thay đổi tr s (value) ca bt c parameters
nào ta chuyn cho nó ByRef. Nhc li là khi ta chuyn mt parameter ByVal cho mt Sub thì
ging như ta đưa mt copy (bn sao) ca variable đó cho Sub, Sub có th sa đổi nó nhưng nó
s b b qua, không nh hưởng gì đến original (bn chính) variable.
Ngược li khi ta chuyn mt parameter ByRef cho mt Sub thì ging như ta đưa bn chính
ca variable cho Sub để nó có th sa đổi vy.
Do đó để tránh trường hp vô tình làm cho tr s mt variable b thay đổi vì ta dùng nó
trong mt Sub/Function chúng ta nên dùng ByVal khi chuyn nó như mt parameter vào mt
Sub/Function.
Tht ra, chúng ta có th dùng ByRef cho mt parameter chuyn vào mt Function. Trong
trường hp đó dĩ nhiên variable y có th b sa đổi. Điu này gi là phn ng ph (side
effect), vì bình thường ít ai làm vy. Do đó, nếu chúng ta tht s mun vượt ngoài qui ước
thông thường thì nên Comment rõ ràng để cnh báo người s đọc chương trình chúng ta sau
này.
Ngoài ra, mi lp trình viên thường có mt Source Code Library ca nhng
Subs/Functions ưng ý. Chúng ta nên dùng các Subs/Functions trong Library ca chúng ta càng
nhiu càng tt, vì chúng đã đưc th nghim ri.
17.2. Mt s lưu ý
17.2.1 Đừng s Error
Mi khi chương trình có mt Error, hoc là Compilation Error (vì ta viết code không đúng
văn phm, ng vng), hoc là Error trong khi chy chương trình, thì chúng ta không nên s
nó. Hãy bình tĩnh đọc cái Error Message để xem nó mun nói gì. Nếu không hiu ngay thì
đọc đi đọc li vài ln và suy nghim xem có tìm được s hướng dn nào không. Khi lp trình
chúng ta s gp Errors rt nhiu, nên chúng ta phi tp bình tĩnh đối din vi chúng.
Lp trình trc quan
139
17.2.2 Dùng Comment (Chú thích)
Lúc viết code nh thêm Comment đầy đủ để bt c khi nào tr li đọc đon code y trong
tương lai chúng ta không cn phi da vào tài liu nào khác mà có th hiu ngay lp tc mc
đích ca mt Sub/Function hay đon code.
Như thế không nht thiết chúng ta phi viết rt nhiu Comment nhưng hđim nào khác
thường, bí him thì chúng ta cn thông báo và gii thích ti sao chúng ta làm cách y. Có th
sau này ta khám phá ra đon code có bugs; lúc đọc li có th ta s thy du rng ý định và thiết
kế đúng nhưng cách lp trình có phn thiếu kim soát chng hn.
Tính ra trung bình mt lp trình viên ch làm vic 18 tháng mi ch. Tc là, gn như chc
chn code chúng ta viết s được người khác đọc và bo trì ( debug và thêm bt). Do đó, code
phi càng đơn gin, d hiu càng tt. Đừng lo ngi là chương trình s chy chm hay chiếm
nhiu b nh, vì ngày nay computer chy rt nhanh và b nh rt r. Khi nào ta tht s cn
phi quan tâm v vn tc và b nh thì điu đó cn được thiết kế cn thn ch không phi da
vào nhng tiu xo v lp trình.
17.2.3 Đặt tên các variables có ý nghĩa
Trong thc tế chúng ta gp rt nhiu khó khăn khi làm vic vi các variables có tên vn tt
như K, L, AA, XY. Ta không có mt chút ý nim gì v chúng, mc đích s dng chúng làm
gì. Thay vào đó, nếu ta đặt các tên variables như NumberOfItems, PricePerUnit, Discount
.v.v.. thì s d hiu hơn.
Mt trong nhng bugs khó thy nht là ta dùng cùng mt tên cho local variable (variable
declared trong Sub/Function) và global variable (variable declared trong Form hay Basic
Module). Local variable s che đậy global variable cùng tên, nên nếu chúng ta mun nói đến
global variable trong hoàn cnh y chúng ta s dùng lm local variable.
17.2.4 Dùng Option Explicit
Chúng ta nên trung thành vi cách dùng Option Explicit đầu mi Form, Class hay
Module. Nếu có variable nào đánh vn sai VB6 IDE s cho chúng ta biết ngay. Nếu chúng ta
không dùng Option Explicit, mt variable đánh vn sai được xem như mt variable mi vi
giá tr 0 hay "" (empty string).
Lp trình trc quan
140
Nói chung chúng ta nên thn trng khi assign mt data type cho mt variable vi data type
khác. Chúng ta phi biết rõ chúng ta đang làm gì để khi b phn ng ph (side effect).
17.2.5 Desk Check
Kim li code trước khi compile. Khi ta compile code, nếu không có error ch có nghĩa là
Syntax ca code đúng, không có nghĩa là logic đúng. Do đó ta cn phi biết chc là code ta
viết s làm đúng điu ta mun bng cách đọc li code trước khi compile nó ln đầu tiên. Công
vic này gi là Desk Check (Kim trên bàn). Mt chương trình được Desk Checked k s cn
ít debug và cha ít bugs không ng trước. Lý do là mi scenarios đã được tiên liu chu đáo.
17.2.6 Son mt Test Plan
Test Plan lit kê tt c nhng gì ta mun th và cách th chúng. Khi th theo Test Plan ta
s khám phá ra nhng bug và tìm cách loi chúng ra. H sơ ghi li lch s ca Test Plan (trc
trc gì xy ra, chúng ta đã dùng bin pháp nào để gii quyết) s b ích trên nhiu phương din.
Ta s hc được t kinh nghim Debug và biết rõ nhng th gì trong d án đã được th theo
cách nào.
17.3. Các k thut x lý li
17.3.1 X lý Error lúc Run time
Khi EXE ca mt chương trình viết bng VB6 đang chy, nếu gp Error, nó s hin th mt
Error Dialog cho biết lý do gây li. Sau khi chúng ta click OK, chương trình s ngưng. Nếu
chúng ta chy chương trình trong VB6 IDE, chúng ta có dp bo chương trình ngng trong
source code ch có Error bng cách bm button Debug trong Error Dialog. Tiếp theo đó chúng
ta có th tìm hiu tr s các variables để đoán nguyên do ca Error. Do đó, nếu chúng ta bt
đầu cho dùng mt chương trình chúng ta viết cho ni b đơn v, nếu tin thì trong vài tun
đầu, thay gì chy EXE ca chương trình, chúng ta chy source code trong VB6 IDE. Nếu có
bug nào xy ra, chúng ta có th cho chương trình ngng trong source code để debug.
Khi chúng ta dùng statement: ON Error Resume Next
Thì t ch đó tr đi, nếu chương trình gp Error, nó s b qua (ignore) hoàn toàn. Đim này
tin ch giúp chương trình EXE ca ta tránh b treo ngay lp tc ti đim xut hin bug.
Nhưng nó cũng bt li là khi khách hàng cho hay h gp nhng trường hp l, không gii
thích được (vì Error b ignored mà không ai để ý), thì ta cũng bí luôn, có th không biết bt