Sadržaj:
Stinkyeva for-petljica
Maddogov Update podataka u
bazi
Šampion nikad ne
kaže NOT! (by Stinky)
Točka, točka,
točkica (by svi šampioni)
Usporedba logičke varijable s True ili False (Stinky)
Zanimljivo izračunavanje broja elemenata polja (Nepoznati autor)
Šampionski efikasno brisanje svih zapisa u tablici (by Pridruženi
šampion)
Stinkyeva for-petljica Priča o Stinkyevoj for-petljici već je
ispričana u poglavlju o ovom programerskom gigantu ali nije zgorega
malo ponoviti. Dakle, Stinky je dobio hitan zahtjev za izmjenom jednog
modula u DAMP web aplikaciji. Inače je cijeli kod te web aplikacije
pisao i održavao Bojan, ali je tada dotični bio u Dembeliji na drugom
projektu. Budući da nitko drugi u firmi nije znao ASP, Stinky je bio
jedini logičan izbor za taj task.
Nije potrebno ni reći da se Bojan po povratku iz Dembelije užasnuo kad
je vidio kako je Stinky izmasakrirao njegov kod, ali naročito mu je
upala u oko sljedeća konstrukcija:
|
for x = -1
to c
if trs.EOF =
true or x > 100
then
exit for
end if
c = c + 1
(neka business akcija)
next |
Kada je malo bolje pogledao kod oko tog mjesta, shvatio je da je
Stinky prolazio kroz recordset (koji je on po svojoj konvenciji
imenovao trs) i radio istu akciju za svaki record u tom recordsetu.
Kada ga je pitao zašto umjesto ove lobotomične konstrukcije nije
napisao, onako štreberski i predvidljivo npr.
|
do until trs.EOF
(neka business akcija)
trs.moveNext
loop
|
, Stinky je samo odgovorio: "Pa for petljica mi se u tom
trenutku učinila zgodnijom. Htio sam malo eksperimentirati". Tada je
Bojan shvatio koliko je Stinkyu stalo do timskog rada, konvencija
kodiranja i obzira prema drugim developerima.
Maddogov Update podataka u bazi
Jednog dana u šampionima Maddog je bjesnio više nego inače i psovao
nešto što mu ne radi. Već su se ostali navikli da ga ignoriraju i
pojačaju zvuk na slušalicama, ali bio je stvarno naporan pa se Bartol
odlučio da ipak vidi što muči velikog šampiona. Maddog je objasnio da
mu stalno puca snimanje u bazu a kod je tako jednostavan i mora
raditi. Bartol ga je zamolio da mu pokaže kako sprema u bazu tj. gdje
je ta stored procedura. Na spomen stored procedura obrijana veličina
ga je samo pogledao i rekao: "Ma ne, ne koristim procedure, već to
radim iz koda u VB-u. Evo vidi:"
|
RSTemp.MoveFirst
WHILE NOT RsTemp.EOF
DO
RStemp.nesto = nesto
RSTemp.UPDATE
RSTemp.MoveNext
WEND |
Nakon prvog prolaska kroz petlju, update operacija je pucala. "A da li
si siguran da i nakon update možeš sigurno ići dalje kroz recordset,
možda ostane u nekom nedefiniranom stanju?", pitao je Bartol. "Ne, ne,
tako sigurno može, ovaj kod sam iskopirao iz DAMP-a", nije sumnjao u
svoje rješenje Maddog. "To ti je vrlo tricky operacija, ići kroz
recordset i usput ga stalno mijenjati. Ali dobro, ako ti kažeš. Nego,
daj da vidim tablicu koju hoćeš ažurirati", nastavio je Bartol. Nato
je Maddog u SQL Enterprise manageru otvorio definiciju tablice i
Bartol je kao iz topa izvalio jedno nevino pitanje: "A gdje ti je
PRIMARY key u tablici?" "Kakav primary key, zar to treba?", čudio se
Maddog, "pa MS Project tablice isto nemaju primary key!" "Pa, ne znam,
ja sam možda glup ali su mene učili da bi svaka tablica trebala imati
primarni ključ. Mislim da to muči i tvoj svemoćni ADO koji pokušava
nakon update doći do novog recorda a nema se za što uhvatiti", jedva
susprežući smijeh je procijedio Bartol, "ajde, probaj kreirati
primarni ključ u toj tablici." Uskoro je Maddog veselo uskliknuo: "Pa
to radi, jebi ga, ko bi rekao da treba napraviti taj primary key. Pa
ni oni ga nisu imali!" i sasuvši još par psovki na račun projektanata
MS projecta Maddog je nastavio otkrivati čarobni svijet programiranja.
Šampion nikad ne kaže NOT! (by Stinky)
Učeći programiranje šampionskom metodom pikanja, isprobavanja i
kopiranja tuđeg koda, Stinky je propustio naučiti jedan logički
operator. Možda zato što riječ NE nije u šampionskom vokabularu? Evo
kako je Stinkyev kod rješavao problem negiranja logičke vrijednosti, u
ovom slučaju Visible propertya njemu omiljene ActiveBar kontrole.
MDImain.ab.Bands("frmButtonBar").Visible = IIf(MDImain.ab.Bands("frmButtonBar").Visible,
False, True)
Točka, točka, točkica (by svi šampioni)
U gornjem primjeru jedne programske linije vidi se još jedan detalj
na koji šampioni nisu obraćali pažnju, a to je keširanje objektnih
propertya u lokalnim varijablama. Svatko tko je ikad čitao neke
priručnike ili knjige o programiranju zna da je višestruko uzastopno
pozivanje istih propertya i metoda objekata rasipanje vremena. Često
se iza propertya ne krije trivijalan podatak već se možda radi neki
time-consuming proces. Razumno je tada vrijednost propertya dohvatiti
samo jednom, pohraniti ih u lokalnim varijablama, a onda se kasnije
referencirati na te varijable. Takva navika može u nekim scenarijima
znatno povećati performanse programa, a programski kod ne postaje
znatno kompleksniji, dapače čak može biti jednostavniji i logičniji za
onog tko ga naknadno čita.
Keširanje se ne mora raditi samo kod pristupa objektima, već i kod
poziva obične funkcije koja radi neku transformaciju. Koliko je
šampionska ignorancija takvog pristupa bila velika, najbolje pokazuje
sljedeći nakaradni primjer:
|
If UBound(Split(strRecepientList, ";")) > -1
Then
For cnt = 0 To
UBound(Split(strRecepientList, ";"))
If Len(Split(strRecepientList,
";")(cnt)) > 0 Then
oMail.Recipients.Add
Split(strRecepientList, ";")(cnt)
Next cnt
End If |
Umjesto da lijepo jednom napravi Split stringa u array i to pohrani
u varijablu na koju će se kasnije stalno referencirati, šampionski
autor je uporno, copy-paste metodom, "cepao" string svaki put kad mu
je zatrebao neki element polja. Možda je mislio da kad jednom spremi
rezultat u varijablu to više neće biti isto.
Usporedba logičke varijable s True ili False (Stinky)
Ovo je bio Stinkyev specijalitet za koji nismo sigurni da ćete svi
shvatiti kao grešku. Čuli smo od još nekih samozvanih VB gurua da je
to normalna stvar. Hebi ga, mi valjda nismo normalni ali to nam je
smetalo jer je očito otkrivalo da Stinky ne kuži da u logičkim
izrazima ne mora uvijek stajati relacijski operator (=, < ili >). O
čemu se radi? Dakle, Stinky je običavao pisati npr.:
If FormLoaded("frmODBCOpen") =
True Then
Unload frmODBCOpen
Ako funkcija FormLoaded vraća boolean vrijednost, onda je suvišno
uspoređivati to s konstantom True, već se taj dio može izostaviti.
Dakle:If FormLoaded("frmODBCOpen")
Then Unload frmODBCOpen
I tako pišu svi koji se ne smatraju šampionima, bar iz našeg
iskustva. Griješimo li?
Zanimljivo izračunavanje broja elemenata polja (by Nepoznati autor)
Ovu cvebu ne možemo nažalost pripisati niti jednom od poznatih
šampiona ali vrijedi je zabilježiti. Dakle, autor je očito htio
izračunati koliko dobiveni array ima elemenata. S obzirom da su svi
šampioni tvrdili da su više nego iskusni u VB-u i VBScriptu, ostaje
pitanje zašto umjesto petlje nije jednostavno iskoristio UBound
funkciju. Možda se bojao upotrijebiti je? Ili, ne daj bože, nije znao
za nju?
|
aOrder = Split(strOrder, ",", -1, 1)
alen = 0
For Each a
In aOrder
alen = alen + 1
Next
|
Šampionski efikasno brisanje svih zapisa u tablici (by Pridruženi
šampion)
Sljedeći "coding pearl" je jednom od autora sitea ostao u sjećanju
iz vremena prije nego je došao u šampione ali se po ideji definitivno
zaslužuje uvrstiti među šampionske bisere. Autor bisera je inače jedan
stopostotni šampion iz vremena dok se još bavio programiranjem što je
na sreću prestao činiti. Da je upoznao Maddoga, vjerojatno bi se
lijepo slagali jer ovaj odsječak jako podsjeća na Maddogov stil
kodiranja i shvaćanja baza. Eh da, ne smijemo zaboraviti reći da
dotični autor nije imao pojma o SQL-u i da je tvrdio "Što će mi to,
kad u Accessu lijepo vizualno možeš složiti bilo kakav query?"
Kod je inače izvađen iz Access modula.
|
rstNesto = db.OpenRecordset("Neka_Tablica_u_Access_bazi")
rstNesto.moveFirst
Do until rstNesto.EOF
rstNesto.Delete
rstNesto.MoveNext
Loop
|
Dakle, jasno vam je da je šampion htio obrisati sve zapise u nekoj
tablici. Da ga parafraziramo "Što će mi SQL i Delete query kad mogu
lijepo ići u petlji i brisati zapise?" Inače, priča se da je dotični
svojevremeno razmišljao da otvori školu za programere. :((
|