V tomto dílu seriálu o Visual Basic .NET se budeme věnovat podrobněji použití proměnných a konstant v prostředí VB.NET.
Význam a funkce deklarace
Tento díl seriálu byl na toto místo zařazen jako reakce na příspěvky čtenářů, opakovaně zdůrazňujících význam a důležitost správné deklarace proměnných používaných v kódu. Co vlastně deklarace proměnných znamená ? V dosavadních ukázkách použití proměnné probíhalo tak, že jsme v případech, že jsem potřebovali v kódu použít proměnnou, jednoduše jsme jejímu jménu přiřadili hodnotu (příklad zaslal čtenář Luděk Roleček):
Module modMain
Sub Main
pocetKolecek = 10
pocetKolecek = pocetLokecek + 1
System.Console.WriteLine(pocetKolecek)
End Sub
End Module
Zběžným pohledem na výpis programu usoudíme, že jsem do proměnné pocetKolecek přiřadili hodnotu deset, následně ji zvýšili o jedničku a tedy příkaz WriteLine vypíše číslo jedenáct... Je tomu však takto doopravdy? Pokud si ukázku zkopírujeme třeba do editoru Visual Studio nebo Snippet Compiler (popis a konfiguraci v druhém dílu seriálu) a spustíme - ouha, konzole vypíše jedničku! Jak je to možné? Inu, ano... - už jsme na to přišli - v řádku pocetKolecek = pocetLokecek + 1 je v názvu proměnné překlep.
Problém je zde způsoben tím, že to, co považujeme za překlep nemusí za překlep považovat prostředí VB.NET. To v daném případě pouze provádí přesně to, co mu přikážeme - zde se potvrzuje úsloví o počítači jako "rychlém blbci pro třídění jedniček a nul". Naštěstí většina programovacích jazyků je schopna nás před překlepy a podobnými záludnými chybami do značné míry uchránit, stejně tak i VB.NET. A to jednoduše tak, že nás nutí předem oznámit první použití každé nové proměnné v programu. Tomu oznámení se říká deklarace (z anglického slova s latinským základem declare = "prohlásit, oznámit").
Deklarace a inicializace proměnných
V prostředí VB.NET lze deklaraci proměnné provést celou řadou způsobů, ale nejjednodušší a nejobecnější je použití příkazu Dim. Deklarace více proměnných lze současně spojovat do jednoho příkazu Dim a názvy proměnných přitom oddělovat čárkami, např.:
Dim suma
Dim incr
nebo
Dim suma, incr
V rámci deklarace je současně možné proměnné přiřadit počáteční hodnotu. Takovému přiřazení se říká inicializace (z latinského inicio = "počátek")
suma = 0
incr = 1
nebo
Dim suma = 0, incr = 1
Z funkce deklarace je zřejmé, že deklaraci proměnných musíme provést vždy před prvním použitím proměnné v kódu. K obecně platným zásadám přehledného programování patří, že deklarace pokud možno všech proměnných provedeme na začátku kódu, který je používá. Zápis úvodní ukázky s deklarací proměnné by tedy zněl:
Module modMain
Sub Main
Dim pocetKolecek = 10
pocetKolecek = pocetLokecek + 1
System.Console.WriteLine(pocetKolecek)
End Sub
End Module
Pokud si upravenou ukázku spustíme s původním nastavení SnippetCompileru nebo Visual Studia, nic zvláštního se nestane. Pokud však zapneme kontrolu deklarace proměnných, VB.NET nám při pokusu o zkompilování ukázky oznámí chybu. V prostředí Snippet Compiler se kontrola deklarace povolí zatržením volby Option Explicit v nabídce Tools.. Options .., záložka Compiler:
V případě, že je volba Option Explicit zatržena a v kódu použijeme název proměnné, která nebyla předem deklarována (ať už úmyslně, nebo nedopatřením), Snippet Compiler příslušný řádek zvýrazní červenou vlnovkou a podrobnou informací o chybě v záložce Errors. V případě, že máme nainstalováno české prostředí .NET Framework, bude se chybové hlášení zobrazovat v českém jazyce. Najetím kurzoru myši na řádek s vlnovkou se zobrazí tooltip s bližší informací o chybě. Poklepáním na chybu v záložce Errors se kurzor klávesnice (tzv. caret) nastaví na příslušný řádek s chybou, což zjednodušuje lokalizaci chyby v případě, že se jich v kódu vyskytne více. Podobně se chovají i editory dalších vývojových prostředí VB.NET, jako Visual Studio .NET nebo SharpDevelop.
Deklarace a použití konstant
V dosavadních ukázkách programu pro výpočet obvodu kruhu se vyskytovalo použítí Ludolfova čísla π. Toto číslo představuje konstantu, která se v průběhu výpočtu nikdy nemění. V případě, že v kódu takovou konstantu vypisujeme opakovaně, patří k dobrým zásadám konstantu deklarovat stejně, jako proměnné, abychom předešli chybám pramenících z neúmyslných překlepů. VB.NET umožňuje jít v tomto směru ještě dále a zabránit, abychom deklarované proměnné omylem přiřadili v kódu novou hodnotu nebo obsah proměnné. Za tím cílem se konstanty nedeklarují příkazem Dim, nýbrž příkazem Const, který musí být vždy doprovázen inicializací. Podobně jako u příkazu Dim lze deklarace několika konstant současně spojovat čárkami:
Const iMAX = 100
Const PI = 3.1416, N = 100, sURL = ""
Aby bylo možné naše programy lehce spravovat a modifikovat, je zpravidla výhodné co největší počet číselných konstant v kódu deklarovat a přiřadit jim hodnotu na začátku programu. Tím, že si hodnotu konstanty definujeme předem (jako např. hodnotu čísla pí) se také běh programu urychlí, protože VB.NET s konstantami nemusí opakovat typové aj. kontroly. A konečně, z názvu konstant lze snáze odvodit jejich funkci - správné používání konstant tedy zásadně zlepšuje čitelnost a přehlednost kódu a je jedním ze znaků,kterým se vyznačují profesionálně sestavené programy.
Při tvorbu názvů konstant se uplatňují stejné zásady, jako pro označování proměnných, v zájmu odlišení proměnných a konstant na první pohled se však pro názvy konstant často využívají velká písmena. Jak již bylo uvedeno v předchozích dílech seriálu, prostředí VB.NET velikost písmen ignoruje - rozlišování proměnných a konstant velikostí písmen je zde čistě záležitost lepší přehlednosti a srozumitelnosti kódu.
V matematické praxi jsou nejčastěji používané hodnoty konstant Ludolfova čísla π = 3.14159265358979323846 nebo Eulerova čísla e = 2.7182818284590452354 (tvořícího základ přirozených logaritmů) definované napevno v prostředí VB.NET a lze je získat s využitím výrazů System.Math.PI a System.Math.E.
Na závěr si předvedeme ukázku deklarací a použití konstanty a proměnných na příkladu programu pro výpočet obvodu kruhu:
Module modMain
Sub Main
Const PI2 = System.Math.Pi * 2
Dim r = 4, obvod = PI2 * r
System.Console.WriteLine("Obvod :")
System.Console.WriteLine(obvod)
End Sub
End Module
Pokud ukázku vlepíme do editoru SnippetCompiler a spustíme, získáme v konzoli výpis výsledku s přesností přibližně na 16 platných míst.
Stručné shrnutí
Pro opakovanou práci s daty využíváme proměnné a konstanty pojmenované alfanumerickým řetězcem. Proměnné je vhodné před prvním použtím deklarovat příkazem Dim, popř. inicializovat na vhodné výchozí hodnoty - a to pokud možno na začátku kódu, který je používá. Konstanty se deklarují příkazem Const, který je vždy doprovázen inicializací.
V příštím dílu seriálu se vrátíme k předchozí ukázce a seznámíme se blíže s logickými výrazy a řídícím strukturám, které je používají.