====== 2 - Objekty, třídy, instance a atributy ======
===== Očekávaný stav =====
Po předchozím cvičení mají všichni studenti:
* Základní porozumění gitu, zprovozněný přístup ke svým repozitářům na gitlab.fel.cvut.cz.
* **Úspěšně** odevzdaný první domácí úkol!
===== Úvod =====
* Diskuze vašeho řešení příkladu z minulého cvičení.
/*
* Referenční řešení je zveřejněné na gitu: https://gitlab.fel.cvut.cz/B191_B6B36OMO/b191_b6b36omo/tree/master/cv1_solution
*/
==== Teorie ke cvičení ====
* Diskutujte rozdíl mezi třídou a instancemi.
* Jaký význam mají v objektovém návrhu atributy a jaký metody.
* Jakým způsobem v objektovém návrhu kontrolujeme přístup k třídním atributům a metodám? Proč není dobrý nápad nechávat atributy veřejné?
===== Příklad na cvičení =====
* Nejmenovaná firma pro provoz své činnosti používá vozidla, která jsou na firmu registrována. Pro potřeby finanční evidence je nutné na konci každého měsíce vykázat celkový počet najetých kilometrů.
* Aby nemusela firma každý měsíc kontrolovat počty najetých kilometrů na každém vozidle svého vozového parku, rozhodla se implementovat GPS tracking system, který tuto práci udělá za ní.
* Ze zpracované analýzy vzešel následující objektový návrh:
{{:courses:a7b36omo:labs:cv2-step3.png|}}
Při programování používejte anglické názvy atributů, tříd a metod.
===== Cvičení =====
Na základě dodaného objektového modelu a připravené třídy Main implementujte třídy: Vehicle, Tracker a GPSTrackingSystem.
Stáhněte si kostru projektu na: https://gitlab.fel.cvut.cz/B201_B6B36OMO/seminar.git.
(git clone git@gitlab.fel.cvut.cz:B201_B6B36OMO/seminar.git)
Pokud jste neabsolvovali kurzy čarodějnictví, tak doporučujem vyklonovat mimo své hlavní repo a do svého hlavního repa soubory překopírovat.
=== 1. Třída Vehicle ===
* Implementujte třídu Vehicle, u vozidla evidujeme atributy: manufacturer, VINCode, mileage. Atributy manufacturer a VINCode jsou **neměnné**.
* Vozidlo má dále metodu //drive//, pomocí které vozidlo ujede danou vzdálenost, po ujetí vzdálenosti dochází k úpravě najetých kilometrů vozidla.
* Implementujte getter metody pro získání: manufacturer, mileage, VINCode.
* Implementujte metodu toString() pro výpis objektu ve formátu: "[manufacturer], [VINCode]".
{{:courses:a7b36omo:labs:cv2-step1.png|}}
=== 2. Třída Tracker ===
* Implementujte třídu Tracker, která reprezentuje jedno trackovací zařízení, které je instalováno na vozidlo.
* Tracker má unikátní identifikační číslo //trackerId//, které je trackeru přiřazeno při jeho vytvoření a dále je neměnné.
* Dále má atribut innerMemory, který slouží jako vnitřní paměť pro výpočet kilometrů.
* Doplňte do třídy getCurrentVehicle pro zachování zapouzdření.
* Doplňte metodu attachTracker, která k danému Trackeru přiřadí vozdilo, které bude sledovat. Při přiřazení vozidla se innerMemory automaticky nastaví na najeté kilometry vozidla.
* Doplňte metodu getTrackerMileage, která pomocí své vnitřní paměti a najetých kilometrů vozidla vypočte počet najetých kilometrů s Trackovacím zařízením.
* Doplňte metodu resetTrackerMileage, která nastaví vnitřní paměť (innerMemory) na hodnotu najetých kilometrů vozidla.
* Implementujte metodu pro výpis objektu ve formátu: "Tracker_[trackerId], attached to [vehicle]"
{{:courses:a7b36omo:labs:cv2-step2.png|}}
=== 3. Třída GPSTrackingSystem ===
* Implementujte třídu GPSTrackingSystem, která reprezentuje nové řešení pro GPS sledování vozidel.
* Třída drží List všech vytvořených Trackovacích zařízení a vnitřní counter, pomocí kterého je trackerům přidělováno ID (jelikož každé trackovací zařízení musí mít unikátní ID, counter musí být statický).
* Třída podporuje vlastnost attachTrackingDevices, která na vstupu dostane List vozidel a ke každému vytvoří a připevní trackovací zařízení.
* Dále třída podporuje vlastnost generateMonthlyReport, která vypíše informaci o všech trackovacích zařízeních včetně vozidel, ke kterým jsou připevněny a vypočte ujetou vzdálenost od posledního měření. Metoda následně resetuje všechna trackovací zařízení, aby report obsahoval vždy pouze vzdálenost ujetou za daný měsíc.
Příklad výpisu metody generateMonthlyReport:
----- GPS Tracking system: Monthly report -----
Currently active devices:
Tracker_1, attached to VOLVO, VINKLJ15
Tracker_2, attached to Saab, JKLAJSL15
Tracker_3, attached to BMW, HASUINJ15
This month traveled distance: 300 Km.
{{:courses:a7b36omo:labs:cv2-step3.png|}}
=== 4. Implementujte JUnit testy pro otestování metod objektů ===
* Otestujte základní funkcionalitu nově vytvořených objektů.
Pro pojmenování metod testů používejte následující jmennou konvenci:\\ **MethodName_StateUnderTest_ExpectedBehavior**
Co by se mohlo hodit:
* [[https://dzone.com/articles/7-popular-unit-test-naming|Varianty konvencí pojmenovávání jednotkových testů]]
* [[http://www.vogella.com/tutorials/JUnit/article.html|Jednotkové testy - tutorial]]