Vaše jistota na trhu IT
Balíčky
Rudolf Pecinovský
[email protected]
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 Copyright © 2006, Rudolf Pecinovský
VŠE – 05
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
Copyright © 2006, Rudolf Pecinovský
VŠE – 05
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
Copyright © 2006, Rudolf Pecinovský
VŠE – 05
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í Na obrázku vpravo je kořenovou složkou sama standardní knihovny složka C:\Java\JDK.1.5.0\src Copyright © 2006, Rudolf Pecinovský
VŠE – 05
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)
Copyright © 2006, Rudolf Pecinovský
VŠE – 05
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
Copyright © 2006, Rudolf Pecinovský
VŠE – 05
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
Copyright © 2006, Rudolf Pecinovský
VŠE – 05
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 ======================= Copyright © 2006, Rudolf Pecinovský
VŠE – 05
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í Copyright © 2006, Rudolf Pecinovský
VŠE – 05
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
Copyright © 2006, Rudolf Pecinovský
VŠE – 05
11
Příklad
Copyright © 2006, Rudolf Pecinovský
VŠE – 05
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 Copyright © 2006, Rudolf Pecinovský
VŠE – 05
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)
Copyright © 2006, Rudolf Pecinovský
VŠE – 05
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
Copyright © 2006, Rudolf Pecinovský
VŠE – 05
15
Vaše jistota na trhu IT
Děkuji za pozornost
►Rudolf Pecinovský http://vyuka.pecinovsky.cz/vse mail:
[email protected] ICQ: 158 156 600