Autor Téma: Ako na to?  (Přečteno 10322 krát)

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 459
  • Karma: 20
    • Verze Delphi: D2007, XE3
Re:Ako na to?
« Odpověď #45 kdy: 22-05-2014, 08:08:05 »
kebyze je Standa moj sused, kupim 8 piv, sadneme k tomu na 4 hodiny a najdeme najoptimalnejsie riesenie (alebo aspon optimalnejsie riesenie), nerozdavam len bezcene rozumy, uz som pri paru projektoch takto asistoval, bohuzial dnes toho casu mam pomenej  :(

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1429
  • Karma: 34
    • Pepak.net
Re:Ako na to?
« Odpověď #46 kdy: 22-05-2014, 08:40:08 »
Grammar nazi alert: Optimální == Nejlepší. Optimálnější == Víc nejlepší. Nejoptimálnější == Nejvíc nejlepší.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4420
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #47 kdy: 22-05-2014, 08:47:31 »
Citace
Poznáš riešenie tzv. "cesty najľahšieho odporu" - jednoducho zatnem zuby a naprogramujem to tak, ako viem.
Už som to urobil 4x a nefunguje to na 100 % :'( A úprava mi to len zhorší!
Citace
To, čo chceš je pekné, ale do tohoto levelu si ešte nedospel
Ale to nie je dôvod sa o to nepokúsiť. Ináč by som stále robil "Hello World" :-* A toho času už nemám pred sebou až tak veľa  :(
Citace
Aj ked je pravda ze vyznam polimorfizmu som nikdy zo ziadnej knihy, clanku alebo serialu nepochopil. Pochopil som ho az v praxi pri praci na jednom projekte.  Ale zakonitosti som ovladal, len mi nebolo jasne na co to pre vsetkych svatych moze byt dobre
To vystihuje môj momentálny stav.
« Poslední změna: 22-05-2014, 08:49:56 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako na to?
« Odpověď #48 kdy: 22-05-2014, 10:16:00 »
Citace
Aj ked je pravda ze vyznam polimorfizmu som nikdy zo ziadnej knihy, clanku alebo serialu nepochopil. Pochopil som ho az v praxi pri praci na jednom projekte.  Ale zakonitosti som ovladal, len mi nebolo jasne na co to pre vsetkych svatych moze byt dobre
To vystihuje môj momentálny stav.
Na polymorfismu nic neni: predstav si, ze mas nekolik ruznych objektu, se kterymi vsemi chces delat nejake operace a ktere maji nejake spolecne vlastnosti.

Prvnim krokem je definovat ty spolecne operace a vlastnosti -> definovat rozhrani, ktere rika CO. Toto rozhrani lze vyjadrit  mj. abstraktni tridou, ktera bude spolecnym predkem tech vsech ruznych trid. A v kodu budes s temi ruznymi objekty manipulovat jen pomoci navrzeneho rozhrani  tj. pres cleny abstraktni tridy a nebudes zjistovat, s jakym konkretnim potomkem operujes - to je ti jedno (pokud bys to potreboval, tak to neni polymorfni a do navrhu se nejspis vloudila chybicka). A protoze vsichni potomci jsou assign compatible s predkem, tak jako  spolecny typ budes pouzivat tu abstraktni tridu.

U konkretnich trid (potomku) prekryjes abstraktni metody a tim reknes JAK. Tehoz se da dosahnout pomoci interfacu a jejich implementaci v jednotlivych tridach, ktere nemusi byt nutne ve stejne dedicke hierarchii, coz je dnes skoro preferovany zpusob, protoze jim lze docilit stejneho efektu jako vicenasobnou dedicnosti. Ale v Delphi jsou interface reference counted, takze by nekdy bylo asi treba vstoupit do jejich zivotniho cyklu a to by pro tebe byla nejspis dalsi komplikace).

No a kdyz uz dedis tridy, tak pouzijes spolecneho predka  s vyhodou k vycleneni spolecneho kodu do predka tj. do abtsraktni tridy. Hierarchie trid nemusi byt samozrejme jen dvouurovnova, jak jsem ti naznacil minule neabstraktnimi basalnimi tridami pro strom.
« Poslední změna: 22-05-2014, 10:59:02 od pf1957 »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako na to?
« Odpověď #49 kdy: 22-05-2014, 10:23:53 »
Grammar nazi alert: Optimální == Nejlepší. Optimálnější == Víc nejlepší. Nejoptimálnější == Nejvíc nejlepší.
Me se z toho taky jezi vousy, ale predstav si, ze jsem pred nejakou dobou poslouchal v radiu  nejakeho jazykozpytce, ktery tvrdil, ze z pohledu ceske syntaxe jsou tato slova vytvorena spravne a tudiz neni duvod to zavrhovat  :o

Offline hlucheucho

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
Re:Ako na to?
« Odpověď #50 kdy: 22-05-2014, 10:31:31 »
kebyze je Standa moj sused, kupim 8 piv, sadneme k tomu na 4 hodiny a najdeme najoptimalnejsie riesenie (alebo aspon optimalnejsie riesenie), nerozdavam len bezcene rozumy, uz som pri paru projektoch takto asistoval, bohuzial dnes toho casu mam pomenej  :(

že se to asi protáhne, chtělo by to celou basu piv.  :D

Nejoptimálnější - stupňování některých přídavných jmen je absurdní. Když je něco totálně v prdeli, tak už to totálněji (=víc )v prdeli být nemůže  :D

hu
« Poslední změna: 22-05-2014, 10:33:05 od hlucheucho »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4420
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #51 kdy: 22-05-2014, 10:39:33 »
Ďakujem. Ja to logicky chápem. Aj keď mám trocha problém, že potomka môžem pretypovať na predka. Ale napísal si to tak pekne, že by som sa mal pohnúť.
Citace
Preto to nerieš - uprav, čo ti funguje, a makaj na ďaľších projektoch.
Ja ich mám teraz tri (za chvíľu len dva) a vo všetkých chcem uplatniť to o čom debatujeme.
Citace
Tam získaš skúsenosti a ľavou zadnou poupravuješ staré projekty :)
Ja žiaden starý projekt nemám ;)
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako na to?
« Odpověď #52 kdy: 22-05-2014, 10:56:44 »
Aj keď mám trocha problém, že potomka môžem pretypovať na predka.
To neni pretypovani, ale kompatibilata typu pri prirazeni. Jinak pokud mas referenci na instanci nejake tridy, automaticky mas k dispozici vsechny public cleny vsech predku, uvnitr tridy jeste strict protected (na puvodni Delphi siditko protected bych zcela a navzdy zapomel). Ty muzes instanci jakehokoli potomka pouzit tam, kde se vyzaduje jako typ nejaky jeho predek s tim, ze mas k dispozici jen vlastnosti toho konkretniho predka.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1429
  • Karma: 34
    • Pepak.net
Re:Ako na to?
« Odpověď #53 kdy: 22-05-2014, 11:32:21 »
Asi takhle: Když budeš mít hierarchii Věc - Živá věc - Zvíře - Savec - Opice - Člověk - Franta Novák z Horní Dolní, a budeš mít definovanou vlastnost "Barva" u Věci, tak tě při zjišťování té barvy celkem nezajímá, jestli pracuješ s Frantou nebo z krokodýlem nebo s diamantem - všechno to jsou Věci a tudíž všechny mají vlastnosti definované pro Věci, takže i tu Barvu. Ale samozřejmě, kdybys chtěl pracovat s vlastnostmi specifickými pro člověka (třeba "Číslo občanského průkazu"), tak už potřebuješ, aby ten objekt, se kterým pracuješ, byl aspoň Člověk. Když to bude Franta, nevadí, Franta je Člověk, tudíž má všechny vlastnosti Člověka (včetně čísla OP), ale vadilo by, kdyby to byl valoun zlata - to není člověk, tudíž nemá vlastnosti člověka.

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 459
  • Karma: 20
    • Verze Delphi: D2007, XE3
Re:Ako na to?
« Odpověď #54 kdy: 22-05-2014, 23:56:40 »
chlapi, z vasich prispevkov som sa "najviac najlepsie" pobavil == najoptimalnejsie  ;D

Dam dalsi tip ako o trosku viac pochopit polymorfizmus. Poznas streamy? To su objekty pre zapis a citanie roznych dat prevazne do binarneho formatu. Predstav si ze si urobis funkciu ktora ulozi stav tvojho programu, alebo cokolvek co ma uzivatel rozrobene do streamu. Funkcia bude vyzerat nejako takto:

Kód: Delphi [Vybrat]
  1. funcition SaveMyWork(const aStream: TStream): Boolean;
  2. begin
  3.   aStream.Clear;
  4.   aStream.WriteInteger(daco);
  5.   aStream.WriteBoolean(dacoboolean);
  6.   ...
  7.   ...
  8.  

No a tuto funkciu mozes volat napriklad pri stlaceni tlacidla Save, alebo pri OnExit ako je lubo. A ta funkcia pouklada vsetko co chces do objektu aStream.

Objekt aStream je typu TStream. TStream sam o sebe je nepouzitelny hoci ma vsetky potrebne metody ako WriteInteger, WriteBoolean, ReadInteger, ReadBoolean, Seek, Position, Clear atd. atd. Lenze vsetky tieto metody su abstraktne, cize vlastne nefunkcne.

Cize ak by si pouzil toto tak dostanes vynimku, pretoze funkcia SaveMyWork zacne volat abstraktne metody objektu TStream.

Kód: Delphi [Vybrat]
  1. var
  2.   MyStream: TStream;
  3. begin
  4.   MyStream: TStream.Create;
  5.  
  6.   Result := SaveMyWork(MyStream);
  7.  

No a pointa je v tom ze existuje hafo dedicov objektu TStream (napr. TMemoryStream, TFileStream, atd, atd) ktore uz vsetky tie abstraktne metody WriteInteger, WriteBoolean, ReadInteger, ReadBoolean, Seek, Position, Clear atd. atd. implementuju podla svojho urcenia.

Cize ty potom mozes pouzit nasledovne:

Kód: Delphi [Vybrat]
  1. var
  2.   MyStream: TStream;
  3. begin
  4.   MyStream: TFileStream.Create; //Toto kompilatoru nevadi pretoze TFileStream je dedicom objektu TStream
  5.     alebo
  6.   MyStream: TMemoryStream.Create; //Toto kompilatoru nevadi pretoze TMemoryStream je dedicom objektu TStream
  7.     alebo dalsie
  8.  
  9.   Result := SaveMyWork(MyStream);
  10.  

No a hlavny prinos polymorfizmu je v tom ze ta uboha funkcia SaveMyWork vo svojej podstate vobec nemusi vediet kam tie data uklada, ona pouziva metody deklarovane v objekte TStream a uz netusi kam dalej data prudia. Existuju aj divokejsi dedicovia ako TEncryptedStream, TXMLStream - data sa ukladaju do XML suboru. Dokonca to moze byt aj TTCPStream, takze nakoniec data sa ani nebudu ukladat na lokalny pocitac a budu putovat do sveta a o tom ako som povedal ta funkcia SaveMyWork naozaj nic nevie. Ak by sa niekto chcel vysantit, moze napisat TSerialStream, data pojdu na seriovku, alebo TFTPStream, data sa ulozia dakde na FTPecko. Uzasne nie, len niekedy je to radost ladit ;)

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 459
  • Karma: 20
    • Verze Delphi: D2007, XE3
Re:Ako na to?
« Odpověď #55 kdy: 23-05-2014, 00:21:32 »
mozno ze som mame vypadol z ruk ked ma porodila ale pre mna slovo optimalne=vhodne, preto sklonujem najoptimalnejsie ako najvhodnejsie, ale nic si z toho nerobte, mam aj ine defekty osobnosti :P

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4420
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #56 kdy: 23-05-2014, 08:40:55 »
Vďaka za námahu. Ale to už logicky mám v hlave. Aj sa mi viac vyjasnilo, keď som si včera opäť prečítal Marca Cantu D6. Mám problém sa realizáciou = kompletne si riešenie predstaviť. Doslovne vizualizovať. Mám technické myslenie a bez vizualizácie nedám ani čiarku.

Nejakú predstavu mám. Skúsim ju realizovať a určite sa ozvem. Dovtedy netreba reagovať. Námetov/návodov ste mi dali dosť.

A čo tak slovo najsamlepšejšie?

To Daniel: nie si náhodou z KE, PO či okolia? Určite to bude BA :D
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline hlucheucho

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
Re:Ako na to?
« Odpověď #57 kdy: 23-05-2014, 09:21:42 »
A čo tak slovo najsamlepšejšie?

Nový jazykolam?

hu

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 459
  • Karma: 20
    • Verze Delphi: D2007, XE3
Re:Ako na to?
« Odpověď #58 kdy: 23-05-2014, 10:10:02 »
nahodou som z KE  8) , inac rodeny presovcan, takze dame pivko? A technika "najsamlepšejšieho" programovania je mi vseobecne znama  ;D horsie uz je ju dosiahnut  :o
« Poslední změna: 23-05-2014, 10:41:50 od Daniel_Andrascik »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4420
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #59 kdy: 23-05-2014, 13:17:26 »
Tak som si to zhrnul a vychádza mi nasledovné:

0) TAbstractNodeClass
  - Všetko abstraktné metódy, ktoré budú vyžadované vo všetkých potomkoch

1) TTree1..2BasalNodeClass - možno postačí len jeden
  Všetko čo sa vzťahuje na
    - kontrétny strom a
    - všetky uzly, bez výnimky

2) TTree1..2Node1..2Class
  Všetky veci typické len pre daný uzol
    - údaje
   
3) Getter - ktorý vráti očakávaný "uzol" Node.Object pretypovaný na TAbstractNodeClass
  Vyvolá sa pri
    - zmene uzla
    - zmene stromu. Aj pri kliknutí mimo uzla - do prázdna
    - zmene TabSheet, alebo
    nejakej obecnej udalosti formulára. Musia byť zohľadnené vstupy z myši AJ z klávesnice
 
4) SwitchPage
  Zaistí
    - zobranenie správnej strany (TJvStandardPage)
    - nastavenie Parent

5) + si niekde zaistím zapamätanie si focused tree pre každý TabSheet

Môže byť? Neušlo mi niečo? Či som niečo nepochopil?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.