úterý 20. listopadu 2007

Projekt Ukládání a vyhodnocování testu - výsledky

Takže, jsou tady poznámky a připomínky k vašim projektům. Některé poznámky vám možná přijdou nadbytečné, ale nejsou, věřte mi. Existují jisté způsoby a konvence a pokud se je naučíte, budete mít dál méně starostí, budete psát programy rychleji a efektivněji. A o tom to je:) Nechci vám nutit svůj styl programování, každý ať si najde svůj, ale zároveň byste se také měli držet zlaté střední cesty, protože ta tu není bezdůvodně:)

Úvodem
Nejdříve jednu poznámku k těm návrhům, jednu věc jste tam měli hodně často. Z hlediska objektového programování byste měli metodě pro přidání testu do kolekce předávat jako parametr už objekt typu test. Princip objektového programování je pokusit se modelovat reálný svět tak, aby i vaše programy vypadaly logicky. Takže když vy objekt typu test vytváříte ve třídě pro zpracování výsledků, vypadá to asi tak, že učitel si sedne a jde opravovat testy, stojí u něj řada studentů a učitel tomu prvnímu v řadě dá test, ten jej vypní a vrátí jej učiteli, který ho opraví a založí do desek. První student odejde, na řadu přijde ten za ním, opět dostane prázdný test, vypní, vrátí, učitel ho vyhodnotí a založí. Jo, neříkám, že ta vaše řešení nefungují. Jde jen o ten návrh, programování není jen o tom, že napíšu program, který mi něco vypočítá, ale hlavně je to o efektivitě, jednoduchosti a přehlednosti řešení. Takže, něříkám že to je špatně, říkám jen, že by to šlo líp.

Dále v zadání bylo i korektní zadání dokumentačních komentářů, do toho se spoustě z vás nechtělo a když už, tak jen tak aby tam něco bylo. A nevyplňovali jste např. parametry a návraty metod.. Takže příště..

A teď už konkrétně:)
Tak a teď už konkrétně:) Píšu opravdu jen věcné poznámky, neboduje se to, říkal jsem vám, že nic na tom nezávisí. Šlo mi opravdu jen o to, abyste si to zkusili sami. Takže je mnohem přínosnější projekt, kde sice třeba nic moc není, než projekt, který je až na pár drobností stejný s někým jiným. Ale tak to už je vaše věc...

Albrechtová, Monika
Co má za úkol metoda getBodyHodnota() ze třídy Student? A program vám nejde přeložit, protože metoda má vrátit hodnotu jakési proměnné uspel, která ale neexistuje. Jinak tam toho moc nemáte:) A také nevím na co byly parametry u konstruktoru třídy Student. Ale tak nevadí, cílem bylo zkusit si to, a vy jste to odevzdala tak, jak jste to sama zkoušela.

Balej, Marek
V pořádku, pouze jedna věc. V metodě pro výpočet aritmetického průměru sice pracujete s double, ale jako výsledek podílu dvou integerů. Takže vždycky jako průměr dostanete celé číslo, což není úplně ono. A metodám prumer() a pocetuspesnych() jste mohl dát jako návratovou hodnotu int nebo double místo void, když byste dál chtěl s tím výsledkem pracovat, bude to řešení jednodušší. Jinak ale OK. Až na ty dokumentační komentáře, které tam tak nějak chybí.

Bečvář, Stanislav
(Až na ty dokumentační komentáře, které vy tam máte) platí to samé, jako u kolegy Baleje. A "zadavac" je zajímavý název pro třídu..:)

Beneš, Jiří
Nemám váš projekt.

Černý, Lukáš
Viz o řádek výše.

Erhart, Jaroslav
Uf. Vy to máte zmatené:) Kódu je tam sice dost, ale v podstatě nic to neudělá. Přitom si myslím, že jste nezačal špatně a stačilo se nad tím jen pořádně zamyslet. Třída test je u vás úplně zbytečná, tam se jen vytvoří nějaký List a dál se s ním nic neděje a ten je zase v klidu odstraněn interpretem Javy. A metodu addBody máte logicky špatně - když tam přidáte 20 bodů tak napřed se zbytečně vyhodnotí jako uspěl a hned se to přepíše, stejně tak vypíše uspěl pokud zadám zápornou hodnotu. A další problém je v tom přičítání, body += celkemBodu; jakým způsobem nastavím hodnotu bodů? Takhle se mi pořád jen k hodnotě přičítá nebo odčítá. Takže - myslím si, že jste to mohl zkusit dotáhnout dál, zamyslet se nad tím a taky ten program otestovat na různá vstupní data. Ale zase plus za to, že jste to zkoušel:)

Frencl, Ondřej
Člověče, co to je?:) Když jste vymyslel tohle tak mi neříkejte že byste neudělal ten projekt:) Dobrý no:)

Haškovec, Milan
Také nemám.

Heřman, Michal
No, tohle se mi taky nehodnotilo moc dobře:) Máte to celkem zajímavě okomentované, ale tím to končí.. Nevadí..

Janda, Vilém
Super, jediná drobnost je ten objektový přístup. Ale jinak v pořádku.

Kondelík, Jan
Moc pěkné řešení, propracované, okomentované (pozn. k parametrům v dokumentačním komentáři nemusíte psát jejich typ, javadoc si to zjistí sám). Dvě drobnosti - main není až tak úplně vhodný název pro třídu a pak je tam zase ta záležitost s aritmetickým průměrem. Ale jinak nemám co bych tomu vytknul, líbilo se mi to.

Kouklík, Tomáš
Vždyť jste začal dobře, proč jste to nedodělal? Moc už by tam toho nechybělo dodělat.. Na třídě zaci se nedá už v podstatě nic moc dodělávat a kdybyste se podíval na práci s kolekcemi a zkusil vymyslet jak udělat ten aritmetický průměr..

Králík, Martin
Nemám vás tady.

Lískovcová, Jana
Máte udělané přidání testu do kolekce, jakž takž ošetřené body, takže stačilo vymyslet práci se seznamem a metody pro získání těch potřebných údajů. Jinak by to vůbec nemuselo být špatné, jen to dodělat.

Mlejnek, Josef
V podstatě v pořádku, ale zase je tam ten problém s aritmetickým průměrem a totálně tam postrádám dokumentační komentáře.

Mrštíková, Květa
Taky v podstatě v pořádku, ale opět platí to, co jsem psal poprvé u pana Baleje... Myslím tím tu záležitost s aritmetickým průměrem...

Pasák, Václav
Kde nic není...

Peka, Karel
Lehce nevhodné názvy tříd, testy a tests si snadno spletete. Jinak opět tradiční aritmetickoprůměrová záležitost:) Asi budu rovnou psát viz. pan Balej:) Nevím, kdo z vás je autorem, ale u pana Baleje jsem na to narazil jako u prvního, takže vy, kterých se to týká si to přečtěte u něj, ať to nepíšu pořád dokola:)

Petýrek, Tomáš
Jo, v pohodě:) Nevadí mi, že vám s tím pomáhal pan Janda (ta aritmetickoprůměrová záležitost je tedy asi od něj, že), aspoň jste s tím strávili nějaký čas a to bylo cílem. Okomentoval jste každý řádek v programu a snažil jste se pochopit, jak to vlastně funguje. V pořádku! Takže jen dodám problém s aritmetickým průměrem a lehkou nelogičnost v tom, kdy jako studenta, který vyhověl, počítáte toho, kdo měl méně než 5 bodů.

Přílepek, Miroslav
Nemáááááám.

Ryba, Vítězslav
Také nemám.

Směšný, Roman
Nechci se opakovat, ale také nemám.

Sobotič, Zoltán
Opět bych se opakoval.

Veith, Miroslav
No, konečně na konec trošku originality:) Škoda, že jste to nedotáhl do konce. U třídy test byste asi potřeboval metodu na vrácení počtu bodů, ta tam chybí, na privátní proměnnou se nedá přistoupit z jiné třídy. Jinak mě potěšilo, že jste jediný, kdo udělal metodu pro přidání testu tak, že její parametr je opravdu objekt typu test. SUPER! A jinak líbí se mi, že jste zkoušel tu práci s iterátorem, akorát víte, v čem je problém? Že vy ten objekt test hned vracíte, return vám ukončí metodu a vrátí první test ze seznamu. Pokud byste ten kód s iterátorem použil šikovněji, máte prostředek pro procházení celou kolekcí a v těle cyklu while se staráte jen o získání dat z AKTUÁLNÍ pozice v seznamu a jejich zpracování. Když na to kouknete, tak možná i sám vidíte, že ten foreach je lehce elegantnější, s iterátorem se dá zase dělat více věcí.

Závěrem
Hlavní problém tedy byl v tom, že jste používali int pro výpočet aritmetického půměru a čísla to vracela zaokrouhlená. Další věc byly komentáře, které mnohdy chyběly. Občas trošku nevhodné pojmenovávání proměnných. Ale pro většinu z vás to byl první projekt, který jste zkoušeli a příště to snad bude lepší. Jo a spousta těch řešení byla vážně až nápadně podobná, ale tak to je vaše věc, cílem bylo zkusit si vlastní projekt a ne získat za něj nějaké body.

A pro vás ostatní, kteří jste mi ten projekt neodevzdali, vymyslím jiné zadání a nějaký projekt mi také odevzdáte. Jinak nevím, kolik z vás zkusilo aspoň ten program pustit a vyzkoušet na nějakých datech a nebo jste jenom vzali jedno řešení a hotovo. Nevadí, něco podobného zkusíme asi ještě jednou během semestru. Během dneška nebo zítřka se zde objeví ještě pár věcí, co budu chtít, abyste o nich měli přehled na příští seminář. Jinak pořád platí hlavní témata a to práce s kolekcemi, číselné proměnné a cykly. Plus se podívejte na algoritmy pro hledání maxima a minima v poli nebo seznamu, podrobné zadání bude v dalším postu.

Pozn.: Kdyby vás zajímalo, jaké nejjednodušší řešení stačilo udělat, můžete si z tohoto odkazu stáhnout moje řešení a prozkoumat ho.

Jinak budu rád za vaše poznámky, komentáře a připomínky, které tady zanecháte.

2 komentáře:

Anonymní řekl(a)...

Hmmmmmm, koukám že jsem to s tím iterátorem kapánek přehnal, proháněl jsem přes něj i obyčejné počítání na které stačilo seznam.size() :-/

No příště budem chytřejší ;-)

Existuje pro javu taky nějaký benchmark? Docela by mě zajímalo o kolik je iterátor pomalejší než elegantní .size()

charlie řekl(a)...

No, metoda size() je v dokumentaci;) Ale nevadí, u takhle malých seznamů to asi žádnej velkej rozdíl oproti iteraci cyklem nebude. Jestli si to ale opravdu chcete zkusit změřit, v třídě System je statická metoda currentTimeMillis() která vrací long - koukněte do dokumentace, měla by vracet počet milisekund od 1.1.1970. Dá se to využít tak, že načtete do jedné proměnné to co vrátí volání System.currentTimeMillis(), uděláte nějaký úkon, znovu někam uložíte currentTimeMillis() a uděláte z nich rozdíl. A ten rozdíl bude přibližně (!!!) doba běhu toho kódu mezi nimi. Je to takový nejschůdnější řešení. Benchmark pro Javu jsem žádnej nezkoušel, ale je možný že bude součásti debuggeru v nějakým IDE. Jestli najdu čas, zkusím se na to podívat.

Jinak jestli to zkusíte s tím currentTimeMillis(), docela by mě zajímalo jak moc velkej rozdíl v tom bude. I když osobně si myslim že bude zanedbatelnej. A hlavně - proč psát znovu něco co už je jednou napsaný, ne?:) Java je v tomhle oproti třeba C++ hodně výhodná, spousta věcí už je hotových a optimalizovaných, vy je prostě použijete a nestaráte se o to jak to funguje. Teď mě napadá třeba třídění seznamu - místo abyste se staral o algoritmy třídění a psal a ladil je, prostě jen zavoláte list.sort() a je to.