Diskuze: Machr na Javu - Objektová textovka
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Vlastník

Zobrazeno 50 zpráv z 75.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Ještě soutěž připomenu Samik11, Drahomír Hanákovi (i když ten
teď asi pracuje) a byl bych docela zvědavý na Kita
Nápad je jak udělat objektovou strukturu Hra by měla omět menit lokace a
sbírat a používat předměty pomocí příkazů.
ok, škoda chtěl jsem udělat něco na bázi pokemonů...
Na tuhle kategorii jsem se zrovna těšil, ale bohužel se nemůžu teď
zúčastnit. Tak alespoň doufám, že se tu objeví spousta kvalitního kódu a
snad budu mít příště čas
Java je univerzální a moderní jazyk, hodí se téměř na vše. Navíc podporuje syntaxi céčka, takže kdybys to dělal třeba v něm neobjektově, v Javě to bude úplně stejné. Tvůj argument tedy nechápu. My si tu trénujeme objektové myšlení na jednoduchých úlohách, abychom dobře zvládali ty složité.
Docela by mě zajímalo tvé provedení z hlediska dodržování základních
objektových principů, používání návrhových vzorů a obecně architektury
takové hry. Nechceš se zapojit?
Proč se vybrala Java je uvedeno hned na začátku úvodního příspěvku
Klidne
(btw pro me to proste neni dostatecnej duvod, protoze me C++ naucilo objektovy
navrh daleko lepe, nez java)
Proč je soutěž v Javě je napsané hned v prvním příspěvku, je dobrý nápad si přečíst alespoň ten než se zapojíš do diskuze. Céčková syntaxe není o pointerech, mnoho jazyku ji poskytuje a pointery nemá. Těším se na tvůj návrh, když tě C++ tak dobře naučilo objektově programovat.
Také jsem na sebe zvědavý. Nedávno jsem si něco podobného udělal v
Javascriptu. Mělo to asi 8 místností a dalo se mezi nimi chodit klikáním.
Víc to však neumělo. Celé jsem to měl nacpáno do jednoho souboru
.html
.
V C++ se objektově téměř nedá programovat. Vždyť je i problém poslat objekt přes return, aby se náhodou nezapomnělo ten objekt uvolnit a nevznikl memory leak. Nedovedu si představit, jak bych v tom dělal Dependency Injection. Možná přes nějaký framework?
Za tímhle účelem se v C++ objekt uvnitř funkce nevytváří dynamicky, ale deklaruje se na stacku a při vrácení se kopíruje, přičemž si můžeš přesně nastavit jak. Pokud je to v daný situaci moc neefektivní, pak si buď musíš dávat pozor anebo pokud se to využívá častěji, napsat si nějakou třídu pro inteligentní pointer, kterej paměť při skončení platnosti sám dealokuje, ve standardních knihovnách C++ už něco takovýho existuje. Já osobně se vyhýbam vracení objektů vytvořených uvnitř funkcí, pokud by byly potřeba vytvořit dynamicky, vždycky vytvářim objekt na nejvyšší urovni kde se používá (většinou main) a pak předávam parametrem.
To je přesně ono. V Javě i v PHP vracím nově vytvořené objekty returnem systematicky. Výsledkem každé metody je objekt. Mám změřeno, že je to i nejrychlejší způsob předávání výsledku.
(Odpověď na 26.02.2013 09:19, hapruje mi tu internet)
Větší kontrola nad kódem (ale i větší odpovědnost), přece nijak nesouvisí s tím, jak dobře se dá v něčem programovat objektově.
Uvolňování paměti by se mělo ideálně dít na té úrovni, na které byl objekt vytvořen.
S pamětí není problém ani když se na objekt odkazuje ze spousty míst a
programátor přesně neví, kdy přesně se paměť má uvolnit, tohle se
většinou řeší tím, že si objekt u sebe sám udržuje, kolik odkazů na
něj existuje - samozřejmě programátor při vytváření / ničení ukazatele
na tento objekt na to musí pamatovat a volat příslušné funkce.
Pokud zavolá snížení počtu odkazů a počet klesne na nulu, tak v tu
chvíli objekt sám zavolá destruktor, protože už na něj nikdo neukazuje, je
to vlastně takový poloautomatický prapředek garbage collectoru .
Na podobnym principu funguje ten inteligentní pointer, až na to že ten si ty funkce volá sám. Tam si ale zase musíš dávat pozor, když z něj adresu předáváš klasickýmu pointeru.
"Uvolňování paměti by se mělo ideálně dít na té úrovni, na které byl objekt vytvořen."
To platí možná v C++, ale není možné to zobecňovat na celé OOP. Použil jsi v C++ nadstavbu, která je v Javě a C# již součástí jazyka. OOP v C++ mi pořád připadá jako nějaký přílepek, se kterým se původně moc nepočítalo.
V OOP metoda objektu běžně vytváří jiný objekt a returnem ho předá volajícímu. Jak jinak bych mohl udělat třeba Factory?
Se stejnou odvahou mohu zařadit do OOP i Lisp, ve kterém se dá programovat v podstatě jakkoli, tedy i objektově.
taky bych se zapojil, ale ještě pořád nemám noťas
Ano, myslel jsem to hlavně pro jazyky, kde se o paměť stará programátor a ne pro GC nebo podobné mechanismy, které fungují úplně jinak.
Factory v C++ uděláš tak, jak jsem popisoval - normálně na haldě
vytvoříš objekt, na něj si vrátíš ukazatel a jen si hlídáš ty počty
ukazatelů na něj, případně to můžeš celé řešit i přes smart
pointery, které tohle dělají za tebe ještě zautomatizovaněji.
V tomhle případě pak samozřejmě objekt může být zničen i na jiné
úrovni, než kde byl vytvořen.
Lisp vůbec neznám, netuším, jak to má s podporou objektů.
Lisp je strašně mnohotvárný, proto se v něm objekty dají dělat jakkoli. Prototypově i prostřednictvím tříd, kombinovaně nebo úplně jinak.
C++ byl první C-based jazyk kterej obsahoval základy OOP, ze začátku toho kromě nějakých základů tříd neuměl o moc víc než C. Dál se v něm třídy vyvíjely poněkud jinym směrem. Třídy v C++ nejsou dělaný tak, aby se v něm pohodlně programovalo objektově, ale tak, aby programátor mohl vytvářet datový typy se kterýma je možno zacházet co nejvíce stejně jako se základními typy, tedy co nejpřirozeněji. V C++ se objektově programovat dá (vždyť Java i C# z něj vychází), jen u toho programátor musí řešit věci spojený s tím, že je to víc low-level jazyk, a ne vždy je to v něm nejlepší a nejpohodlnější řešení, obzvlášť pokud je potřeba programovat efektivně. Jak už jsem tu ale psal jednou v jiný diskusi, podle mě má C++ mnohem propracovanější třídy a práci s nima než Java a C# dohromady.
Vis, ono v C++ to chce taky obcas premejslet nad tim, co ti ta funkce vrati a
ne jenom tam placnout objekt, nekdy se ti hodi pointer, nekdy reference a nekdy
objekt samotny, popr. to vyresit jinak.
Java se ti o vsechno postara sama, ale efektivita je ta tam...
Slušně tě žádám, pokud se nechceš soutěže účastnit, tak to tu nerozmazávej, programuj si třeba v děrných štítkách, nám je to jedno. Tohle je soutěž v Javě, zbytečně to tu znečišťuješ offtopic diskuzí. Děkuji.
O efektivitě Javy toho bylo napsáno hodně. Java je efektivní, jen se v ní nesmí programovat jako v Céčku. V tu chvíli se z ní stane líný moloch.
já to vidím jednoduše, napište program v C#, pak stačí jen nakopírovat
soubory do fazolového editoru, u děičkosti místo : se narve extends, jména
vlasností tříd přidělat na malé počáteční písmenko, u metod to samé,
napráskat tam hrůůzostrašné get-set metody a je prakticky hotovo a ještě možná string na String
a to je tak vše důležité
bohužel je tak soutěž zadána, jen jsme naznačil že převod mezi těmito jazyky není příliš obtížný
Převod není obtížný. Jen těmi primitivními settery a gettery, které se v C# používají tak často, se v Javě musí trochu šetřit, aby to nebylo líné. Reagoval jsem jen na ty "hrůůzostrašné get-set metody", které v Javě být nemusí, když se program napíše správně.
C# zavedl gettery a settery jako syntaktický cukr, který se bohužel velmi
často zneužívá v podobě get; set;
. Vypadá to elegantně, ale
velmi často to správně není. Je zbytečné tento nešvar přenášet do
Javy. Možná proto v ní tento syntaktický cukr není.
V Javě je to úplně stejné jako v C#. Co jde ven je getter/setter, i rychlostně to vychází stejně, vždyť jsi to tenkrát měřil.
Měl jsem na mysli, že v C# se getter/setter zapisuje jako přetížené přiřazení. Na jednu stranu je to příjemné, na druhou stranu pak objekt mívá příliš mnoho rozhraní a z toho pramení nízká uzavřenost objektu. Objekty se pak používají jen jako pouhá datová skladiště a to je špatně. Při přepisu takového špatného návrhu vznikají v Javě zmíněné "hrůůzostrašné get-set metody".
V některých případech to skutečně výkonově vyjde nastejno, protože kompilátor dělá optimalizaci. Vždycky se mu to však nepodaří. O výkon však jde až na druhém místě. Pokud chceme dělat OOP, nelze zasílání zpráv vždy degradovat na přiřazení do lokální proměnné objektu nebo vyzvednutí její hodnoty.
Chápu jak to myslíš, ale bohužel se to dělá v praxi opravdu tak, že se vygeneruje tuna getterů/setterů, dělá to většinou IDE.
Bohužel nevhodně navržené IDE svádí k chybným programátorským návykům. programátoři si pak naivně myslí, že provozují OOP.
Nedávno jsem našel zajímavou knihu "Myslíme v jazyku Java", ve které je podle mne velmi dobře zpracováno OOP nejen pro Javu. Na rozdíl od jiných učebnic začíná s objekty a rozhraním. Teprve pak jde na kolekce, algoritmy a datové typy.
Tak přidávám svůj pokus. Za chyby se omlouvám, ať už jde o funkčnost
nebo špatně zvolený návrh. Podstatné je přece zúčastnit se.
Ahoj, šla by uzávěrka prosím ještě trochu posunout? Rád bych se
zúčastnil, ale na počítač jsem se dostal až dneska.
PS: většinu textové hry už jsem dneska udělal, tak by bylo škoda, kdybych
to dělal nanic.
Zobrazeno 50 zpráv z 75.