Rudolf Pecinovský: Učíme OOP (12) – Konstanty a literály, Předání parametru objektového typu, Dokumentace

úterý 27. května 2003 ·

Druhá kapitola našeho seriálu o výuce objektově orientovaného programování se pomalu chýlí ke konci. V příštím pokračování nás již čeká jen závěrečné shrnutí.

2.16 Konstanty a literály

V programech často používáme nejrůznější „magické hodnoty“, které se v průběhu programu nemění. Budeme-li chtít např. pracovat s počtem dnů v týdnu, budeme neustále používat číslo 7. Problém nastane, když se při některé z pozdějších úprav rozhodneme, že místo počtu dnů v celém týdnu bude pro náš program výhodnější používat pouze počet pracovních dnů, tj. 5 (alespoň prozatím to tak je). Taková úprava pak znamená prolézt celý program a všechny sedmičky nahradit pětkami.

Již samotná tato představa je dostatečně nepříjemná. Noční můrou se ale stane, pokud je program opravdu rozsáhlý a navíc je v něm řada různých „sedmiček“ – některé sedmičky budou např. znamenat, že v červenci začínají prázdniny, a další sedmičky budou oznamovat, že pracujeme od 7 hodin ráno.

Rozumní programátoři proto takovéto magické hodnoty zásadně nepoužívají a dávají přednost pojmenovaným konstantám. Ty se v Javě definují stejně jako proměnné, pouze se mezi jejich modifikátory uvede klíčové slovo final.

Konstantám můžeme přiřadit hodnotu pouze jednou a již nikdy ji nemůžeme změnit:

  • statickým konstantám přiřadíme jejich hodnotu hned v deklaraci,

  • nestatickým konstantám, které nemají svoji hodnotu přiřazenou v deklaraci, musíme přiřadit hodnotu v konstruktoru.
Terminologická poznámka:
Tyto „magické hodnoty“ se označují jako literály. Literál je konstanta zapsaná svojí hodnotou – např. 7 (celočíselný literál), "Ahoj" (řetězcový literál) apod. Naproti tomu konstanty, o nichž jsme právě hovořili, se označují jako pojmenované konstanty, protože ve své definici dostanou jméno, kterým se na ně v programu odvoláváme.

Budu-li v dalším textu hovořit o konstantách, budu tím vždy myslet pojmenované konstanty. Pokud bych chtěl hovořit o literálech, vždy to výslovně uvedu.

Poznámka o dobrých mravech:
Z číselných literálů se doporučuje používat pouze hodnoty 0 a 1. Ostatní hodnoty je lépe definovat jako pojmenované konstanty. Dokonce i nuly a jedničky se mají používat pouze v situacích, kdy tyto hodnoty neoznačují nic, co by se mohlo v některé z příštích verzí programu změnit – např. v současné době mám jen jedno kolo (auto, peněženku, manželku…), ale dokážu si představit situaci, kdy se tato jednička změní.

Obdobně řetězcové literály je vhodné používat pouze v situacích, kdy se daný řetězec použije pouze jednou (např. v chybovém hlášení). Chcete-li však program lokalizovat do více jazyků, je vhodné i jednou použité textové řetězce pojmenovat a definovat všechny na jednom místě, kde je lze snadno nahradit jejich překlady.

Rozšiřme počet konstruktorů smrku o konstruktor, který umožní zadat i jeho barvu. Definujme přitom konstantu BARVA_0, v níž bude uchována implicitní barva smrku, kterou použijeme ve chvíli, kdy nebude jeho barva zadána. Počátek programu s příslušnou konstantou a konstruktory by mohl vypadat následovně (dokumentační komentáře a dříve definované metody a atributy pro úsporu místa opět vynechávám):

public class Smrk
{
//== VEREJNE KONSTANTY =========================================================
 
 public static final String BARVA_0 = "zelena";
 
 // … preskoceno …
 
//== KONSTRUKTORY ==============================================================
 
 public Smrk( int x, int y, int s, int v, String b )
 {
 horni = new Trojuhelnik( x+s/5, y, 3*s/5, 3*v/7, b );
 stredni=new Trojuhelnik( x+s/10, y+v/7, 4*s/5, 4*v/7, b );
 dolni = new Trojuhelnik( x, y+2*v/7, s, 5*v/7, b );
 }//public Smrk( int x, int y, int sirka, int vyska, String Barva )
 
 
 public Smrk( int x, int y, int sirka, int vyska )
 {
 this( x, y, 50, 70, BARVA_0 );
 }//public Smrk( int x, int y, int sirka, int vyska )
 
 // … preskoceno …
 
}// public class Smrk 

Jak jste si jistě všimli, definoval jsem konstantu jako veřejnou. Když jsme se bavili o zapouzdření, říkal jsem, že atributy mají být soukromé a že veřejné mohou být pouze konstanty, které nikdo nemůže změnit. Nyní ten případ nastal. Protože se domnívám, že konstantu BARVA_0 může okolí za jistých okolností využít, definoval jsem ji jako veřejnou.

Poznámka:
Jako neměnné lze považovat číselné, logické a řetězcové konstanty. U konstant objektových typů to však nemusí platit. Kdybychom např. označili atribut horni za konstantu, znamenalo by to, že se nemění hodnota atributu, tj. že odkazuje stále na stejnou instanci. Nijak tím ale neovlivníme to, co se děje s danou instancí (jestli s ní např. někdo nehýbe). Závěr: Nedeklarujte atributy objektových typů (s výjimkou konstant typu String) jako veřejné – alespoň do doby, než se naučíte zabezpečit, aby s nimi nikdo nemohl dělat nepravosti.

Úkol:
Doplňte do třídy Smrk2 konstantu BARVA_0 spolu s metodami getBarva()setBarva(String).



Rudolf Pecinovský

0 komentářů:

Články dle data



Učitelské listy

Nabídka práce

Česká škola - portál pro ZŠ a SŠ

Česká škola poskytuje svým čtenářům diskusní prostor k vyjádření názorů na školskou problematiku. Tyto příspěvky se nemusí shodovat se stanoviskem redakce České školy a jsou uveřejňovány jako podnět k dalším diskusím.

Obsah článků nemusí vyjadřovat stanovisko redakce nebo vydavatele Albatros Media, a.s.


Všechna práva vyhrazena.

Tento server dodržuje právní předpisy
o ochraně osobních údajů.

ISSN 1213-6018




Licence Creative Commons

Obsah podléhá licenci Creative Commons Uveďte autora-Neužívejte dílo komerčně-Nezasahujte do díla 3.0 Česká republika, pokud není uvedeno jinak nebo nejde-li o tiskové zprávy.



WebArchiv - archiv českého webu



Tyto webové stránky používají k poskytování služeb, personalizaci reklam a analýze návštěvnosti soubory cookie. Informace o tom, jak tyto webové stránky používáte, jsou sdíleny se společností Google. Používáním těchto webových stránek souhlasíte s použitím souborů cookie.