Visual Basic 2005/Väldi
Sissejuhatus
[muuda]Efektiivne programmeerimine olenemata keelest, milles programm kirjutatud on, peaks omama kindlat ja struktureeritud ülesehitust. Kood peaks olema organiseeritud osade kaupa ja peaks minimaalselt kasutama enesele vajalikke ressursse ja samas saavutama optimaalseima tulemuse. Kui taoline tehnika on omandatud, on võimalik esinevate vigade arvu minimiseerida ja neid kergemini leida. See peaks kiirendama kogu programmeerimise protsessi ja muutma programmeerimise nauditavamaks.
Üldised soovitused
[muuda]- Deklareeritud muutujatele tuleb määrata andmetüüp, selle saab muuta kohustuslikuks käsuga Option Explicit, mis lisatakse mooduli ülaossa.
- Kasuta muutujate ja makrode nimedena sisutähendusliku informatsiooni
- Ära lühenda nimesid kui nende täispikk tähendus on mõistetavam
- Püüa vältida globaalse skoobiga muutujate deklareerimist
- Kasuta Debug [nt: .Print ; .Assert] objekti koodiväärtuste kontrollimiseks
- Loo ja proovi teste
- Kõigepealt pane programm tööle nagu vaja ja alles siis hakka optimeerima
- Kui muutujas kasutatakse piiratud väärtusega diskreetseid väärtuseid kasuta enum tüübi deklaratsiooni
- Võimalusel kasuta süsteemikutseid, see võimaldab programmil aega säästa
- Väldi GoTo käsklauset, see muudab koodi lugemise raskeks
- Pikkade elseif lausete puhul kasuta Select...case loend if lauset
- Püüa vältida loogiliste tehete eituseid, substantsi eituseid ja pikki tingimusi, sest keerulised loogikalised tingimused lihtsalt võivad sisu koodi ülevaatajale nö. ära krüpteerida.
Loogilised operatsioonid
[muuda]Olles juba harjunud koodi kirjutama, parandama ja dokumenteerima on arvatavasti välja kujunenud oma stiil kuidas teatud operatsioone läbi viia. Lahendusi on alati palju, kuid optimaalseid on 1. Tihti ei ole aega kõiki valemeid läbi proovida, seega tasuks oma stiilipõhiline koodiülesehitus optimeerida.
Näide
[muuda]Meil on tavaline bitisuurune loogika väärtuse tüüpi otsustaja, mille ülesandeks on kas kuvada lisaandmeid või mitte. Vaja on kirjutada vaid kood mis vahetaks olemasoleva väärtuse ümber kui nuppu vajutatakse.
(Siin järgnevas tekstis tuleks tekst "keskmiselt x-y sekundiga" asendada tekstiga "keskmiselt z sekundiga", kus z on see keskmine arv; või siis "vahemikus x-y sekundit", kuid selle näite puhul pole täpne vahemik oluline, samuti piisaks vaid ühest-kahest kohast peale koma.)
If kuvan = True Then kuvan = False Else kuvan = True
5 miljonilise kordusega tsükli testi läbis keskmiselt 15,843-16,094 sekundiga
kuvan = IIf(kuvan, False, True)
5 miljonilise kordusega tsükli testi läbis keskmiselt 32,719-34,203 sekundiga
kuvan = kuvan = False
5 miljonilise kordusega tsükli testi läbis keskmiselt 15,686-15,796 sekundiga
kuvan = Not kuvan
5 miljonilise kordusega tsükli testi läbis keskmiselt 15,609-15,781 sekundiga
kuvan += 1
5 miljonilise kordusega tsükli testi läbis keskmiselt 15,594-15,891 sekundiga
kuvan -= True
5 miljonilise kordusega tsükli testi läbis keskmiselt 15,750-15,828 sekundiga
Kõik eeltoodud variandid saaksid sellega hakkama, seega pole ainult tähtis kas kood on hästi üles ehitatud ja dokumenteeritud - suurt tähtsust omab ka millest kood koosneb ja kui kergesti on see teistele omandatav. Tähtis on ka kiirus ja nagu näha vaid üks pakutud 6 variandist oli märgatavalt aeglasem kui teised. Kood millega testiti oli järgmine:
Dim i, j, a, b For j = 1 To 3 a = Now.Minute * 60 + Now.Second + Now.Millisecond / 1000 For i = 1 To 50000000 'valem testimiseks Next i b = Now.Minute * 60 + Now.Second + Now.Millisecond / 1000 Debug.Print("Katse " & j & ": " & b - a) Application.DoEvents() Next j
Järeldus antud ülesande variantidele on: Katselise tulemuse järgi pean parimaks booleani väärtuse ümberpööramisvalemiks sisu ümberpööramist [valem 4], mis on ka kergesti mõistetav ja koodikokkuhoidlik.
Tüübid Integer ja Long
[muuda]Juba VB6'ga leiti, et kui programm kasutab numbrimääramise tüübina Long'i jookseb programm kiiremini kui samad arvud deklareerituna integerina. Meeldetuletuseks veel, kui jäetakse andmed piiritlemata, ehk tüüp andmata, on nende andmetüübiks Variant.
Kasutage:
Dim I as Long
mitte:
Dim I as Integer
Lisaks, on tähitis võtta teadmiseks asjaolu, et kiirus on vaja määrata pärast publitseerimist, et ta vastaks lõpptulemusele, aga mitte vahepealsele kooditestimise järgule.
Ainuke põhjus miks veel kasutada Integer suurust on, kui anda argumente refereeritud funktsioonidele mida ise muuta ei saa. Sest teame, et refereeritud funktsioonide argumendid peavad olema samast tüübist.
Koodiridade pikkus
[muuda]On palju müüte koodiridade pikkusest. Leidub inimesi kes isegi selle põhjal hindavad, kui tasemel programmeerija on. Samas ka on veidi vähem võhikud vastupidisel arvamusel - mida lühemalt pannakse kood kirja ja saavutatakse eesmärk, seda parem on koodi kirjutaja. Tegelikult aga parim kood saavutatakse hoopis hästiloetava koodiga.
Näide
[muuda]Kirjutada vähima ridade arvuga järgmist ülesannet täitev kood:
Ülesanne: Võtta C kettalt tekst failist C:\Kuupäev.txt kuupäev, mis on antud kujul pp.kk.aaaa ja leida mis nädalapäevaga oli tegemist. Vastus anda C:\Vastus.txt faili, kujul nt: "Antud kuupäev 04.02.1944 oli reede.". Arvestada tuleb liigaastatega. Teada on, et 01.01.1900 oli esmaspäev ja sellest vanemate kuupäevadega ei pea arvestama.
- Nt: 1 võimalik lahendus:
Meeldetuletuseks, järgnev kood on kirja pandud 1 koodireaga!
Sub main() My.Computer.FileSystem.WriteAllText("C:\Vastus.txt", "Antud kuupäev " & Val(Mid(My.Computer.FileSystem.ReadAllText("C:\Kuupäev.txt"), 1, 2)) & "." & Val(Mid(My.Computer.FileSystem.ReadAllText("C:\Kuupäev.txt"), 4, 2)) & "." & Val(Mid(My.Computer.FileSystem.ReadAllText("C:\Kuupäev.txt"), 7, 4)) & " oli " & CStr(Choose((356 * (Val(Mid(My.Computer.FileSystem.ReadAllText("C:\Kuupäev.txt"), 7, 4)) - 1900) + Val(Mid(My.Computer.FileSystem.ReadAllText("C:\Kuupäev.txt"), 1, 2)) + Val(CStr(Choose(Mid(My.Computer.FileSystem.ReadAllText("C:\Kuupäev.txt"), 4, 2), "0", "31", "59", "90", "120", "151", "181", "212", "242", "273", "303", "334"))) + (Val(Mid(My.Computer.FileSystem.ReadAllText("C:\Kuupäev.txt"), 7, 4)) - 1900) / 4 - (Val(Mid(My.Computer.FileSystem.ReadAllText("C:\Kuupäev.txt"), 7, 4)) - 1900) Mod 4 - IIf((Val(Mid(My.Computer.FileSystem.ReadAllText("C:\Kuupäev.txt"), 7, 4)) - 1900) > 400, 3 / 4 * ((Val(Mid(My.Computer.FileSystem.ReadAllText("C:\Kuupäev.txt"), 7, 4)) - 1900) / 400 - (Val(Mid(My.Computer.FileSystem.ReadAllText("C:\Kuupäev.txt"), 7, 4)) - 1900) Mod 400), 0)) Mod 7, "esmaspäev", "teisipäev", "kolmapäev", "neljapäev", "reede", "laupäev", "pühapäev")) & ".", True) End Sub
Järgmiste failide sisu:
- Kuupäev.txt: 14.02.1987
- Vastus.txt: Antud kuupäev 14.2.1987 oli neljapäev.
Meeldetuletuseks: 1 realine kood ei saa sisaldada endas Try...Catch veapüüdmist, mis oleks vajalik, kui näiteks dokumenti, kust lugeda püütakse ei eksisteeri.
Taoline 1 reaga kogu vajaliku 1 korraga kirjapanemine, on tunduvalt raskem teostada, kuid ka tingib järgnevatelt inimestelt üsna head koodilugemisoskust, et aru saada mida on kirja pandud. See on hea näide, seletamaks ka miks tuleb dokumenteerida. Muuseas tuletan meelde, et VB 2005'ga on võimalik kirja panna asju, mida teistes keeltes annab järgi teha. Olgu eelnev otsene näide sellest.