• Welcome to TUKE FÓRUM - Fórum pre študentov Technickej Univerzity v Košiciach.
 

OOP

Started by NDK, 22.09.2011, 21:02:52

« predchdzajce - alie »

mirek

Quote from: Stardox on  23.11.2011, 21:03:12
Hmmm, nam cviciaci tiez hovoril ze cez Tool->RunPMD staci. Nevadi, nic sa zatial nedeje, opytam sa na cviceni, ze co povie cviciaci a vyriesi sa to.  :)
nas cviciaci upozoronoval, ze s PMD pluginom nemaju dobru skusenost. tusim spominal nieco v style, ze ignoruje podhodeny ruleset a pouziva zrejme nejaky defaultny. preto sa vam asi prejavuje aj problem s pravidlom o pocte returnov z metody. existuje vraj este plugin easypmd2, ale vraj ho este neskusali. tak vyskusajte a podelte sa ;)
So say we all!

luko

Quote from: mirek on  24.11.2011, 15:59:03
nas cviciaci upozoronoval, ze s PMD pluginom nemaju dobru skusenost. tusim spominal nieco v style, ze ignoruje podhodeny ruleset a pouziva zrejme nejaky defaultny. preto sa vam asi prejavuje aj problem s pravidlom o pocte returnov z metody. existuje vraj este plugin easypmd2, ale vraj ho este neskusali. tak vyskusajte a podelte sa ;)
zaujimalo by ma kto Vas uci :D

mirek

Quote from: luko on  24.11.2011, 18:36:49
Quote from: mirek on  24.11.2011, 15:59:03
nas cviciaci upozoronoval, ze s PMD pluginom nemaju dobru skusenost. tusim spominal nieco v style, ze ignoruje podhodeny ruleset a pouziva zrejme nejaky defaultny. preto sa vam asi prejavuje aj problem s pravidlom o pocte returnov z metody. existuje vraj este plugin easypmd2, ale vraj ho este neskusali. tak vyskusajte a podelte sa ;)
zaujimalo by ma kto Vas uci :D

mojim ucitelom je majster yoda :-P
So say we all!

milaninho

Quote from: mirek on  25.11.2011, 00:09:53
Quote from: luko on  24.11.2011, 18:36:49
Quote from: mirek on  24.11.2011, 15:59:03
nas cviciaci upozoronoval, ze s PMD pluginom nemaju dobru skusenost. tusim spominal nieco v style, ze ignoruje podhodeny ruleset a pouziva zrejme nejaky defaultny. preto sa vam asi prejavuje aj problem s pravidlom o pocte returnov z metody. existuje vraj este plugin easypmd2, ale vraj ho este neskusali. tak vyskusajte a podelte sa ;)
zaujimalo by ma kto Vas uci :D

mojim ucitelom je majster yoda :-P

,,Velmi temná druhá strana je."
,,Drž hubu Yodo a sněz si svůj toast, jako všichni ostatní!"

MartinK

Ahojte,
znova touto cestou by som chcel oznamit, ze cvicenia v Pondelok o 7:30 sa nebudem moct zucastnit, ostatne cvicenia v dany den sa uskutocnia bez zmeny.

Pozrel som obsah 10. cvicenia ktore sme mali preberat, tak nemal by to byt problem naprogramovat aj doma, vsetko potrebne sa uz prebralo. Jedine pri bode 4, pre inspiraciu, odporucam sa pozriet na  operator "instanceof">>>
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

Pripadne nezrovnalosti ktore ste doma nezvladli si preberieme na nasledujucom cviceni.

Martin Kapa

milaninho

ak chcete rozsirovat rozhrania ktore su dane v zadani, nezasahujte do samotnej kniznice, mozte si vytvorit vlastne rozhrania, ktore budu implementovat tieto dane (tzn. ze tam budu mat to co sa od vas chce na zadani), plus do nich si mozete pridat nove metody (ak vam napr nestaci Room.show(UserInterface), tak si vytvorite nove rozhranie a pridate si tam metodu aku chcete, napr. aj Room.show(UserInterface ui, VlastnyParameter p)).

Agamemnon

Quote from: milaninho on  25.11.2011, 21:19:35
ak chcete rozsirovat rozhrania ktore su dane v zadani, nezasahujte do samotnej kniznice, mozte si vytvorit vlastne rozhrania, ktore budu implementovat tieto dane (tzn. ze tam budu mat to co sa od vas chce na zadani), plus do nich si mozete pridat nove metody (ak vam napr nestaci Room.show(UserInterface), tak si vytvorite nove rozhranie a pridate si tam metodu aku chcete, napr. aj Room.show(UserInterface ui, VlastnyParameter p)).

ostava nutnost pretypovania
All code is crap.

42

orsi

naco vlastne su tie rozhrania?  ???  8)
tvoria kostru programu ako tie naše rozhrania co musime implementovať povinne. aby sme neprogramovali odbukadobuka ale aspon podobne. takto tomu ja rozumiem. ale este je tu nejaky iny dvovod? (citim ze hej  :D )
a este k dedeniu. funguje to takto? Nadtrieda(nie je abstract, ale obycajna)->1.odvodena trieda (obsahuje extends nadtrieda)->2.odvodena(obsahuje extends 1.odvodena, bude mozne pouzit metody z 1.odvodenej a aj z nadtriedy?? a samozrejme spravit nove metody)
moze sa to tak spravit? ako na viacnasobne dedenie?
je tu nejaka študovaná hlava co by mi to vedela vysvetliť ak sa mylim?  ;D ale ľudsky vysvetliť, nie ako binas ze mi povie nejaku poucku z "velkej encyklopedie OOP" co tomu nerozumiem ani pol slova!

Agamemnon

#308
dedenie:
- viacnásobné: java nepodporuje (c# tiež nie) - jedna z možností, ako to obísť je práve cez rozhrania - jedna trieda môže implementovať viacero rozhraní
- áno, hierarchia dedenia môže byť viacúrovňová... potomok potom pozná všetky metódy od všetkých predkov... (všetky okrem poslednej môžu byť abstraktné, ale nemusí byť žiadna)
All code is crap.

42

Agamemnon

rozhrania:
- jedna trieda môže implementovať viacero rozhraní... rozhranie môže implementovať iné rozhranie (vznikne hierarchia rozhraní - trieda, ktorá implementuje to rozhranie, musí implementovať metódy zo všetkých rozhraní v hierarchii)
- určujú povinné metódy v triede
All code is crap.

42

Agamemnon

#310
okej, teraz to praktické využitie... hehe :) to bude ťažšie trochu, ak ťa nebudem chcieť popliesť ďalšími divnými vecami :)

najdôležitejšia vec je tu polymorfizmus - ak dáš rozhranie ako parameter nejakej metódy, tak objekt akejkoľvek triedy, ktorá to rozhranie implementuje, môže do tej metódy ísť ako parameter... rôzne výhody: napr. dokážeš zmeniť algoritmus za behu - napr. na základe nejakého testu (if-u) a implementácia bude stále čitateľná (a samotný algoritmus bude bez if-ov)... alebo napr. naloaduješ za behu triedu, ktorá implementuje rozhranie, z nejakej knižnice, ktorú napr. nepoznáš (plug-in) a potom môžeš túto triedu používať, pretože vieš, že určite bude obsahovať metódy, ktoré to rozhranie definuje (a nepotrebuješ poznať implementáciu, alebo ostatné metódy v tej triede, etc)...

príkladom by mohlo byť napr. rozhranie IUseable v adventúre... máš to rozhranie a máš predmety, ktoré ho implementujú... ak predmet (trieda) to rozhranie implementuje, tak potom vieš, že sa dá taký predmet použiť (a vieš, podľa rozhrania, že má metódu "use")... a môžeš taký predmet použiť v príkazu "použi"...

hmm, napr. niečo takéto:

interface IUseable {
  void use();
}

class Door implements IUseable {
  public void use() {
    // urobí niečo konkrétne pre dvere
  }
}

class Window implements IUseable {
  public void use() {
    // urobí niečo konkrétne pre okno
  }
}

class Pouzi {
  public void execute(string name) {
    IUseable item = items.getUseableItem(name);
    // tu napr. nepotrebuješ poznať konkrétny typ toho objektu, stačí ti vedieť, že implementuje rozhranie IUseable... a vieš, že potom má metódu "use"... o to, čo konkrétne má predmet urobí, sa už postará kód v tej metóde use() v správnej triede...
    if (item != null) item.use();
    else throw new InvalidOperationException("tento predmet sa nedá použiť...");
  }
}


keby si tam rozhranie nepoužil, tak by si potreboval niečo takéto (v tej poslednej metóde execute):

public void execute(string name) {
  Item item = items.getItem(name);
  if (item instanceof Door) {
    ((Door) item).use();
  }
  else if (item instanceof Window) {
    ((Window) item).use();
  }
  else {
    throw new InvalidOperationException("tento predmet sa nedá použiť...");
  }
}

pre každý predmet vlastný if, vlastné pretypovanie, etc a mal by si množstvo riadkov :)


dá sa to pochopiť? :)

ak nie, kľudne sa pýtaj... konkrétnejšie otázky, ako si to ty predstavuješ, čo presne ti nie je jasné (napr na tom príklade), etc... budem odpovedať... :)

btw, sorry, ak sú chyby (napr. instanceof si nie som istý, či sa tak zapisuje) v tom príklade - javu nepoužívam...
All code is crap.

42

Agamemnon

#311
okej, alebo možno ešte jeden príklad...

máš nejaký výpočet... a to, ako sa výsledok vypočíta, závisí od nejakej hodnoty...

napr. chceš určiť množstvo vody vo vedre... a vieš, že vedro jednej farby má iný objem ako vedrom inej farby... tak to vieš urobiť cez rozhrania (sorry za takýto príklad, ale už je jedna po polnoci... :D)

interface IBucket {
  double getVolume();
  double getHeight();
  double getWeight();
}

class BlueBucket implements IBucket {
  public double getVolume() { return 2; }
  public double getHeight() { return 0,3; }
  public double getWeigth() { return 1; }
}

class RedBucket implements IBucket {
  public double getVolume() { return 5; }
  public double getHeight() { return 0,7; }
  public double getWeigth() { return 4; }
}

// ďalšie vedrá...

class Algorithm {
  IBucket bucket;
  // premenná je typu IBucket, čím hovoríme, že tam môžu byť rôzne vedrá...

  public void prepare() {
    print("Ake mas vedro (1 - modre, 2 - cervene, ..., 0 - koniec)?");
    int vedro = read();
    switch (vedro) {
      case 1:
        bucket = new BlueBucket();
        break;
      case 2:
        bucket = new RedBucket();
        break;
      ...
    }
  }

  public void calculate() {
    // bla bla... výpočet... bla bla...
    // len tu jednoducho zavoláš tie metódy z rozhrania, lebo vieš, že každé vedro ich implementuje a nezaujíma ťa, že ako, len ťa zaujíma ich výsledok... java správne zvolí, ktorú metódu má zavolať podľa toho, ako si inicializoval premennú bucket...
    print("tvoje vedro má objem " + bucket.getVolume() + " L, výšku " + bucket.getHeight() + "m a váhu " + bucket.getWeight() + "kg.");
  } 

  public void calculateSomethingElse() {
    // opät to môžeš len jednoducho zavolať metódy rozhrania IBucket - keďže premenná je toho typu a triedy implementujú to rozhranie...
    print("súčet všetkých hodnôt je: " + (bucket.getVolume() + bucket.getHeight() + bucket.getWeight()));
  }

  public void calculate3() {
    // a znovu rovnaký princíp požitia... :)
  }
}


okej, primitívnosť v tomto prípade, a asi by to bolo menej písania urobiť cez if priamo vo výpočte (a nie ako je teraz, pri inicializácií)... a teraz si predstav, že máš napr. 15 vedier :) a nejaký zložitý výpočet... prípadne ešte viac rôznych výpočtov... potom by si tých ifov potreboval veľa v mieste každého výpočtu - v každom ife výpočet znovu a znovu, etc... viac kódu, väčšia šanca na chybu, etc... :)

print a read si nevšímaj :) vm, že zápis je iný, ale nechcelo sa mi to hľadať teraz.... myslím, že je jasné, čo som tým chcel povedať :)
opäť neručím za ďalšie chyby so zápisom, keďže javu nepoužívam :)
All code is crap.

42

veynom

chcel by som vediet, ci mozem este zmenit nieco v scenari a poslat to znova cviciacemu

Eriik

mám menšiu otázku .. v metóde startNewGame() vytvorím nový batoh a zavolám metódu createRooms, ktorá vytvori miestnosti aj s názvami, opismi atď... pomôže niečo keď potom v metóde startNewGame() zavolám metódu System.gc() ? (tá by mala spustiť GC) alebo je to zbytočné ?

Agamemnon

Quote from: veynom on  26.11.2011, 17:47:58
chcel by som vediet, ci mozem este zmenit nieco v scenari a poslat to znova cviciacemu

malé zmeny v scenári robiť môžeš... ak chceš prerobiť celý scenár, tak nie...
All code is crap.

42

Agamemnon

Quote from: Eriik on  26.11.2011, 20:03:56
mám menšiu otázku .. v metóde startNewGame() vytvorím nový batoh a zavolám metódu createRooms, ktorá vytvori miestnosti aj s názvami, opismi atď... pomôže niečo keď potom v metóde startNewGame() zavolám metódu System.gc() ? (tá by mala spustiť GC) alebo je to zbytočné ?

vytvoríš nejaké veci, na ktoré stále máš referenciu a ktoré sa chystáš používať...
načo potrebuješ volať gc, ak si nič nezrušil... resp. takto explicitne volať gc, to fakt potrebuješ zvláštnu situáciu... nerob to :)
All code is crap.

42

milaninho

Quote from: veynom on  26.11.2011, 17:47:58
chcel by som vediet, ci mozem este zmenit nieco v scenari a poslat to znova cviciacemu

posli a uvidis ako zareaguje cviciaci :)

esperian

#317
ako mam spravit to, ze jeden predmet sa moze dat aj preniest aj pouzit?? cize musi implementovat aj Useable aj Moveable ?

cize malo by to vyzerat nejako takto public class Kluc extends AbstractItem implements Useable implements Moveable

edit akurat ma napadlo, ze co tak vytvorit novy Interface a tam nejako spojit to useable a moveable ? hm ?

veynom

Quote from: milaninho on  27.11.2011, 03:57:17
Quote from: veynom on  26.11.2011, 17:47:58
chcel by som vediet, ci mozem este zmenit nieco v scenari a poslat to znova cviciacemu

posli a uvidis ako zareaguje cviciaci :)

neodpisal mi este >:(

Agamemnon

Quote from: esperian on  27.11.2011, 16:50:30
ako mam spravit to, ze jeden predmet sa moze dat aj preniest aj pouzit?? cize musi implementovat aj Useable aj Moveable ?

cize malo by to vyzerat nejako takto public class Kluc extends AbstractItem implements Useable implements Moveable

edit akurat ma napadlo, ze co tak vytvorit novy Interface a tam nejako spojit to useable a moveable ? hm ?

áno, môžeš vytvoriť interface, kde spojíš Useable a Moveable, ale zbytočne - hlavne, ak nebude pridávať nič nové...

radšej priamo nech tá trieda implementuje obe rozhrania:
len sa to zapisuje cez čiarku a kľúčové slovo implements sa použije len raz...

public class Kluc extends AbstractItem implements Useable, Moveable
All code is crap.

42

esperian

no super diky moc , skusal som nejake moznosti ale tuto nie  :D :D :D dik

Daron

Ak este niekto nema zadanie, napiste mi PM, mam zadanie z minuleho roka, 15€ so vsetkym. Nebudem to pisat sem, aby vas potom mirek nedojebabral, ze to mate kupene :-)

xxx3

a potom zhoda 100%, nie ? :D

luko

navody k cviceniam sa trosku zmenili;)

esperian

Quote from: MartinK on  25.11.2011, 02:11:47
Ahojte,
znova touto cestou by som chcel oznamit, ze cvicenia v Pondelok o 7:30 sa nebudem moct zucastnit, ostatne cvicenia v dany den sa uskutocnia bez zmeny.

Pozrel som obsah 10. cvicenia ktore sme mali preberat, tak nemal by to byt problem naprogramovat aj doma, vsetko potrebne sa uz prebralo. Jedine pri bode 4, pre inspiraciu, odporucam sa pozriet na  operator "instanceof">>>
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

Pripadne nezrovnalosti ktore ste doma nezvladli si preberieme na nasledujucom cviceni.

Martin Kapa

dufam ze na tomto tu sa nezmenilo nic ?! ci ? ;D