Vaše jistota na trhu IT Balíčky Rudolf Pecinovský rudolf@pecinovsky.cz
Problémy velkých aplikací Rozsáhlé aplikace používají velké množství názvů objektů a jejich zpráv, které různé části programu sdílí V rozsáhlých programátorských týmech se těžko zaručovalo, že někdo z jedné skupiny nezavede objekt se stejným názvem jako někdo z jiné skupiny Pro řešení tohoto problému se v 70. letech začaly používat jmenné prostory V rámci jmenného prostoru je možné používat názvy svobodně, názvy z jiného jmenného prostoru je třeba kvalifikovat názvem jejich jmenného prostoru Jmenné prostory mají hierarchickou stromovou strukturu obdobnou struktuře složek (adresářů) na disku 2
Balíčky v jazyku Java Java zavádí ekvivalent jmenných prostorů pod názvem package balíček, balík Balíček může obsahovat podbalíčky Balíček obsahující podbalíčky označujeme jako rodičovský Podbalíčky označujeme jako dceřiné balíčky či potomky svého rodiče Název balíčku se skládá z názvu rodičovského balíčku následovaného tečkou a vlastním názvem daného balíčku Balíčky standardní knihovny a podbalíčky balíčku java Příklady: java.lang.reflect, java.util.concurrent 3
Balíčky a uložení na disku Při uložení přeložených souborů na disku musí umístění souborů ve složkách odpovídat jejich umístění v balíčku => Každému balíčku je přiřazena jeho složka Složka se musí jmenovat přesně stejně jako daný balíček (včetně velikosti písmen) Podbalíčku daného balíčku je přiřazena podsložka rodičovského balíčku Třída může patřit pouze do jediného balíčku (Pra)rodičovský balíček celého stromu nemá jméno a označujeme jako kořenový balíček Rozbalené balíčky java.lang a java.util 4
Balíčky v jazyku Java Aplikace může mít kořenový balíček umístěný v několika složkách; obsah všech těchto složek je pak považován za obsah kořenového balíčku aplikace Obdobně se slučují obsahy párových složek v různých stromech Seznam složek s kořenovými balíčky je třeba předat překladači a virtuálnímu stroji v proměnné CLASSPATH Vývojová prostředí od této povinnosti osvobozují, informaci vygenerují a dodají sama Na obrázku vpravo je kořenovou složkou standardní knihovny složka C:\Java\JDK.1.5.0\src 5
Příkaz package Zdrojový kód každé třídy musí začínat příkazem package deklarujícím název balíčku, do nějž třída patří; před ním smí být jen bílé znaky a komentáře Příkaz_package: package název_balíčku ; Výjimkou jsou pouze třídy z kořenového balíčku, které příkazem package naopak začínat nesmí Kořenový balíček není plnohodnotný, řada konstrukcí v něm není použitelná používá se proto jen pro rychlé testy proveditelnosti některých nápadů (a v prvních lekcích výuky) 6
Příkaz import 1/2 Název třídy sestává z názvu jejího balíčku následovaného tečkou a vlastním názvem třídy Příklad: java.lang.string (třída String je v balíčku lang, který je podbalíčkem balíčku java, jenž je podbalíčkem kořenového balíčku Uvnitř balíčku se na třídu lze odvolávat jejím vlastním názvem bez kvalifikace názvem jejího balíčku Bez kvalifikace se lze odvolávat i na třídy z balíčku java.lang Při posílání zprávy třídě z jiného balíčku je třeba uvádět její plný název včetně kvalifikace balíčkem (java.util.list) Z předchozího pravidla se lze vylhat uvedením názvu třídy v příkazu import 7
Příkaz import 2/2 Příkaz_import: import název_balíčku. vlastní_název_třídy ; import název_balíčku. * ; Druhá verze příkazu import importuje všechny třídy z daného balíčku Každý příkaz import může importovat pouze jedinou třídu nebo všechny třídy z jediného balíčku Příkaz import musí být uveden na počátku zdrojového kódu, před ním smí být pouze příkaz package nebo jiný import Příklad: import java.io.file; //Třída File z balíčku java.io import java.util.*; //Všechny třídy z balíčku java.util 8
Příklad použití package a import package adventura.rup; import java.util.arrays; import adventura.rámec.abatoh; import adventura.rámec.ahra; import adventura.rámec.amístnost; import adventura.rámec.kroktestu; import adventura.rámec.testhry; /***************************************************** * Instance třídy {@code Hra_RP} představují hru, * při níž se hráč ocitne v malém bytě, který je třeba * projít a najít v něm ledničku. */ public class Hra_RP extends AHra { //== KONSTANTNÍ ATRIBUTY TŘÍDY ======================= 9
Balíčky a BlueJ 1/2 BlueJ považuje každý balíček za samostatný projekt; pro každý balíček tedy otevře samostatné aplikační okno Mezi balíčky/projekty není možné natahovat čáry závislostí ani dědičnosti příslušné informace je třeba zadat ručně přímo do zdrojového kódu Každý balíček/projekt musí mít ve své složce svůj vlastní soubor package.bluej a/nebo bluej.pkg BlueJ původně používal soubor bluej.pkg, ale ten nebylo možno asociovat s aplikací, protože přípona byla již blokována jiným programem. Proto autoři zvolili jinou příponu a soubor s informacemi o vzhledu aplikačního okna a diagramu tříd se nyní jmenuje package.bluej. V zájmu zpětné kompatibility však BlueJ reaguje i na starší soubor. Kořenovým balíčkem/projektem stromu projektů je projekt, v jehož rodičovské složce se již soubor package.bluej ani bluej.pkg nenachází 10
Balíčky a BlueJ 2/2 Balíčky mají v diagramu tříd vlastní ikony připomínající ikony složek Balíček lze vytvořit zadáním příkazu z místní nabídky plochy Balíček lze odstranit zadáním příkazu z místní nabídky balíčku S ikonou rodičovského balíčku není možno nijak hýbat V místní nabídce rodičovského balíčku je seznam názvů rodičovských balíčků až ke kořeni; klepnutím na název se přesuneme do projektu příslušného danému balíčku 11
Příklad 12
Implicitní modifikátor přístupu Vedle modifikátorů přístupu public a private existuje i implicitní modifikátor přístupu, který se uplatní, když žádný modifikátor přístupu neuvedeme Entity s implicitním modifikátorem přístupu jsou viditelné a dosažitelné pouze v rámci daného balíčku Implicitní modifikátor přístupu bývá označován jako package private; je to ale pouze označení pro doprovodné texty, v programu se nijak neoznačuje Zdrojové kódy tříd s implicitním přístupem nemusejí být v souborech, které mají stejné jméno jako třída => těchto tříd může být i několik v jednom souboru Jako neveřejné je vhodné deklarovat opravdu jen třídy určené pro interní potřebu celého daného balíčku 13
Pravidla pro tvorbu balíčků Balíček by měl být jednoúčelový, tj. obsahovat pouze třídy a rozhraní přímo se vážící k řešení stejného problému Název balíčku má být dle konvencí jen malými písmeny U prodávaných aplikací by měl začátek názvu balíčku odpovídat internetové adrese výrobce Kdyby katedra informačních technologií dodávala aplikace, měly by být v podbalíčcích balíčku cz.vse.kit Tato konvence zabezpečí jedinečnost názvu použitých tříd na celém světě (za podmínky, že výrobce zaručí jedinečnost názvu v rámci svého webu) 14
Statický import Java 5.0 zavedla možnost importovat i statické členy jiných tříd a používat je pak bez kvalifikace Statický_import: import static balíček. třída. člen ; import static balíček. třída. * ; Používání statického importu znepřehledňuje program Má smysl pouze u členů, které se používají velice často a u nichž nehrozí vyvolání dojmu, že se jedná o členy dané třídy 15
Vaše jistota na trhu IT Děkuji za pozornost Rudolf Pecinovský http://vyuka.pecinovsky.cz/vse mail: rudolf@pecinovsky.cz ICQ: 158 156 600