Saveti za debagovanje koda na primeru petlji u JavaScript-u
Sada ću vas naučiti metodologiji pronalaženja grešaka u kodu. Zamislimo da iz nekog nesporazuma niste pratili savete iz prethodne lekcije i dobili ste kod koji ne radi. Hajde da pogledamo kako da pronađemo greške i nateramo ga da radi.
Mnogi početnici koriste pogrešnu metodologiju pretraživanja. Uzmu i gledaju u kod, u nadi da će primetiti grešku. I tako par sati. Tako to ne funkcioniše.
Ispravna metodologija je ispisivanje promenljivih u konzolu i određivanje da li se tamo nalazi ono što treba, ili ne. Pritom treba početi od pretpostavljenog mesta problema i kretati se nagore po kodu. Hajde da pogledamo u praksi.
Neka za primer pred vama stoji zadatak da se pređe kroz niz dvocifrenih brojeva i nađu brojevi kod kojih je prva cifra za jedan veća od druge. Neka zbog jednostavnosti u nizu budu sačuvani brojevi u obliku stringova.
Neka ste rešili zadatak i dobili sledeći kod:
let arr = ['21', '32', '34', '43', '45', '54', '55'];
let sum = 0;
for (let elem of arr) {
if (elem[0] === elem[1] + 1) {
sum += elem;
}
}
console.log(sum); // daje 0
Kod, međutim, daje 0. U ovom
slučaju, prvo što treba uraditi je proveriti,
da li izvršenje koda ulazi u if.
Ispisaćemo nešto u konzoli unutar njega:
let arr = ['21', '32', '34', '43', '45', '54', '55'];
let sum = 0;
for (let elem of arr) {
if (elem[0] === elem[1] + 1) {
console.log('!'); // ne ispisuje ništa
sum += elem;
}
}
console.log(sum);
Pošto se ništa nije pojavilo u konzoli, to znači da se izvršenje koda jednostavno ne uvlači u uslov. Pogledaćemo svojim očima šta to upoređujemo:
let arr = ['21', '32', '34', '43', '45', '54', '55'];
let sum = 0;
for (let elem of arr) {
console.log(elem[0], elem[1] + 1); // '2' i '11', '3' i '21' ...
if (elem[0] === elem[1] + 1) {
sum += elem;
}
}
console.log(sum);
Kao rezultat, odmah postaje vidljivo da je drugi sabirak dvocifren. Lako je shvatiti da je to zbog toga što se jedinica dodaje kao string. Ispravićemo problem:
let arr = ['21', '32', '34', '43', '45', '54', '55'];
let sum = 0;
for (let elem of arr) {
if (+elem[0] === +elem[1] + 1) { // ispravljamo
sum += elem;
}
}
console.log(sum); // '021324354'
Nakon ispravke već vidimo da se
u promenljivoj sum nešto pojavilo,
mada nekorektno. Vidi se, međutim,
da se tamo nalazi ono što nam treba,
ali je sabrano u obliku stringova,
a ne brojeva. Ispravićemo problem:
let arr = ['21', '32', '34', '43', '45', '54', '55'];
let sum = 0;
for (let elem of arr) {
if (+elem[0] === +elem[1] + 1) {
sum += +elem; // ispravljamo
}
}
console.log(sum); // sve radi
Ispravite greške učinjene u sledećem kodu:
let obj = {a: 10, b: 20, c: 30, d: 40, e: 50};
let sum = 0;
for (let elem in obj) {
if (elem[0] === '1' && elem[0] === '2') {
sum += +elem;
}
}
console.log(sum);