4IT101třetí přednáška
RozhraníZákladní programové
konstrukceLadění a testování
Zapouzdření• K datovému atributu
deklarovanému s modifikátorem private lze přistupovat pouze pomocí metod.
• „Přečtení“datového atributu pomocí metody get……
• Nastavení hodnoty pomocí metody set…….
private typ nazev;
public typ getNazev() { return nazev;}
private String rasa;
public String getRasa ( ) {
return rasa;}
private typ nazev; public void setNazev(typ nazev) { this.nazev = nazev;}private String
rasa;public void setRasa (String rasa) {
this.rasa = rasa;}
Interface
Pojem rozhraní (interface)
• uživatelské rozhraní (user interface),
• aplikační programové rozhraní (API, application programming interface),
• „vzdálené“ rozhraní (remote interface)
• rozhraní (interface) – jazyková konstrukce Javy a dalších objektově orientovaných jazyků,
import java.awt.*;/** * Ctverec, ktery se nakresli sam na Platno a se kterym je mozne manipulovat. * @author Michael Kolling * @author Lubos Pavlicek * @version 1.0 (15 July 2000) * @version 1.0cz (30 July 2004) */public class Ctverec{ private int velikost; private int xPozice; private int yPozice; private String barva;
/** * Vytvoreni noveho ctverce na defaltni pozici (60, 50) a s defaltni barvou (cervena). */ public Ctverec() { velikost = 30; xPozice = 60; yPozice = 50; barva = "cervena"; kresli(); }
Aplikační rozhraní třídy
API• jak metodu volat
– dáno podpisem metody– kontroluje překladač
• co je výsledkem metody a jsou nějak omezeny hodnoty parametrů– udává tzv. kontrakt (je to zapsáno v
dokumentaci)– probíhá po zavolání metody
Interface jako jazyková konstrukce
• jedná se pouze o popis rozhraní, neobsahuje žádnou implementaci
• říká, co musí třída obsahovat za metody, pokud uvádí, že implementuje toto rozhraní
Kdy se interface používá?
• Snížení závislosti mezi třídami• Jako odkaz na funkci
Tlacitko
stisk ()
Lampa
zapnout()vypnout()
.....
<<interface>>Ovladani
zapnout()vypnout()
Televize
zapnout()vypnout()
.....
Pračka
zapnout()vypnout()
.....
Pravidla pro interface• nelze definovat obecné datové
atributy pouze statické konstanty– public static final double KONSTANTA
• všechny metody jsou veřejné• interface obsahuje pouze podpisy
(hlavičky) metod ne implementaci
public interface Ovladani {
void zapnout();
void vypnout();}
Implementování interface• Třída, která implementuje
interface, musí mít definované (implementované) všechny metody v něm definované.
• Jedna třída může implementovat libovolný počet interface.
• Jeden interface může implementovat libovolný počet tříd
public class Lampa implements Ovladani{.....public void zapnout(){......}public void vypnout(){.....}.........
Přetypování na interface
• instanci třídy lze vždy přetypovat na typ implementovaných rozhraní
Lampa lampa = new Lampa();Ovladani ovladani = (Ovladani)lampa;
Ovladani ovladani = new Lampa();
Základní programové konstrukce
Obsah metody• deklarace a inicializace pomocné
proměnné• volání metody• přiřazení• sekvence (posloupnost, blok příkazů)• selekce (rozhodování, větvení)• iterace (cyklus, opakování)• příkazy skoku z/v cyklu• příkaz return• vznik a obsluha výjimek• assert
Bloky příkazů - sekvence
• blok příkazů je skupina příkazů uzavřená mezi složené závorky { }
• příkazy jsou prováděny postupně, podle pořadí uvedení
• metoda je vždy tvořena blokem příkazů, který může obsahovat další bloky
public Kruh() { prumer = 30; xPozice = 20; yPozice = 60; barva = "modra"; kresli(); }
Selekce (větvení, rozhodování)
• Jestliže bude hezky, půjdeme do zoo, jinak si pustíme film.
• Když si uklidíš, půjdeš ven.• Když nebudeš zlobit, dostaneš
čokoládu.• Když budeš zlobit, , jinak
dostaneš čokoládu.
ifswitch
Příkaz if
if (podmínka) { příkaz1; } else { příkaz2;}
if (podmínka) { příkaz;}
Selekce – příklad 1
public boolean vyber (double castka) { if (stav < castka) { return false; } else { stav = stav – castka; return true; }}
Selekce – příklad 2public void porovnavani(int cislo1, int cislo2) {
if (cislo1 > cislo2) {System.out.println("Prvni cislo je vetsi");
}else {
if (cislo1 == cislo2) { System.out.println("Obe cisla jsou stejna.");
}else {
System.out.println("Druhe cislo je vetsi");}
}}
Příkaz switch
switch (výraz) { case konstanta1: příkaz1; break; case konstanta2: příkaz2; break; case konstanta3: příkaz3; break; case konstanta4: příkaz4; break; // ... default: příkaz;};
Příkaz switch
výraz == konstanta1 příkazy1
false
true
výraz == konstanta2
výraz == konstanta3
příkazy2
příkazy3
default příkazy
výraz == konstantaN příkazyN
false
false
false
true
true
true
break
break
break
break
výraz == konstanta1 příkazy1
false
true
výraz == konstanta2
výraz == konstanta3
příkazy2
příkazy3
default příkazy
výraz == konstantaN příkazyN
false
false
false
true
true
true
Vývojový diagram, aktivity diagram v UML
Obsah metody • deklarace a inicializace
pomocné proměnné• volání metody• přiřazení• sekvence (posloupnost, blok
příkazů)• selekce (rozhodování, větvení)• iterace (cyklus, opakování)• příkaz skoku z cyklu• příkaz return• vyvolání a obsluha výjimek• assert
Iterace (cyklus, opakování)
• Míchej kaši tak dlouho, dokud nezhoustne.
• Čekej, dokud nedorazí.• Jeď, dokud nedojedeš na
křižovatku.
whiledo whilefor
Příkaz whilewhile (podmínka) {
příkaz;}
vyhodnocení podmínky
provedení příkazu(těla cyklu)
false
true
Cyklus while - příkladjava.util.Random generator = new java.util.Random();int nahoda = generator.nextInt(10);while ( nahoda != 0 ) {
System.out.println(nahoda);nahoda = generator.nextInt(10);
}
Příkaz do – whiledo příkaz;while (podmínka);
vyhodnocení podmínky
provedení příkazu(těla cyklu)
falsetrue
Příkaz forfor (inicializace; podmínka; krok) {
příkaz;}
vyhodnocení podmínky
provedení příkazu(těla cyklu)
false
true
inicializace
krok
Cyklus for - příkladyfor (int i = 1; i <= 10; i++) {
// příkazy}
for (int i = 2; i <= 100; i += 2) {// příkazy
}
Cyklus for lze přepsat do while
inicializace;while ( podmínka ) {
příkaz;krok;
}
Příkaz for – varianta “for each”
for (Typ identifikátor : kolekce){příkaz;
}
Příkazy skoku z/v cyklu
break – ukončí průběh cyklu a pokračuje se provádění příkazů za cyklem,
continue – ukončí provádění tohoto průchodu cyklem a vrací se k testu vstupní podmínky,
Lze je použít pouze v těle cyklu (break se používá ještě v příkazu switch).
Lze použít i pro více vnořených cyklů pak je možné vytvořit si návěští (viz skripta).
Příkazy skoku - break
Výpis bude vypadat takto:0, 1, 2, Konec programu
for (int i = 0; i <= 5; i++) {if (i == 3) {
break;}System.out.print(i + ", ");
}System.out.println("Konec programu");
Příkazy skoku - continue
Výpis bude vypadat takto:0, 1, 2, 4, 5, Konec programu
for (int i = 0; i <= 5; i++) {if (i == 3) {
continue;}System.out.print(i + ", ");
}System.out.println("Konec programu");
Příkaz return• Je v podstatě také příkazem skoku,
ukončí činnost metody a případně vrátí výsledek požadovaného typu, činnost programu pokračuje prováděním příkazů uvedených za voláním metody
public class Bankomat.......{Ucet ucet1 = new Ucet(1,"Pepa",1000);double kolikMa =ucet1.getStav();Sytem.out.println("Na uctu je "+ kolikMa);boolean povedloSe = ucet.vyberZUctu(10000);........}...........
public Ucet (int noveCislo, String jmeno, double castka){ cislo = noveCislo; vlastnik = jmeno; stav = castka;}
boolean vyber (double castka) { if (stav < castka) { return false; } else { stav = stav – castka; return true; }}
public double getStav() {return stav;}
Rekurze
Výpočet faktoriáluFaktoriál je formálně definován takto:
public static int faktorialCykly(int cislo){ if (cislo < 0 ){ // vyhodí výjimku, není definováno throw new IllegalArgumentException(); } if (cislo == 0){ return 1; } else{ int faktorial = 1; for (int i = 1; i <= cislo; i++){ faktorial *=i; } return faktorial; }}
public static int faktorialRekurze(int cislo){ if (cislo < 0 ) { // vyhodí výjimku, není definováno throw new IllegalArgumentException(); } if (cislo == 0) { return 1; } else { return cislo * faktorialRekurze(cislo - 1); }}
Co vypíší následující příkazy ?
• System.out.println(“H” + “a”);• System.out.println(‘H’ + ‘a’);
Ha169
Testování a ladění
Jednotkové testování• Slouží k testování jednotlivých tříd. • Testuje se každá metoda
(neprivátní), která vrací hodnotu. Zda při zadaných vstupech vrací odpovídající výstupy.
• Testuje se také, zda metoda správně vyhazuje výjimky, či zda nevyhazuje výjimky v případě správných vstupů.
Postup práce při vývoji podporovaném testy
• navrhnout rozhraní vytvářené a testované třídy
• navrhnout a implementovat testy• naimplementovat vytvářenou třídu• spustit testy• dokud neprojdou všechny testy,
upravovat kód a znovu testovat
JUnit• Testovací framework JUnit je přímo
zakomponován v BlueJ ve verzi 4.8.
• Open Source nástroj pro testování tříd napsaných v Javě (i tento nástroj je napsán v Javě)
• K dispozici na www.junit.org ve verzi 4.10 - od verze 4.0 se používají anotace
Vytváření testů v JUnit• Testy jedné třídy se vytváří jako
samostatná třída.• Každý test je jedna metoda, výsledek
(projde/neprojde) se zjistí:– pomocí metody assertXxx –
porovnávají se očekávané hodnoty a skutečné hodnoty,
– pomocí metody fail(String textChyby) se ohlásí chyba – používá se v případě, že nelze použít metoda assertXxx (např. při zjišťování, zda se opravdu vyskytne výjimka),
Metody assertXxx()• assertEquals(očekávanáHodnota,
skutečnáHodnota)• assertEquals(zpráva,očekávanáHodn
ota, skutečnáHodnota)• assertFalse(podmínka)• assertFalse(zpráva, podmínka)
Metody assertXxx()• assertTrue• assertNull• assertNotNull• assertSame• assertNotSame
Používané anotace• @Test - označuje test, v každé
testovací třídě několikrát• @Before - označuje metodu
spouštěnou před každým testem (testovací přípravek, setUp)
• @After – označuje metodu spouštěnou po každém testu (tearDown)
• @BeforeTest• @AfterTest
Importy při testování• import org.junit.After;• import org.junit.Before;• import org.junit.Test;• import static org.junit.Assert.*;
Debugging• Použití speciálního nástroje, který
je buď samostatný nebo je součástí vývojového prostředí
• Pomocí zarážek (breakpointů) zastavuje provádění kódu a umožňuje krokování a prohlížení obsahu proměnných a datových atributů
Debugger v BlueJ• Spuštění přes volbu Zobrazit• Umožňuje nastavit zarážky a
krokovat kód• Umožňuje prohlížení aktuálního
obsahu proměnných
Dokumentace
Druhy dokumentace• Uživatelská
– Help– Manuál
• Programátorská– Grafická – diagramy tříd, sekvenční
diagramy, atd.– Dokumentace kódu (dokumentace
API)– Vlastní kód (včetně případných
komentářů)
Dokumentace API Javy• Formát html• Dostupná na www.oracle.com,
odkaz je i na java.vse.cz
Tvorba dokumentace kódu
• Podpora pro tvorbu dokumentace je zabudována již přímo v jazyce.
• Součástí Java SE SDK je nástroj javadoc, který generuje dokumentaci přímo ze zdrojových kódů tříd opatřených strukturovanými komentáři.
Javadoc• Do zdrojového kódu se na určená
místa připisují komentáře uvozené /**
• Komentáře, které budou součástí dokumentace, mohou obsahovat i html kód pro formátování.
• V komentářích se používají speciální značky pro javadoc, které se pak příslušným způsobem promítají do dokumentace.
Značky pro javadoc• @author jméno• @version označení• @param název popis• @return popis• @throws název popis• @exception název popis• @deprecated komentář• @since verze• @see odkaz• {@ link název text}
Komentář k celé třídě/** * Tato třída implementuje interface Kalkulator, které představuje komunikační rozhraní * mezi logikou a grafikou jednoduché celočíselné kalkulačky. * Třída implementující toto rozhraní představuje logiku aplikace. * Rozhraní má tři skupiny metod: * a) pomocí metody getHodnotaKZobrazeni grafická třída zjišťuje co má zobrazit na * displeji, * b) metody cislice, plus, minus, rovnaSe a vymaz se volají při stisknutí příslušné * klávesy na kalkulačce, * c) metody getAutor a getVerze jsou informační * * * @author Jarmila Pavlíčková * @version 10.10.2007 */
public class MujKalkulator implements Kalkulator{
Vygenerovaná dokumentace
Komentáře k jednotlivým metodám
/** * Metoda vrací hodnotu, která se má zobrazit na displayi kalkulacky. Tato metoda * se obvykle volá po zavolání metody odpovídající stisku tlačítka. * * @return hodnota k zobrazení */ public int getHodnotaKZobrazeni() { return 0; }
/** * metoda se volá při stisknutí tlačítka s číslicí na kalkulačce. Parametrem * je hodnota na stisknuté klávese. * * @param hodnota hodnota na stisknutém tlačítku, hodnota je v rozsahu * od 0 do 9 */ public void cislice(int hodnota) { }
Vygenerovaná dokumentace
Použité zdroje• java.sun.com• Pavlíčková, Pavlíček : Úvod do Javy• Pecinovský: Myslíme objektově v jazyku Java
5.0• Eckel: Myslíme v jazyku Java, dva díly – Grada
• www.junit.org
Java je registrovanou známkou firmy Sun Microsystems