Seminář 3

Obsah semináře

Objektově orientované programování (OOP)

Zde se OOP budeme zabývat spíše intuitivně. Potřebnou teorii a mnoho dalšího se dozvíte v kurzu věnovaném OOP jako takovému. Intuice občas bývá zrádná, nad vším tedy zkuste více pouvažovat a neváhejte se zeptat.

Motivace

Zmínili jsme si pár motivačních příkladů (eshop, STAG) a ukázali si jednoduchou situaci s automobily určenými svými vlastnostmi (SPZ, barva, rychlost, lokace, posádka) a možnými úkony, které s těmito vozy lze provádět (zrychlit, zpomalit, nabrat osobu, vyložit osobu, přelakovat auto, …).

Vzali jsme si pár aut a ukázali si, že sice mají stejný soubor vlastností, ale s různými hodnotami. Soubor vlastností a možných akcí jsme zachytili do třídy Automobil - jakéhosi blueprintu, nebo výkresu pro všechny objekty daného typu - automobily.

A teď v Javě

Celý proces jsme následně provedli v Javě:

Zmínili jsme další principy - dědičnost, zapouzdření a polymorfismus - a prvky jazyka - gettery/settery, modifikátory přístupu a rozhraní. Na ty se podíváme příště.

Řetězce

Pole

Úkoly

Úkolů je více, ale jsou jednoduché. Měli byste si na nich procvičit:

Zadání:

  1. Vytvořte třídu Country s konstruktorem Country(String name, String phoneCode), která reprezentuje stát. Objekty mají dva atributy - name (jméno státu) a phoneCode (telefonní předvolba, např. +420). Dále definujte metodu print, která vypíše zemi ve formátu Stát{jméno=xxx, předvolba=xxx} a ukončí řádek.

  2. Vytvořte třídu Person s konstruktorem Person(int id, String firstname, String lastname, int age, String phone, Country country), která reprezentuje osobu. Objekty mají atributy: id (unikátní identifikátor), firstname (jméno), lastname (příjmení), age (věk), phone (telefon), country (stát). Dále definujte metodu getStatus(), která vrátí status osoby: pokud je věk menší než 18, vrátí status “junior”, pokud větší nebo roven 65, vrátí status “senior”, jinak vrátí status “dospělý”.

  3. Třídě Person definujte metodu getPhone(), která vrátí telefonní číslo i s předvolbou. Pokud osoba nemá stát přiřazený, vrátí číslo bez předvolby.

  4. Třídě Person definujte metodu print(), která vypíše osobu ve formátu Osoba{id=xxx, jméno=xxx, příjmení=xxx, věk=xxx, telefon=xxx, status=xxx, stát=xxx} a ukončí řádek. Pokud osoba nemá stát přiřazený, vypíše stát=neznámý.

  5. Vytvořte třídu Index s konstruktorem Index(Person[] persons, Country[] countries), která reprezentuje rejstřík. Rejstřík obsahuje pole osob a pole států. Dále definujte metodu count(String countryName), která vrací počet osob, žijících v určitém státě.

  6. Třídě Index definujte metodu count(String firstname, String lastname), která vrátí počet osob se stejným jménem a příjmením.

  7. Třídě Index definujte metodu search(int id), která vyhledá osobu s určitým id.

  8. Třídě Index definujte metodu search(String countryName), která vyhledá všechny osoby žijící ve státě určeném jménem.

  9. Třídě Index definujte metodu search(String firstname, String lastname), která vyhledá všechny osoby se zadaným jménem a příjmením.

  10. Třídě Index definujte metodu setPhoneCode(Person person, String phoneCode), která osobě nastaví zemi podle telefonní předvolby. Pokud je předvolba neplatná, neudělá nic a vrátí hodnotu false (jinak true).

  11. Třídě Index definujte metodu print(), která vypíše (efektivním způsobem!) obsah rejstříku ve formátu:

    Rejstřík{ Osoba{id=0, jméno=Prokop, příjmení=Dveře, telefon=+420555444333} Osoba{id=1, jméno=Tomáš, příjmení=Putna, telefon=+420999888777} Osoba{id=2, jméno=Fero, příjmení=Dunaj, telefon=+421123456789} Osoba{id=3, jméno=Johnny, příjmení=Cash, telefon=+1987654321} Osoba{id=4, jméno=Tomáš, příjmení=Putna, telefon=111222333} }

a ukončí řádek.

Odkaz na vytvoření repositáře v Gtihub classroom.