680 likes | 871 Views
4IT101. třetí přednáška Rozhraní Základní programové konstrukce Ladě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……. .
E N D
4IT101 třetí přednáška Rozhraní Základní programové konstrukce Ladě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; publictypgetNazev() { return nazev; } private String rasa; publicStringgetRasa ( ) { return rasa; }
private typ nazev; publicvoidsetNazev(typnazev) { this.nazev = nazev; } private String rasa; publicvoidsetRasa (String rasa) { this.rasa = rasa; }
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(); }
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
<<interface>> Ovladani zapnout() vypnout() Lampa zapnout() vypnout() ..... Televize zapnout() vypnout() ..... Pračka zapnout() vypnout() ..... Tlacitko stisk ()
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();
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. if switch
if (podmínka) { příkaz1; } else { příkaz2; } if (podmínka) { příkaz; } Příkaz if
Selekce – příklad 1 public boolean vyber (double castka) { if (stav < castka) { return false; } else { stav = stav – castka; return true; } }
Selekce – příklad 2 public 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) { casekonstanta1:příkaz1; break; casekonstanta2:příkaz2; break; casekonstanta3:příkaz3; break; casekonstanta4:příkaz4; break; // ... default: příkaz; };
Příkaz switch 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. while do while for
Příkaz while while (podmínka) { příkaz; }
Cyklus while - příklad java.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 – while do příkaz; while (podmínka);
Příkaz for for (inicializace; podmínka; krok) { příkaz; }
Cyklus for - příklady for (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 for (int i = 0; i <= 5; i++) { if (i == 3) { break; } System.out.print(i + ", "); } System.out.println("Konecprogramu"); Výpis bude vypadat takto: 0, 1, 2, Konec programu
Příkazy skoku - continue for (int i = 0; i <= 5; i++) { if (i == 3) { continue; } System.out.print(i + ", "); } System.out.println("Konecprogramu"); Výpis bude vypadat takto: 0, 1, 2, 4, 5, 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 Ucet (int noveCislo, String jmeno, double castka){ cislo = noveCislo; vlastnik = jmeno; stav = castka; } 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); ........ } ........... boolean vyber (double castka) { if (stav < castka) { return false; } else { stav = stav – castka; return true; } } public double getStav() { return stav; }
Výpočet faktoriálu public static intfaktorialCykly(intcislo){ if (cislo < 0 ){ // vyhodí výjimku, není definováno thrownewIllegalArgumentException(); } if (cislo == 0){ return 1; } else{ intfaktorial = 1; for (int i = 1; i <= cislo; i++){ faktorial *=i; } returnfaktorial; } } public static intfaktorialRekurze(intcislo){ if (cislo < 0 ) { // vyhodí výjimku, není definováno thrownewIllegalArgumentException(); } if (cislo == 0) { return 1; } else { returncislo * faktorialRekurze(cislo - 1); } } • Faktoriál je formálně definován takto:
Co vypíší následující příkazy ? • System.out.println(“H” + “a”); • System.out.println(‘H’ + ‘a’); Ha 169
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í frameworkJUnit 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(StringtextChyby) 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áHodnota, skutečnáHodnota) • assertFalse(podmínka) • assertFalse(zpráva, podmínka)
Metody assertXxx() • assertTrue • assertNull • assertNotNull • assertSame • assertNotSame