====== 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/B211_B6B36OMO/seminar.git. (git clone git@gitlab.fel.cvut.cz:B211_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í vozidlo, 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]]