##Informácie:
- vypracovanie posielať buď ako:
- pull request k tomuto repozitáru
- alebo ako exportované jarko odovzdané do odovzávarne s názvom bonus-projektik.
- projekt sa bude zameriavať na rozširovanie vedomostí o základnom Java API a jeho konrétnom využití
- použitie niektorých návrhových vzorov, pomenej algoritmizácií.
- ide o opensource projekt, tvorcami budú samotní žiaci predmetu PB162
- každý týždeň sem pribudne riešenie, ktoré bude pochádzať z najlepšieho študenstkého riešenia
##Popis projektu:
- Ide o jednoduchú implementáciu programu ELIZA, teda akéhosi psychoterapeuta.
- V budúcnosti jej bude možné podstrčiť možné odpovede na otázky. Vytvoríme tak rôzne inštancie ELIZI: napr arogatnú, znudenú, ...
##Ako pracovať s týmto repozitárom
- Kto ešte nerobil s Githubom, tak nech si skúsi prejsť základné info na home stránke github.com
- Odporúčam sa naučiť pracovať s pull request mechanizmom a gitom samotným, je to momentálne mainstream a určite príde vhod ako dobrá referencia pri pohovore.
- Tu možete nájsť pár git príkazov.
- Pull request odporúčam hlavne pretože Vám dokážem tak dať okamžitý a presnejší feedback k Vašemu kódu.
- Projekt môžete vypracovávať aj v BlueJ. Otvoríte ho pomocou menu: Project --> Open Non Bjuej
##Zadania jednotlivých úloh:
- Poskytnite implementáciu pre rozhrania:
AutomaticPsychiatrist.java
,TextAnalyzer.java
. - Viacej info v ich JAVA docs.
- Hints:
System.currentTimeMillis
a metódy triedyString
prídu vhod.
-
Upravte triedu
AutomaticPsychiatristImpl.java
tak aby v jednom behu programu existovala vždy len jedna inštancia tejto triedy. -
Ide teda o aplikáciu desing patternu Singleton. Inšpirujte sa napríklad týmto zdrojom. Stačia strany 1-2, nemusíte uvažovať viac-vláknové aplikácie.
-
Aplikujte lazy inicializáciu, vašu jedinú inštanciu sprístupnite pomocou metódy
getInstance
. -
Skúste si nájsť informácie o využití tohto patternu: jednoducho všade tam kde chcem zabezpečiť existenciu len jednej inštancie - jedno fotbalové ihrisko, jedno databázové pripojenie etc.
-
Zaujímavá knižka o návrhových vzoroch, príklady sú v Jave: Head First Design Patterns.
-
Predávanie parametrov programu
-
Prví spôsob ktorý využijete, je získavanie System properties. Upravte metódu
AutomaticPsychiatristImpl#thinkSomeTime
, tak aby čas ktorý má metóda čakať získala zo systémovej premennejthinkingTimeoutInMilliseconds
. Hints:System.getProperty()
.- Pre zaújimavosť si pozrite tiež
System.getEnv()
, rozdiel medzi systémovou a premennou prostredia je pekne vysvetlený tu (platformová nezávyslosť). - Vytvorte checked exception:
AutomaticPsychiatristException
v balíkucz.fi.muni.exception
. - Tieto premenné sa predávajú ako
String
, budete musiet preto túto hodnotu sparsovať naLong
. Pri akejkoľvek chybe, vyhodteAutomaticPsychiatristException
.
- Pre zaújimavosť si pozrite tiež
-
Druhý spôsob bude parsovanie parametrov predaných metóde
main
.- Naimplementujte metódu
introduceMyself
. - Vytvorte spustiteľnú triedu
Main
v balíkucz.fi.muni
. - jej metóda
main
vykoná nasledovné:
- Sparsuje predané parametre. Trieda je spúštaná práve s jedným parametrom. V tomto parametri je zadané meno psychiatra. Pokiaľ nie je predaný žiaden parameter, program končí s výnimkou, ktorá bude popisovať prečo program končí a informáciu o správnom spúštaní programu.
- Získa inštanciu
AutomaticPsychiatrist
(už je singleton). - Predstaví psychiatra volaním
introduceMyself
. - Nechá zamyslieť psychiatra. Pokiaľ by malo myslenie končiť výnimkou tak na štandarný chybový výstup je vypísaný reťazec: "I am sick and tired. Come later!", zároveň však program skončí s výnimkou, ktorá popíše chybový stav.
- Naimplementujte metódu
-
Vo výsledku by ste mali byť schopný spustiť program z command line napr ako:
java -DthinkingTimeoutInMilliseconds=4000 Main "Sirius"
-
keďže sa používané triedy nachádzajú v iných balíkoch ako metóda
main
, bude potrebné uviesť k nim cestu pomocou prepínača -cp.
- Naimplementujte zvyšné metódy rozhraní
AutomaticPsychiatrist
,TextAnalyzer
. - Implementácia
AutomaticPsychiatrist
bude obsahovať inštanciuTextAnalyzer
. Bude využívať jej služby. Ide o vzťah - kompozícia. Vo všeobecnosti ide o dodržiavanie pravidla v OOP: favor composition over inheritance TextAnalyzer
, snažte sa využiť už naprogramované (existuje akýsi bridge medzi kolekciami a poľom).- Upravte ďalej
TextAnalyzer
, tak žegetBestAnswer
vrátinull
ak nemôže nájsť medzi možnými otázkami zhodu. (Toto využite pri implementáciíaskQuestion
, kde vhodne na takúto situáciu zareagujte). - Upravte
AutomaticPsychiatrist
, tak aby keď nieje zadaná systémová premennáthinkingTimeoutInMilliseconds
, defaultne čaká 3 sekundy. - Pri implementácií askQuestion využite JDK 7 vlastnosť: try catch blok s resource statementom. (Viac info napr. tu)
- Upravte triedu Main tak aby:
- Načítala do premennej typu
List<String>
možné otázky a odpovede. Čítať bude z textového súboru possibleAnswers.txt, ktorý sa nachádza v rovnakom balíku akoMain.java
. Opať nezabudnite využiť try-catch with resources (hint:Class.getResrouceAsStream
). - Ďalej sa program predstaví a pozdraví uživateľa.
- Program potom bude načítavať užívateľský vstup a podľa tohto vstupu bude odpovedať.
- Načítavanie končí po tom čo užívateľský vstup obsahuje reťazec: "bye". Všetky operácie s reťazcami by mali byť not case-senesitive, teda nezáleží na veľkosti písmen.
- Pre načítavanie užívateľského vstupu využite nepríklad triedu:
java.util.Scanner
. - Pre vstup využite
System.in
. Pre výstupSystem.out
. - Nezabudnite písať pekne štrukturovaný kód, main musí byť čiteteľný. Dosiahnete to správnym rozdelením jednotlivých úloh medzi správne pomenované privátne statické metódy.
- Vytvorte alternatívne spracovanie práce zo súbormi, s využitím
java.nio.*
balíka. - Odporúčam začať tutoriálom tu.
- Triedy s alternatívnym spracovaním pomenujte napríklad pridaním čísla, napr. Main2.java.
- Je stále dobre poznať oba prístupy. Vo všeobecnosti keď píšete novú aplikáciu tak je dobré využiť pri práci zo súbormi nio, no stále sa stretnete s legacy kódom ktorý bude využívať java.io pre prácu zo súbormi.
- Ak máte chuť kludne pushnite aj bohatší possibleAnswers.txt. Fantázii sa medze nekladú.