PB162/Cvičení

Z FI WIKI
Přejít na: navigace, hledání

Poznámky ke cvičení z předmětu PB162.

Administrativní otázky

  • Cvičení je povinné, dvouhodinové, docházka není součástí hodnocení.
  • Hlavní náplň - konzultovaná práce na bodovaných úlohách.
  • Stránky předmětu: https://is.muni.cz/auth/el/1433/podzim2005/PB162/
  • Hodnocení viz Slajd na IS (pro ukončení potřebujete minimálně 70 - u zápočtu 60 - bodů ze 100)
  • Úloh bude 8, každá je hodnocena, podle kvality řešení můžete dostat 0 - 5 bodů.
  • Při chybě vám bude úloha vrácena, do opravení (na to mate další týden) se pokládá za neodevzdanou (= 0b)
  • Úlohy se odevzdávají do příštího cvičení. V nejhorším případě se ještě na tom příštím cvičení můžete zeptat.
  • PB162/Docházka do cvičení
  • Úlohy se odevzdávají do příslušné odevzdávárny ve formátu jar nebo zip.

Užívané technologie

  • samozřejmě Java, pro řešení úloh jednoduché výukové IDE BlueJ (soubory pro počeštění zde). Na FI nainstalováno (Win i Linux).
  • základní práce s BlueJ viz slídy, podrobněji třeba český tutoriál či jiné dokumenty.
  • Seznam různých článků, seriálů, tutoriálů, novinek o Javě najdete na stránce Java-odkazy

Cvičení (1)

Objektově orientované programování

Vyrůstá z ideje, že při program více či méně popisuje problematiku z reálného světa. Tak jako v něm tedy definujeme objekty, entity, se kterými pracujeme. Tyto entity mají své vlastnosti - atributy. U většiny z nich je navíc popsáno, jakých akcí jsou schopni - jejich metody. Které atributy a metody objekt bude mít, definují třídy. Samotné objekty pak nazýváme instance třídy.

Poznámky k úkolu

Cvičení (2)

Pro úvod do spolupráce mezi objekty, používání, definování entit v programu viz například Tutoriál SUN. Také Slajdy na IS

Třída

[přístupová práva] JménoTřídy { [definice atributů] [konstruktory] [metody] }

Atribut

[přístupová práva] [typ atributu] jménoAtributu < = [předvolená hodnota] >;

Konstruktor

[přístupová práva] JménoTřídy(< [typ parametru] [jménoParametru], ...>) { [obsah metody] }

Metoda

[přístupová práva] [typ návratové hodnoty] jménoMetody(< [typ parametru] [jménoParametru], ...>) { [obsah metody] }

Metoda main() Přístupový bod programu - spouští-li se třída, hledá se v ní metoda main(). Nemá návratovou hodnotu. Její ukončení totiž neznamená automaticky ukončení aplikace.

public static void main(String[] args) { }

Poznámky k úkolu

  • Zadání
  • Někdy se projekt otevře tak, že není vidět třída Cartridge. Její obdélníček je pod zobrazením testovací třídy. Musíte třídy trochu posunout.

Cvičení (3)

Poznámky

  • Zadání
  • Výpis obsahu tříd bude pomocí metod toString();
  • S textovým výpisem boolean hodnoty nám může pomoci ternární rozhodovací operátor
  • Nezapomeňte na implementaci třídy Absolvent!

JavaDoc

Stručně: Javadoc je systém strukturovaných komentářů ve zdrojových kódech v Javě, z kterého (ve spolupráci s analýzou samotného zdrojového kódu) dokáže generátor (utilita javadoc, součást distribuce Javy) vygenerovat dokumentaci vašich tříd/balíčků, včetně rejstříku, vyhledávání apod.

  • Javadoc-komentář se od normálního víceřádkového komentáře liší úvodní značkou (má hvězdičku navíc): /** */. Neexistuje speciální jednořádková verze ( jako /* */ versus //) - v tom případě prostě začnete komentář na stejném řádku jako skončíte :).
  • Javadoc-komentář je přidělen k nejbližší další deklaraci nějakého objektu ve zdrojovém kódu (tedy dokumentaci ke svým metodám, atributům, třídám pište těsně před ně).
  • Základní popis metody/třídy/atributu se píše jako samotný obsah komentáře. Není tedy nutné uvozovat je např. neexistujícím tagem @method...
  • V Javadoc-komentářích je možné používat HTML. Samotná dokumentace je totiž generována do HTML. Tak je možno přidat do ní odkazy na autory, popsat přehledněji použití metod třídy apod.
  • Pro strukturovanější popis entity je v javadoc definováno několik standardních tagů (při více parametrech, autorech apod. každý z nich dostane vlastní definici):
    • @param - popis parametrů - u tříd, rozhraní, metod, konstruktorů.
    • @return - umožňuje popsat návratovou hodnotu (jen u metod)
    • @throws (@exception - starší varianta) - umožňuje popsat, jakou výjimku metoda vrací
    • @author - povinné, pro třídy a rozhraní; jejich autor
    • @version - povinné, pro třídy a rozhraní; jejich verze
    • @see - umožňuje definovat odkazy jak jinam do metody (pomocí deklarace balicek.trida#clen_tridy nazev_odkazu) nebo na web (<a href="URL">odkaz<a>). Podrobněji viz zde.
    • @since - pro popis od které verze Javy je možno používat
    • @serial (nebo @serialField, @serialData) použivá se při serializování objektů (viz zde
    • @deprecated - pro popis, že se nemá metoda používat (většinou byla nahrazena novější variantou s jiným voláním)

Příklady použití:

@param [jméno parametru z deklarace] [jeho popis]
@return [popis návratové hodnoty]
@throws [typ výjimky - tj. jméno její třídy] [popis stavu způsobujícího výjimku]
@author [popis autora]
@version [popis verze]

Cvičení (4)

První písemka

  • Na učivo zopakované na prvních třech cvičeních (tj. implementace tříd, jejich spolupráce, deklarace rozhraní a její implementace, doplňování komentářů...)
  • Projděte si učivo probrané na přednáškách, řešené příklady
  • z první písemky můžete získat 12bodů (nebo taky 0)
  • hotovou písemku odevzdejte do odevzdávárny na ISu, do podadresáře Písemky/1. Musí se tak udát do konce cvičení.

Cvičení (5)

Dědičnost

Podrobné informace k dědičnosti jsou na slídech zde. Info k typům, polím jsou zde.

Dědičnost vytváří hierarchii tříd. Když odvodíme třídu od jiné (např zde Automobil od MotorovéhoVozidla - v Javě jen od jedné!):

public class Automobil extends MotoroveVozidlo

Vyjadřujeme tím, že automobil je jedním z motorových vozidel, navíc má ale další vlastnosti a je schopen akcí, které obecné motorové vozidlo nemá (tj. zjemnění).

Překrývání

Občas je potřeba, aby u potomka dělala určitá metoda něco víc, než dělala u rodiče (např. toString) - v tom případě ji v potomku znova implementujeme - překryjeme původní, zděděnou. Abstraktní metody musí být překryty. Na metody rodičovské třídy se můžeme odkázat pomocí super. I konstruktor potomka vlastně překrývá konstruktor předka. Ten je v tom případě spuštěn jako první. POZOR! v případě, že konstruktor předka vyžaduje nějaké parametry, musíte ho jako první příkaz v konstruktoru potomka explicitně napsat (s danými parametry)! Např: super(65,"Jmeno");

Abstraktní entity

Jsou metody či třídy, o kterých již při návrhu rozhodneme, že je nebudeme instancializovat. Abstraktní třídy se používají např. pro popis abstraktních generalizací objektů, které se nám hodí z hlediska analýzy problému, přitom jsou ale příliš obecné, abychom pracovali přímo s objekty této třídy (např. MotoroveVozidlo, AbstractGraphicShape). Jen částečně imlementují problém. Abstraktní metody v abstraktní třídě vyjadřují metody, které jsou sice společné pro všechny odvozené třídy, jejich obsah je ale pro jednotlivé potomky tak odlišný, že jsou (musí být) implementovány až v potomcích. Např:

public abstract class MotoroveVozidlo {}
public abstract double getArea() {}

Výčtový typ

Od verze javy 1.5. (popis [1]) (BlueJ klik pravým tlačítkem, jedna z možnosti výběru u new class):

public enum NazevVyctovehoTypu { HODNOTA1, HODNOTA2, HODNOTA3 }

Poznámky ke cvičení

  • Vaším úkolem je implementovat abstraktní třídu AbstractGraphicShape a dva její potomky CircleImpl a TriangleImpl
  • Matematické vzorce, které musíte v řešení použít, jsou v zadání už rozepsány v Javě
  • Nezapomeňte na definici stran v trojúhelníku!

Cvičení (6)

Cvičení (7)


pro skupiny 6 a 9 Stáhněte si JAR, otevřte, zkontrolujte, zda nejsou v metodách chyby. Odstraňte je. Zkuste si vytvořit testovací třídu, zadat testovací metody jak v samotném BlueJ, tak i ručně.

Podívejte se na tutoriál Log4J, zkuste si s jeho pomocí "okomentovat" třídu VektorImpl, případně Printer z minulého cvičení (nějaké s rozmyslem použíté třídy třídy debug/info/warn/error/fatal). Nastavte výstup na úroveň "info".

Pro náhled testovací třídy si prohlédněte např. testovací metody 2. a 4. cvičení... Vaše testovací třída bude kontrolovat:

  • součet (pomocí přičtení nulového a nenulového vektoru)
  • skalární součin (opět nulový a nenulový vektor),
    • v rámci těchto kontrol ověřte, zda v okamžiku různosti délky vektorů vrací metody správnou hodnotu (tj. null pro add a 0 pro scalarProduct).
  • zkontrolujte, zda výpis určitého vektoru je tvaru (cislo, cislo, cislo)
  • zkontrolujte, zda použití impl. konstruktoru vrátí null
  • výsledek sbalte, pošlete mailem.

Cvičení (8)

Deklarace výjimky (vždy odvozená od nějaké výjimky):

public class SomeException extends Exception {}

Jsem v kódu, a chci vyvolat nějakou výjimku:

throw new SomeException();

Mám metodu, může v ní dojít k výjimce, ale mě je to na této úrovni jedno, ať se o to starají nahoře:

public getFile() throws IOException {}

Jsem v kódu, a chci nějak vyřešit výjimečný stav:

try {
  //kod, ktery chceme hlidat
} catch (SomeException ex) {
  //kod napravy, vypisu chyby apod, muze se retezit pro ruzne vyjimky 
  //- vyjimka se zachyti na prvnim odpovidajicim bloku.
} finally {
  //kod s nejakym ukoncenim prace (uklid apod.)
}

Cvičení (9,10)

Kontejnery, uspořádaní

Cvičení (11)

IO operace